现在的位置: 首页 > 综合 > 正文

使用android ndk编译boost库

2013年08月28日 ⁄ 综合 ⁄ 共 2140字 ⁄ 字号 评论关闭

由于以往我写过不少使用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)

再创建Application.mk内容如下:

APP_STL := gnustl_static
APP_CPPFLAGS += -frtti -fexceptions

完成后执行 ndk-build

此时你应该已经编译成功,祝贺

抱歉!评论已关闭.