NDK即要支持交叉編譯臀脏,還需要支持各個(gè)Android版本的編譯铺峭,還有一些其他情況的編譯槽棍,比如c和c++等捉蚤。NDK提供了一些編譯選項(xiàng),用來支持不同的編譯需求炼七。
以前的NDK開發(fā)都是在Android.mk
和Appliction.mk
中設(shè)置,現(xiàn)在在gradle-experimental
的android.ndk{}
設(shè)置編譯選項(xiàng)缆巧。
其中包含了設(shè)置:編譯器配置,NDK版本,Header頭文件位置,gcc編譯器選項(xiàng)等...
下面介紹下幾個(gè)常用的編譯選項(xiàng)特石。
platformVersion
大部分的App需要向下兼容盅蝗,會(huì)設(shè)置minSdkVersion
,從一個(gè)低版本的Sdk開始支持。同樣的在低SDK版本上面運(yùn)行的NDK也必須使用對(duì)應(yīng)的NDK姆蘸,就需要設(shè)置platformVersion
墩莫。
設(shè)置minSdkVersion
為14,對(duì)應(yīng)的也需要設(shè)置platformVersion
也是14:
model{
android{
ndk{
....
platfromVersion=14
}
}
}
也可以使用paltformVersion "android-14"
設(shè)置NDK的版本逞敷。
toolchain
toolchain
是NDK下的一套文件系統(tǒng)和工具鏈狂秦,主要有GCC,編譯adnroid的庫和工具等推捐,是本機(jī)編譯工具或交叉編譯工具裂问。
在gradle中直接指定toolchain
和toolchainVersion
:
model {
android {
......
ndk {
......
toolchain "clang"
toolchainVersion "3.5"
}
......
}
}
ABI
Android系統(tǒng)目前支持其中七種不同的CPU架構(gòu):ARMv5,ARMv7,x86,MIPS,ARMv8,MIP64,x86_64,每一種都關(guān)聯(lián)著一個(gè)相應(yīng)的ABI。
Application Binary interface
應(yīng)用程序二進(jìn)制接口,定義了二進(jìn)制文件(尤其是.so文件)是如何運(yùn)行在相應(yīng)的系統(tǒng)平臺(tái)上的牛柒,從使用的指令集堪簿,內(nèi)存到對(duì)齊到可用的系統(tǒng)函數(shù)庫。在Android系統(tǒng)上皮壁,每一CPU架構(gòu)對(duì)應(yīng)一個(gè)ABI椭更。
對(duì)應(yīng)的.so文件會(huì)放在對(duì)應(yīng)的ABI文件下面:
一般情況下,考慮到x86系統(tǒng)的市場(chǎng)份額還太小蛾魄,還有為了減少apk包的大小虑瀑,可以指定支持的平臺(tái),使用abiFilters
,可以選擇項(xiàng)目支持的平臺(tái),比如只支持armabi
和armeabi-v7a
的配置:
...
ndk {
...
abiFilters.addAll(['armabi', 'armeabi-v7a'])
...
}
...
ldLibs
使用NDK開發(fā)Android應(yīng)用時(shí)滴须,會(huì)使用到系統(tǒng)自帶的庫舌狗,在之前的*.mk
中的LOCAL_LDLIBS
就是用來引用系統(tǒng)庫的,現(xiàn)在使用在Android studio
中可以配置ldLibs
引用系統(tǒng)庫扔水。
例如在項(xiàng)目中鏈接android的log
:
ndk {
...
ldLibs.addAll(['log'])
}
CFlags和CppFlags
CFlag表示用于C編譯器的選項(xiàng)痛侍。
CppFlags用來表示用于c++的編譯器選項(xiàng).
使用ldLibs告訴了鏈接器要鏈接那些庫文件,而在CFlags和CppFlags可以用來指定.h文件的路徑铭污。
例如指定一個(gè).h文件的目錄:
ndk {
...
CFlags.addAll(['-I/usr/local/ssl/android-14/include'])
...
}
CFlag
也是gcc的編譯選項(xiàng),比如使用-Wall
表示打開警告開發(fā)恋日,-g
是要生成調(diào)試信用膀篮,生成的可執(zhí)行文件具有和源代碼關(guān)聯(lián)的可調(diào)試信息嘹狞。
stl
stl是設(shè)置c++的運(yùn)行時(shí)庫的選項(xiàng),默認(rèn)使用的是libstdc++
最小支持的c++庫岂膳。
如果要使用gnustl_static
(靜態(tài)鏈接gnustl版本的stl)可以設(shè)置為:
ndk {
...
stl = 'gnustl_static'
cppFlags.addAll(['-std=c++11'])
...
}
在這里可以看到NDK支持的對(duì)應(yīng)的c++運(yùn)行庫,建議使用動(dòng)態(tài)方法鏈接stl,這樣可以減少apk的大小。