由於以往我寫過不少使用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_49PROJECT_ROOT := $(LOCAL_PATH)BOOST_INCLUDE_PATH := /usr/local/src/Boost-for-Android/build/include/boost-1_49BOOST_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_staticinclude $(CLEAR_VARS)LOCAL_MODULE := boost_testLOCAL_C_INCLUDES:= $(BOOST_INCLUDE_PATH) \ $(PROJECT_ROOT)LOCAL_SRC_FILES := server.cppLOCAL_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_staticAPP_CPPFLAGS += -frtti -fexceptions
完成後執行 ndk-build
此時你應該已經編譯成功,祝賀