最近在開發(fā)中遇到了一個(gè)問題姆怪,因?yàn)轫?xiàng)目需要集成不同的sdk叛赚。相對應(yīng)的也是不同的.so文件。
針對libs中.so庫的引入會(huì)遇到一些問題稽揭。
比如要集成第三方NDK庫:
如果是在eclipse中俺附,需要放到libs下對應(yīng)庫的目錄。
如果是在Android Studio中溪掀,則會(huì)默認(rèn)匹配main下的jniLibs目錄事镣,如果沒有目錄需要自己手動(dòng)創(chuàng)建。并且?guī)斓拿Q也不能隨便更改揪胃。
但是這里會(huì)有一個(gè)問題蛮浑,就是如果使用的是AndroidStudio唠叛,但是想用libs下的庫只嚣,還需要手動(dòng)去指定庫的位置:
在App下的build.gradle中加入以下配置沮稚。
android {
......
sourceSets {
main {
jniLibs.srcDirs = ['libs']
......
}
......
}
......
}
在集成第三方服務(wù)商sdk的時(shí)候,大多數(shù)都會(huì)讓你下載demo册舞,或者是SDK集合包蕴掏,讓你直接拷貝整個(gè)libs或者jniLibs目錄,合并本地項(xiàng)目调鲸。這樣就會(huì)出問題盛杰。
以訊飛語音開發(fā)文檔、百度語音開發(fā)文檔和極光推送文檔為例
訊飛的文檔中說明是將libs目錄下所有的文件拷貝至自己項(xiàng)目中的libs目錄藐石。
百度的則是將app/src/main/jniLibs下的所有文件拷貝至自己的項(xiàng)目即供。
極光文檔就顯得比較人性化
如果你要集成前面兩家的sdk,顯然就會(huì)出現(xiàn)沖突于微。
build配置后逗嫡,jniLibs庫就無法被識別。但是不配置的話株依,libs庫無法識別驱证。
結(jié)果是改來改去總有一方庫無法加載.so文件。
所以要解決的話恋腕,就拋棄前面的文檔吧抹锄。
正確姿勢是把所有的.so所對應(yīng)的庫要么全部放在libs,要么全部放在jniLibs荠藤。
eclipse現(xiàn)在的使用者已經(jīng)很少了伙单,所以還是以Android Studio為主。建議全部放在jniLibs哈肖,不需要額外的任何配置吻育。
說點(diǎn)題外話
在第三方提供的NDK庫中,大多都是成套的為了適配不同的cpu廠商牡彻,也就是常說的高通扫沼,聯(lián)發(fā)科這些。
在拷貝庫的時(shí)候也會(huì)成套的拷貝進(jìn)項(xiàng)目庄吼,一般是四五個(gè)缎除,百度語音的.so庫全部導(dǎo)入的話加起來足足在15M以上。
所以在選擇第三方服務(wù)的時(shí)候這也是需要考慮的一個(gè)因素总寻。
以
我的demo為例器罐,最近公司要選擇一套語音方案,所以暫時(shí)就體驗(yàn)了百度的和訊飛的渐行。
集成之前安裝包是4M轰坊,集成后21M铸董。
如果要精簡通過so庫來減少安裝包的大小其實(shí)還可以通過動(dòng)態(tài)選擇需要添加的.so庫
在App下的build.gradle中配置:
ndk {
//選擇要添加的對應(yīng)cpu類型的.so庫。
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
// 還可以添加 'x86', 'x86_64', 'mips', 'mips64'
}
這樣就可以指定加載庫肴沫。
相關(guān)文檔參考:
ANDROID動(dòng)態(tài)加載 使用SO庫時(shí)要注意的一些問題
Android jniLibs下目錄詳解(.so文件)
項(xiàng)目demo參考:
android-CollectionDemo