使用android ndk編譯boost庫

由於以往我寫過不少使用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


此時你應該已經編譯成功,祝賀



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章