Soporte oficial de la “Biblioteca Boost” para Android e iOS

Esta pregunta es una continuación de ¿Debería elegir Boost Asio o Aysnc Socket Threads en Android? preguntó,

Las bibliotecas Boost están destinadas a ser ampliamente útiles y utilizables en una amplia gama de aplicaciones, pero todavía no hay soporte oficial disponible para Android e iOS.

  1. ¿Hay alguna razón específica detrás de lo mismo como No optimizado para dispositivos integrados? ¿O alguna otra razón?
  2. ¿Alguien sabe de alguna aplicación creada con Boost en Android o iOS?
  3. ¿Es aconsejable utilizar bibliotecas de impulso para la aplicación de red intensa que engendra múltiples hilos para la conmutación?

FYI … He estado usando los siguientes enlaces para crear una aplicación de Android de muestra, pero aún no exitosa 🙁

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

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

Incluir la biblioteca de Boost C ++ en Android

Cómo utilizar la biblioteca de impulso (incluido shared_ptr) con Android NDK y 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 y soporte de excepción C ++

Gracias por adelantado.

Obtuve respuesta de la comunidad de impulso Sí. Estas plataformas no son oficialmente compatibles porque nadie se ha ofrecido voluntario para realizar regularmente pruebas de regresión.

No es posible que un desarrollador de Boost pruebe en todas las plataformas. Entonces los desarrolladores dependen de los resultados de las pruebas de regresión ejecutadas por voluntarios. Por ejemplo, ver http://beta.boost.org/development/tests/trunk/developer/summary.html

Si nadie se ofrece como voluntario para ejecutar las pruebas para una plataforma en particular, esa plataforma no es oficialmente compatible.

Entonces, si le importa que Android o iOS cuenten con el respaldo oficial, comience a realizar pruebas de regresión periódicas (preferiblemente diarias) para Boost. Ver http://beta.boost.org/development/running_regression_tests.html

Mira mi tutorial multiplataforma en github. Le muestra cómo configurar Boost y usarlo entre iOS y Android. Pasé un momento tan horrible con esto, supongo que lo documentaría para que nadie más tuviera que resolverlo. Notará que este proyecto también incluye otros elementos comunes utilizados entre las dos plataformas, por ejemplo, CoreFoundation y SQLite.

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

Nota: Mi tutorial no muestra cómo comstackr las bibliotecas comstackdas para impulsar. Lo he hecho antes con éxito utilizando las instrucciones que me proporcionó:

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

Después de tener una biblioteca estática comstackda por la cadena de herramientas de Android, puede vincularla fácilmente mediante un módulo similar al del directorio include/[NAME OF NEW SUBMODULE] del proyecto anterior. Use algo similar a lo siguiente para el archivo Android.mk en la raíz de ese directorio.

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

Finalmente, importe ese módulo, como en el ejemplo, dentro

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

En cuanto a sus otras preguntas, ¿sabe de una aplicación que usa Boost en iOS y Android? Sí, lo he hecho varias veces con éxito y he lanzado aplicaciones que funcionan en las tiendas de aplicaciones.

Su otra pregunta, ¿es aconsejable utilizar impulso para la comunicación de red? No estoy seguro de lo que quieres decir aquí. ¿Desde qué ángulo? ¿Te refieres, filosóficamente, técnicamente, etc.?

Filosóficamente, debes preguntarte cuál es tu razonamiento para importar esta biblioteca y usarla entre Android e iOS. Es para ahorrar tiempo de código, carga de mantenimiento. Si es así, diría que esta es una excelente manera de hacerlo. Claramente hay algunos obstáculos y dolor para hacer funcionar este tipo de configuración. Además, las características IDE para C ++ no son tan impresionantes como para Java en Eclipse. Intento ser justo y equilibrado en la presentación de PDF en el directorio doc/ . Dale una vez más.

Desde una perspectiva técnica, creo que lo único que me preocuparía es asegurarme de limpiar los objetos de Asio correctamente cuando se detiene la actividad. Si necesita hacer cosas en segundo plano, utilice un servicio en su lugar:

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

ACTUALIZACIÓN: Parece haber un problema con std :: atomic en Android, y dado que Boost.Asio lo está usando (de forma predeterminada), combinado con hilos, ocasionalmente se estanca. Afortunadamente Boost.Asio hace que sea fácil cambiar de Std.Atomic a Boost.Atomic y esto se ha solucionado en el proyecto Boost-for-Android en este compromiso .

Para más información sobre el error, mira aquí


Estamos desarrollando un juego simple de varios jugadores (aún no lanzado) para Android usando boost asio y hasta ahora no tuvimos ningún problema. Eso es para la pregunta # 2.

¿Qué tipo de problemas estás viendo?

Si los problemas están relacionados con la comstackción y el enlace, tal vez estas sugerencias resulten útiles.

Agregue los siguientes a su archivo AndroidManifest.xml:

  

Tenga esto en su archivo Application.mk:

 APP_STL := gnustl_static APP_CPPFLAGS += -frtti -fexceptions 

Y use esto como una plantilla para su archivo 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) 

EDITAR: Cómo creamos el impulso para Android. Esto es lo que tenemos en nuestro 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 

Tenga en cuenta que estamos utilizando nuestro propio tenedor de Boost-for-Android, esto es solo porque ese tiene un parche para la versión más nueva de NDK r8d. También se puede ver desde la línea de comandos que estamos utilizando la versión 1.49 de boost, esta es actualmente la más alta compatible con Boost-for-Android.

Si desea saber qué combinaciones de Boost y Android NDK son compatibles, eche un vistazo al proyecto Boost-for-Android. Contiene directorios llamados patches / boost- < X > / ndk-android < Y > donde X corresponde a la versión de boost soportada y Y a la versión de NDK compatible (plug descarado: nuestros 2 centavos para el proyecto :-)).

A continuación hay más información (Muy útil) recibida de la comunidad de impulso:

  1. ¿Hay alguna razón específica detrás de lo mismo (como no optimizado para dispositivos integrados)? ¿O alguna otra razón?

Boost funciona perfectamente en Android. Como hay un NDK (kit de desarrollo nativo) con un gcc bastante decente (4.6 algo) solo necesitas configurar la construcción de boost para usar el gcc correcto. Aunque todo esto funciona, requiere un poco de retoque para obtener la configuración correcta. Pero, de nuevo, en principio, no hay mucha diferencia en la creación de Boost para Android o cualquier otra distribución de Linux.

  1. ¿Hay (en absoluto) problemas conocidos si utilizamos bibliotecas de impulso para redes y sincronización de hilos para el desarrollo de aplicaciones de teléfonos inteligentes? ¿Será una buena idea usar BOOST ASIO para lo mismo?

Está perfectamente bien usar Boost.Thread o Boost.Asio. Funcionan perfectamente bien en dispositivos ARM. Incluso hay soporte para las hackers más específicas de la plataforma como boost.atomic y boost.context.

FYI son los enlaces encontrados https://github.com/MysticTreeGames/Boost-for-Android http://www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/

Aumentar la construcción con Android NDK es incluso más simple que con boost.build directamente. Recopilé un conjunto de scripts de comstackción de Android, que se pueden encontrar aquí: https://github.com/STEllAR-GROUP/HPXAndroid/tree/master/modules Busque el boost _ $ {module} para varias bibliotecas de boost. Esta no es una lista completa. Solo lo que necesitaba. Además, podría necesitar un poco de amor por 1.53. Todas las diferentes bibliotecas no necesitaban ningún tratamiento especial con Android (algunos pequeños errores en los que el comstackdor no estaba de acuerdo con otras versiones de gcc)

¡Espero que esto también sea útil para otros! ¡Gracias!