问题
I have problem porting and linking the boost libraries to android using Android-ndk-r5b. I build boost libraries first (without mpi, python) using these steps:
1.commented line 53 in boost_1_46_0\libs\thread\build:
# if [ os.name ] = "NT" { api = win32 ; }
2. create the file user-config.jam in boost root directory
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. build boost
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. Application.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
回答1:
We currently use some parts of boost by simply including relevant boost files in the makefile for the library.
回答2:
I don't know if you can use gcc and then link the static libraries into the Android platform. What I know is that everything must be compiled under the NDK compiler (because the instruction set is different).
You can use this: https://github.com/MysticTreeGames/Boost-for-Android (.tar)
You will need a customized version of the NDK.
来源:https://stackoverflow.com/questions/5119201/how-link-with-static-boost-libraries-for-android