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
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.
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
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
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 :-)).
Ci-dessous, vous trouverez d'autres informations (très utiles) reçues de la communauté boost:
- 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.
- 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!