web-dev-qa-db-fra.com

Prise en charge officielle de la «bibliothèque Boost» pour Android et iOS?

Cette question fait suite à Dois-je choisir Boost Asio ou Aysnc Socket threads dans Android? demandé,

Les bibliothèques Boost sont censées être largement utiles et utilisables dans une large gamme d'applications, mais il n'y a pas encore de support officiel disponible pour Android et iOS

  1. Y a-t-il une raison spécifique derrière la même chose comme Non optimisé pour les appareils intégrés? Ou pour toute autre raison?
  2. Un organisme connaît-il une application créée à l'aide de Boost sur Android ou iOS?
  3. Est-il conseillé d'utiliser des bibliothèques boost pour les applications réseau intensives qui génèrent plusieurs threads pour la communication?

Pour info .. J'ai utilisé les liens suivants pour créer un exemple Android, mais pas encore réussi :(

https://github.com/MysticTreeGames/Boost-for-Android

http://www.codexperiments.com/Android/2011/05/tips-tricks-building-boost-with-ndk-r5/

Inclure la bibliothèque Boost C++ dans Android

Comment utiliser la bibliothèque boost (y compris shared_ptr) avec le Android NDK et STLport

https://sites.google.com/site/fourdollars/Android/android-mk

https://groups.google.com/forum/?fromgroups=#!topic/Android-ndk/4lxhsKFe7Ho

http://www.crystax.net/trac/ndk/ticket/6

Android NDK R5 et support de l'exception C++

Merci d'avance.

50
RDX

Réponse de la communauté boost Oui. Ces plateformes ne sont pas officiellement prises en charge car personne ne s'est porté volontaire pour effectuer régulièrement des tests de régression à leur place.

Il n'est pas possible pour un développeur Boost de tester sur toutes les plateformes. Les développeurs dépendent donc des résultats des tests de régression effectués par des bénévoles. Par exemple, voir http://beta.boost.org/development/tests/trunk/developer/summary.html

Si personne ne se porte volontaire pour exécuter les tests pour une plate-forme particulière, cette plate-forme n'est pas officiellement prise en charge.

Donc, si vous vous souciez de Android ou iOS devenant officiellement pris en charge, commencez à exécuter des tests de régression réguliers (de préférence quotidiennement) pour Boost. Voir http://beta.boost.org/development/ running_regression_tests.html

24
RDX

Consultez mon tutoriel multiplateforme sur github. Il vous montre comment configurer Boost et l'utiliser entre iOS et Android. J'ai eu un temps si horrible avec ça, je pense que je le documenterais donc personne d'autre n'aurait à le comprendre. Vous remarquerez que ce projet intègre également plusieurs autres éléments communs utilisés entre les deux plates-formes, par exemple, CoreFoundation et SQLite.

https://github.com/markshiz/cross-platform-tutorial

Remarque: Mon tutoriel ne montre pas comment créer les bibliothèques compilées pour boost. Je l'ai déjà fait avec succès en utilisant les instructions que vous avez fournies:

http://www.codexperiments.com/Android/2011/05/tips-tricks-building-boost-with-ndk-r5/

Une fois que vous avez une bibliothèque statique compilée par la chaîne d'outils Android, vous pouvez facilement la lier via un module similaire à ceux sous include/[NAME OF NEW SUBMODULE] répertoire du projet ci-dessus. Utilisez quelque chose de semblable au suivant pour le Android.mk fichier à la racine de ce répertoire.

include $(CLEAR_VARS)
LOCAL_MODULE:= boost_regex
LOCAL_SRC_FILES:= ./path/to/built/static/library/libboost_regex-gcc-mt-s.a
LOCAL_EXPORT_C_INCLUDES := ./path/to/the/directory/that/has/the/boost/headers
include $(PREBUILT_STATIC_LIBRARY)

Enfin, importez ce module, comme dans l'exemple, à l'intérieur

$(call import-module,[NAME OF NEW SUBMODULE])

En ce qui concerne vos autres questions - connaissez-vous une application qui utilise Boost sur iOS et Android? Oui, je l'ai fait plusieurs fois avec succès et j'ai publié des applications de travail sur les App Stores.

Votre autre question, est-il conseillé d'utiliser boost pour la communication réseau? Je ne sais pas ce que tu veux dire ici. Sous quel angle? Voulez-vous dire, philosophiquement, techniquement, etc.?

D'un point de vue philosophique, vous devez vous demander quel est votre raisonnement pour importer cette bibliothèque et l'utiliser entre Android et iOS. Est-ce pour gagner du temps sur le code, la charge de maintenance. Si oui, je dirais c'est un excellent moyen de le faire. De toute évidence, il y a des obstacles et des difficultés à faire fonctionner ce type de configuration. De plus, les fonctionnalités IDE pour C++ ne sont pas aussi impressionnantes que pour = Java dans Eclipse. J'essaie d'être juste et équilibré dans la présentation PDF dans la doc/ répertoire. Donnez-le une fois de plus.

D'un point de vue technique, je pense que la seule chose qui m'inquiéterait serait de s'assurer que je nettoie correctement les objets Asio lorsque l'activité est arrêtée. Si vous devez faire des choses en arrière-plan, utilisez plutôt un service:

http://developer.Android.com/reference/Android/app/Service.html

15
markshiz

MISE À JOUR: Il semble y avoir un problème avec std :: atomic sur Android, et puisque Boost.Asio l'utilise (par défaut), combiné avec des threads , on a parfois été bloqué. Heureusement, Boost.Asio facilite le passage de Std.Atomic à Boost.Atomic et cela a été pris en charge dans le projet Boost-for-Android dans ce commit .

Pour plus d'informations sur le bug, voir ici


Nous développons un jeu multijoueur simple (pas encore sorti) pour Android utilisant boost asio et jusqu'à présent nous n'avons eu aucun problème. C'est pour la question # 2.

Quel genre de problèmes voyez-vous?

Si les problèmes sont liés à la compilation et à la liaison, ces conseils s'avéreront peut-être utiles.

Ajoutez ce qui suit à votre fichier AndroidManifest.xml:

<uses-permission Android:name="Android.permission.INTERNET"></uses-permission>

Ayez ceci dans votre fichier Application.mk:

APP_STL := gnustl_static
APP_CPPFLAGS += -frtti -fexceptions

Et utilisez-le comme modèle pour votre fichier Android.mk:

LOCAL_PATH := $(call my-dir)
BOOST_VERSION      := 1_49
PROJECT_ROOT       := $(LOCAL_PATH)/../../../..
BOOST_INCLUDE_PATH := /path/to/boost/headers
BOOST_LIB_PATH     := /path/to/boost/libraries

# Path and name of the STL library. Add this to the *end* of LOCAL_LDLIBS.
# Note this is a hack/workaround to prevent linker errors when compiling with 
# boost. 
STL_LIBS := -L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi \
                    -lgnustl_static

include $(CLEAR_VARS)

LOCAL_MODULE    := native-activity
LOCAL_C_INCLUDES:= $(BOOST_INCLUDE_PATH) \
                   $(PROJECT_ROOT)/src \
                   $(PROJECT_ROOT)/platform/Android/jni

LOCAL_SRC_FILES := main.cpp
LOCAL_LDLIBS    := -llog -landroid

# The order of these libraries is often important.
LOCAL_LDLIBS += -L$(BOOST_LIB_PATH)     \
                -lboost_system-gcc-mt-$(BOOST_VERSION)  \
                -lboost_thread-gcc-mt-$(BOOST_VERSION)  \
                $(STL_LIBS)

LOCAL_STATIC_LIBRARIES := Android_native_app_glue

include $(BUILD_SHARED_LIBRARY)
$(call import-module,Android/native_app_glue)

EDIT: Comment nous construisons boost pour Android. Voici ce que nous avons dans notre Makefile:

git clone git://github.com/madadam/Boost-for-Android.git
./build-Android.sh --boost=1.49.0 --with-libraries=chrono,program_options,system,thread /path/to/ndk

Notez que nous utilisons notre propre fork de Boost-for-Android, c'est uniquement parce que celui-ci a un patch pour la dernière version NDK r8d. On peut également voir sur la ligne de commande que nous utilisons la version 1.49 de boost, c'est actuellement la plus élevée prise en charge par Boost-for-Android.

Si vous souhaitez savoir quelles combinaisons de Boost et Android NDK sont prises en charge, consultez le projet Boost-for-Android. Il contient des répertoires appelés patchs/boost - < [~ # ~] x [~ # ~] >/ndk-Android < [~ # ~] y [~ # ~ ] > où [~ # ~] x [~ # ~] correspond à la version boost prise en charge et [~ # ~] y [~ # ~] vers la version NDK prise en charge (plug sans vergogne: nos 2 cents pour le projet :-)).

12
Peter Jankuliak

Ci-dessous, vous trouverez d'autres informations (très utiles) reçues de la communauté boost:

  1. Y a-t-il une raison spécifique derrière la même chose (comme non optimisée pour les appareils intégrés)? Ou pour toute autre raison?

Boost fonctionne parfaitement sur Android. Comme il existe un NDK (kit de développement natif) avec un gcc assez correct (4.6 quelque chose), il vous suffit de configurer la génération de boost pour utiliser le bon gcc. Bien que tout cela fonctionne, cela nécessite un peu de bricolage pour obtenir les bons paramètres. Mais encore une fois, en principe, il n'y a pas beaucoup de différence dans la construction de Boost pour Android ou toute autre distribution Linux.

  1. Existe-t-il (du tout) des problèmes connus si nous utilisons des bibliothèques boost pour la mise en réseau et la synchronisation des threads pour le développement d'applications pour smartphone? Sera-ce une bonne idée d'utiliser BOOST ASIO pour la même chose?

Il est parfaitement possible d'utiliser Boost.Thread ou Boost.Asio. Ils fonctionnent parfaitement sur les appareils ARM. Il existe même un support pour les hackeries plus spécifiques à la plate-forme comme boost.atomic et boost.context.

Pour info sont les liens trouvés https://github.com/MysticTreeGames/Boost-for-Androidhttp://www.codexperiments.com/Android/2011/05/tips-tricks -building-boost-with-ndk-r5 /

Construire un boost avec le Android NDK est encore plus simple qu'avec boost.build directement. J'ai compilé un tas de Android scripts de build, qui peuvent être trouvés ici: - https://github.com/STEllAR-GROUP/HPXAndroid/tree/master/modules Recherchez le boost _ $ {module} pour diverses bibliothèques de boost. Ce n'est pas une liste complète. Seulement ce dont j'avais besoin. Aussi, pourrait avoir besoin d'un peu d'amour pour 1.53. Toutes les différentes bibliothèques n'avaient pas besoin d'un traitement spécial Android (modulo quelques bugs mineurs où le compilateur n'était pas d'accord avec les autres versions de gcc)

J'espère que cela sera également utile pour les autres! Merci!

11
RDX