由于以往我写过不少使用boost库开发的项目,而最近准备移植一些代码到android上(上层界面以及jni层我不管,也没研究过,现在只完成代码的移植编译,具体如何调用,由其它人负责),所以先要解决的就是boost库本身的移植问题。
在google上找了一些相关的资料,然后在http://stackoverflow.com上找到一个给力的帖子:
http://stackoverflow.com/questions/14036311/official-boost-library-support-for-android-and-ios/14089965#comment19511559_14089965
帖子里面大致介绍了怎么装,这里面涉及到一个老外写的脚本工具,用于编译
移植过程相对比较顺利,不过一开始下载的ndk r8d,好像是对glibc的版本有要求,在我这边的centos5.6上编译它自带的sample时,arm-linux-androideabi-ld提示/usr/lib/libstdc++中的glibc版本过低,无法执行链接,可能arm-linux-androideabi-ld依赖高版本的库,有时间更新一下再看看,oh my god!不过我没去管它,因此系统里还有ndk r8,下面就说一下编译过程。
1.下载安装ndk
我用的r8,放置在 /usr/local/src/android-ndk-r8
注册环境变量(第一句必须执行):
export NDK_ROOT=/usr/local/src/android-ndk-r8
export PATH=$NDK_ROOT:$PATH
2.下载boost-for-android工具
git clone git://github.com/madadam/Boost-for-Android.git
它里面包含了boost的补丁以及编译脚本,该工具放置在 /usr/local/src/Boost-for-Android
3.下载boost_1.49.0
上述工具目前只支持到为1.49打补丁,另外boost-for-android的脚本本身带有下载boost压缩包的功能,但是天朝的速度。。。你懂的,还是自己用下载工具下比较快
将下载完的boost_1.49.0.tar.bz放置在/usr/local/src/Boost-for-Android
4.开始编译
切换目录至/usr/local/src/Boost-for-Android
运行:
./build-android.sh --boost=1.49.0 $NDK_ROOT
如果不出意外将会编译成功,其它编译选项可以自行查看
生成的文件位于 /usr/local/src/Boost-for-Android/build
5.测试demo
我从boost的sample中抽了一个出来进行编译测试(./boost_1_49_0/libs/asio/example/allocation/server.cpp)
在任意位置新建 jni 文件夹,放入server.cpp,并创建Android.mk,编写内容如下:
LOCAL_PATH := $(call my-dir) BOOST_VERSION := 1_49 PROJECT_ROOT := $(LOCAL_PATH) BOOST_INCLUDE_PATH := /usr/local/src/Boost-for-Android/build/include/boost-1_49 BOOST_LIB_PATH := /usr/local/src/Boost-for-Android/build/lib # 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 := boost_test LOCAL_C_INCLUDES:= $(BOOST_INCLUDE_PATH) \ $(PROJECT_ROOT) LOCAL_SRC_FILES := server.cpp LOCAL_LDLIBS := -llog # 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) include $(BUILD_EXECUTABLE)
APP_STL := gnustl_static APP_CPPFLAGS += -frtti -fexceptions
此时你应该已经编译成功,祝贺