c++ - r13 - ¿Cómo enlazar con las bibliotecas de impulso estático para Android?
androidndk64 (2)
Actualmente utilizamos algunas partes de boost simplemente mediante la inclusión de archivos de boost relevantes en el archivo make para la biblioteca.
Tengo problemas para trasladar y vincular las bibliotecas boost a Android con Android-ndk-r5b. Primero construyo bibliotecas boost (sin mpi, python) siguiendo estos pasos:
1.commented line 53 en boost_1_46_0 / libs / thread / build:
# if [ os.name ] = "NT" { api = win32 ; }
2. cree el archivo user-config.jam en el directorio raíz de boost
androidNDKRoot = ../android-ndk-r5b ; using gcc : android4.4.3 : $(androidNDKRoot)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-g++.exe : --sysroot=$(androidNDKRoot)/platforms/android-3/arch-arm -mthumb -Os -fno-strict-aliasing -O2 -DNDEBUG -g -fexceptions -frtti -lstdc++ -I$(androidNDKRoot)/sources/cxx-stl/gnu-libstdc++/include -I$(androidNDKRoot)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include -D__GLIBC__ -DBOOST_NO_INTRINSIC_WCHAR_T $(androidNDKRoot)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-ar.exe $(androidNDKRoot)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-ranlib.exe linux ;
3. construir impulso
bjam.exe --user-config=user-config.jam --without-python --without-mpi toolset=gcc-android4.4.3 link=static runtime-link=static target-os=linux --stagedir=android > d:/out.txt
4. Aplicación.mk
APP_STL := gnustl_static APP_PLATFORM := android-3 APP_CPPFLAGS += -mthumb APP_CPPFLAGS += -Os APP_CPPFLAGS += -fno-strict-aliasing APP_CPPFLAGS += -O2 APP_CPPFLAGS += -DNDEBUG APP_CPPFLAGS += -g APP_CPPFLAGS += -fexceptions APP_CPPFLAGS += -frtti APP_CPPFLAGS += -lstdc++ APP_CPPFLAGS += -D__GLIBC__ APP_CPPFLAGS += -DBOOST_NO_INTRINSIC_WCHAR_T APP_CPPFLAGS += -L/cygdrive/d/Android/boost_1_46_0/android/lib/
5. Android.mk
# Howto # http://source.android.com/porting/build_cookbook.html # LOCAL_PATH:= $(call my-dir) # ============================================================== # libudt # ============================================================== include $(CLEAR_VARS) LOCAL_MODULE := libudt LOCAL_C_INCLUDES += /cygdrive/d/Android/boost_1_46_0/ LOCAL_SRC_FILES += udt.cpp LOCAL_STATIC_LIBRARIES := boost_thread-gcc-mt-s-1_46 include $(BUILD_SHARED_LIBRARY)
6. udt.cpp
#include "boost/bind.hpp" #include "boost/thread.hpp" void thread_fn (int) { } extern "C" int func1 () { boost::thread thrd (boost::bind (thread_fn, 1)); thrd.join (); return 0; }
7. $ NDK / ndk-build
Compile++ thumb : udt > > >'': D:/Android/boost_1_46_0/boost/thread/detail/thread.hpp:204: undefined reference to `boost::thread::start_thread()'' D:/Android/boost_link/obj/local/armeabi/objs/udt/udt.o: In function `func1'': D:/Android/boost_link/jni/udt.cpp:19: undefined reference to `boost::thread::join()'' D:/Android/boost_link/jni/udt.cpp:20: undefined reference to `boost::thread::~thread()'' D:/Android/boost_link/jni/udt.cpp:20: undefined reference to `boost::thread::~thread()'' D:/Android/boost_link/obj/local/armeabi/objs/udt/udt.o:(.data.rel.ro._ZTIN5boost6detail11thread_dataINS_3_bi6bind_tIvPFv iENS2_5list1INS2_5valueIiEEEEEEEE[typeinfo for boost::detail::thread_data > > >]+0x8): undefined reference to `typeinfo for boost::detail::thread_data_base'' collect2: ld returned 1 exit status make: *** [/cygdrive/d/Android/boost_link/obj/local/armeabi/libudt.so] Error 1
No sé si puedes usar gcc y luego vincular las bibliotecas estáticas a la plataforma Android. Lo que sé es que todo debe compilarse bajo el compilador NDK (porque el conjunto de instrucciones es diferente).
Puede usar esto: https://github.com/MysticTreeGames/Boost-for-Android ( .tar )
Necesitará una versión personalizada del NDK.