由於以往我寫過不少使用boost庫開發的項目,而最近準備移植一些代碼到android上(上層界面以及jni層我不管,也沒研究過,現在只完成代碼的移植編譯,具體如何調用,由其它人負責),所以先要解決的就是boost庫本身的移植問題。
在google上找了一些相關的資料,然後在http://stackoverflow.com上找到一個給力的帖子:
帖子裏面大致介紹了怎麼裝,這裏面涉及到一個老外寫的腳本工具,用於編譯
移植過程相對比較順利,不過一開始下載的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
此時你應該已經編譯成功,祝賀