由于以往我写过不少使用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
此时你应该已经编译成功,祝贺

使用android ndk编译boost动态库的更多相关文章

  1. 【转载】cocos2dx 中 Android NDK 加载动态库的问题

     原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各 ...

  2. windows android studio 编译Jni动态库

    项目需要,折腾了半天搞定windows android studio环境编译Jni动态库,现记录下来. 准备安装环境: 1. android studio 下载地址是http://www.androi ...

  3. 使用android ndk编译x86 so在linux下使用的问题

    一直以为android ndk编译x86 so库可以在linxu下运行,结果我试了几次都行不通.后来想了一下,android ndk编译的库应该只能在android设备或模拟器上运行才有效,后来改用 ...

  4. ndk 编译 boost 库,支持serialization

    Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C+ ...

  5. Android导入第三方静态库.a编译成动态库.so

    http://ikinglai.blog.51cto.com/6220785/1324985 在Android开发的时候,经常会使用到用c或c++编写的第三方的静态库.如果有源码的话,可以直接跟你自己 ...

  6. android NDK编译(导入).a文件和编译多个so文件(转)

    源:android NDK编译(导入).a文件和编译多个so文件 一.编译一个静态库 libstatic_android.a LOCAL_PATH := $(call my-dir) include ...

  7. Android NDK编译之undefined reference to 'JNI_CreateJavaVM'

    利用Android NDK编译动态库,在C文件中调用了两个JNI函数:JNI_GetDefaultJavaVMInitArgs和JNI_CreateJavaVM.编译的时候始终报以下错误: XXX: ...

  8. 如何在WINDOWS下编译BOOST C++库 .

    如何在WINDOWS下编译BOOST C++库 cheungmine 2008-6-25   写出来,怕自己以后忘记了,也为初学者参考.使用VC8.0和boost1.35.0.   1)下载boost ...

  9. 表格树控件QtTreePropertyBrowser编译成动态库(设计师插件)

    目录 一.回顾 二.动态库编译 1.命令行编译动态库和测试程序 2.vs工具编译动态库和测试程序 3.安装文档 4.测试文档 三.设计师插件编译 1.重写QDesignerCustomWidgetIn ...

随机推荐

  1. deque 用法

    引用博客:https://blog.csdn.net/zyq522376829/article/details/46801973 下面是那位大佬写的的笔记整理~~~~ deque - 双向队列 1.构 ...

  2. NOIP模拟赛 麻将

    [题目描述] 众所周知,麻将是我们国家的国粹.这段时间,小D也迷上了麻将这个老少皆宜的游戏. 小D觉得这些不同规则的麻将太麻烦了,所以他集合了很多种麻将规则创造出了一套D麻将.下面是D麻将的几个特点: ...

  3. Docker 容器的跨主机连接

    使用网桥实现跨主枳容器连接 不推荐 使用OpenvSwitch实现跨主机容器连接 OpenvSwitch: OpenvSwitch是一个高质量的.多层虚拟交换枳,使用开源Apache2.0许可协议,由 ...

  4. redis代理集群(Twemproxy)(1)

    redis主从+哨兵模式只解决了读的分布式操作,大大提高了性能:但是写操作,只有主主机器才能进行,从机器无法进行写操作.此时,Twemproxy也就出现了. 这个模式单纯的安装有些复杂,需要引入很多的 ...

  5. JAVA基础篇—String和StringBuffer

    区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringBuffer类对象为可修改对象,可以通过append() ...

  6. Nginx配置语法和日志

    nginx配置 配置文件 重启服务 http请求 nginx日志 一共有两个日志文件 在配置文件中添加这个,就可以在日志文件中看到请求的userAgent 配置语法的检查 nginx重新加载配置 发送 ...

  7. SDOJ 3696 Tree

    描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 输入 第一行V,E,need分别表示点数,边数和需要的白色边数. 接下来E行 每行 ...

  8. 九度oj 题目1457:非常可乐

    题目描述: 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样 ...

  9. POJ 2181 Jumping Cows

    Jumping Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6398   Accepted: 3828 Desc ...

  10. 【转】hibernate映射(单向双向的一对多、多对一以及一对一、多对一)

    多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 也就是说一对多和多对一的映射策略是一样的,只是站 ...