Android NDK r10c 編譯boost 1.55 (使用Cygwin)

項目用到boost::asio,boost::serialization, Android打包環境配置 ... 作個記錄,下次別又掉到這坑裏浪費時間linux

 

1. 安裝Cygwin :

下載Cygwin (http://www.cygwin.com/
android

安裝時,默認設置,只選擇Devel,將後面的Default改成Install,而後就是等了。c++

 

安裝完後,進入Cygwin的終端,分別 gcc -v 和 make -v 查看版本bootstrap

 

配置環境變量,打開vi ~/.bash_profile,添加環境變量export NDK=/cygdrive/d/Android/android-ndk-r10cwindows

輸入$NDK看看是否生效bash

 

 

2. NDK編譯boost生成靜態庫:

進入Cygwin終端,解壓boost_1_55_0.tar.bz2 到 android-ndk-r10c/sources 文件夾裏app

# tar -jxvf boost_1_55_0.tar.bz2

 

進入boost_1_55_0/目錄運行 bootstrap.sh 生成 b2ide

 

進入 boost_1_55_0/tools/build/v2/user-config.jam,在後面添加:函數

import os ;  
   
if [ os.name ] = CYGWIN || [ os.name ] = NT {  
androidPlatform = windows-x86_64 ;  
}  
else if [ os.name ] = LINUX {  
androidPlatform = linux-x86_64 ;  
}  
else if [ os.name ] = MACOSX {  
androidPlatform = darwin-x86 ;  
}  
   
modules.poke : NO_BZIP2 : 1 ;  
#ANDROID_NDK = ../.. ;  
ANDROID_NDK = D:/Android/android-ndk-r10c ;  
using gcc : android4.8 : $(ANDROID_NDK)/toolchains/arm-linux-androideabi-4.8/prebuilt/$(androidPlatform)/bin/arm-linux-androideabi-g++ :  
<archiver>$(ANDROID_NDK)/toolchains/arm-linux-androideabi-4.8/prebuilt/$(androidPlatform)/bin/arm-linux-androideabi-ar  
<ranlib>$(ANDROID_NDK)/toolchains/arm-linux-androideabi-4.8/prebuilt/$(androidPlatform)/bin/arm-linux-androideabi-ranlib  
<compileflags>--sysroot=$(ANDROID_NDK)/platforms/android-9/arch-arm  
<compileflags>-I$(ANDROID_NDK)/sources/cxx-stl/gnu-libstdc++/4.8/include  
<compileflags>-I$(ANDROID_NDK)/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi/include  
#<compileflags>-DBOOST_NO_STD_WSTRING
<compileflags>-DNDEBUG  
<compileflags>-D__GLIBC__  
<compileflags>-DBOOST_FILESYSTEM_VERSION=3  
<compileflags>-lstdc++  
<compileflags>-lgnustl_shared  
<compileflags>-mthumb  
<compileflags>-fno-strict-aliasing  
<compileflags>-std=gnu++11  
<compileflags>-O2
;  

注意調整 ANDROID_NDK 的路徑.ui

 

編譯 boost::asio,boost::serialization,在 boost_1_55_0/android/lib 下生成靜態庫

# ./b2 --with-system --with-serialization toolset=gcc-android4.8 link=static runtime-link=static target-os=linux --stagedir=android

 

在boost_1_55_0 文件夾下新建 Android.mk 寫入

LOCAL_PATH:= $(call my-dir)  
#LOCAL_CPPFLAGS += –fexceptions
include $(CLEAR_VARS)  
LOCAL_MODULE:= boost_system  
LOCAL_SRC_FILES:= android/lib/libboost_system.a  
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)  
include $(PREBUILT_STATIC_LIBRARY)  
   
include $(CLEAR_VARS)  
LOCAL_MODULE:= boost_serialization
LOCAL_SRC_FILES:= android/lib/libboost_serialization.a  
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)  
include $(PREBUILT_STATIC_LIBRARY)  
   
include $(CLEAR_VARS)  
LOCAL_MODULE:= boost_wserialization
LOCAL_SRC_FILES:= android/lib/libboost_wserialization.a  
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)  
include $(PREBUILT_STATIC_LIBRARY)  
   

 

3. 項目打包

打開jni/Android.mk 添加

LOCAL_WHOLE_STATIC_LIBRARIES += boost_system
LOCAL_WHOLE_STATIC_LIBRARIES += boost_serialization

$(call import-module, boost_1_55_0)

 

編譯報錯:

則要在 jni/Application.mk 文件中添加 ,

APP_CPPFLAGS += -fexceptions (添加異常支持 LOCAL_CPPFLAGS += –fexceptions)

 

編譯到boost::serialization報錯,

參考http://stackoverflow.com/questions/15479136/how-to-implement-mbtowc-for-android-or-ideally-how-not-to

這類沒定義的函數是c庫,NDK沒實現類些函數。。。boost庫官網說相信你本身可以實現,好厲害啊~

在cpp文件里加入代碼,替代那些沒定義的函數

#ifdef ANDROID
int wctomb(char *s, wchar_t wc) { return wcrtomb(s,wc,NULL); }
int mbtowc(wchar_t *pwc, const char *s, size_t n) { return mbrtowc(pwc, s, n, NULL); }
#endif

好了,就這樣能夠打出app包了

 

最後的 jni/Android.mk 文件內容是(紅色是添加的部分)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := cocos2dcpp_shared

LOCAL_MODULE_FILENAME := libcocos2dcpp

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../Classes/AppDelegate.cpp \
                   ../../Classes/HelloWorldScene.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes

LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += boost_system
LOCAL_WHOLE_STATIC_LIBRARIES += boost_serialization
#LOCAL_WHOLE_STATIC_LIBRARIES += boost_wserialization


# LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
# LOCAL_WHOLE_STATIC_LIBRARIES += cocosbuilder_static
# LOCAL_WHOLE_STATIC_LIBRARIES += spine_static
# LOCAL_WHOLE_STATIC_LIBRARIES += cocostudio_static
# LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static
# LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static


include $(BUILD_SHARED_LIBRARY)

$(call import-module,.)
$(call import-module,audio/android)
$(call import-module, boost_1_55_0)

# $(call import-module,Box2D)
# $(call import-module,editor-support/cocosbuilder)
# $(call import-module,editor-support/spine)
# $(call import-module,editor-support/cocostudio)
# $(call import-module,network)
# $(call import-module,extensions)

 

最後的 jni/Application.mk 文件內容是(紅色是添加的部分)

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1 -std=c++11 -fsigned-char
APP_CPPFLAGS += -fexceptions

 

 

參考:

http://blog.csdn.net/ly131420/article/details/41390379
http://stackoverflow.com/questions/15479136/how-to-implement-mbtowc-for-android-or-ideally-how-not-to
http://blog.csdn.net/hcj116/article/details/19752307
http://stackoverflow.com/questions/17667978/using-boost-in-android-ndk-with-windows
http://www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/
http://blog.csdn.net/andyhuabing/article/details/8594679
相關文章
相關標籤/搜索