How link with static boost libraries for android?

10.8k views Asked by At

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
2

There are 2 answers

0
Jan Hudec On

We currently use some parts of boost by simply including relevant boost files in the makefile for the library.

1
damirovic On

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.