最近在開(kāi)發(fā)中遇到了一個(gè)問(wèn)題,因?yàn)轫?xiàng)目需要集成不同的sdk。相對(duì)應(yīng)的也是不同的.so文件。
針對(duì)libs中.so庫(kù)的引入會(huì)遇到一些問(wèn)題。
比如要集成第三方NDK庫(kù):

如果是在eclipse中,需要放到libs下對(duì)應(yīng)庫(kù)的目錄。
如果是在Android Studio中,則會(huì)默認(rèn)匹配main下的jniLibs目錄,如果沒(méi)有目錄需要自己手動(dòng)創(chuàng)建。并且?guī)斓拿Q也不能隨便更改。
但是這里會(huì)有一個(gè)問(wèn)題,就是如果使用的是AndroidStudio,但是想用libs下的庫(kù),還需要手動(dòng)去指定庫(kù)的位置:
在App下的build.gradle中加入以下配置。
android {
......
sourceSets {
main {
jniLibs.srcDirs = ['libs']
......
}
......
}
......
}
在集成第三方服務(wù)商sdk的時(shí)候,大多數(shù)都會(huì)讓你下載demo,或者是SDK集合包,讓你直接拷貝整個(gè)libs或者jniLibs目錄,合并本地項(xiàng)目。這樣就會(huì)出問(wèn)題。
以訊飛語(yǔ)音開(kāi)發(fā)文檔、百度語(yǔ)音開(kāi)發(fā)文檔和極光推送文檔為例
訊飛的文檔中說(shuō)明是將libs目錄下所有的文件拷貝至自己項(xiàng)目中的libs目錄。

百度的則是將app/src/main/jniLibs下的所有文件拷貝至自己的項(xiàng)目。

極光文檔就顯得比較人性化

如果你要集成前面兩家的sdk,顯然就會(huì)出現(xiàn)沖突。
build配置后,jniLibs庫(kù)就無(wú)法被識(shí)別。但是不配置的話,libs庫(kù)無(wú)法識(shí)別。
結(jié)果是改來(lái)改去總有一方庫(kù)無(wú)法加載.so文件。
所以要解決的話,就拋棄前面的文檔吧。
正確姿勢(shì)是把所有的.so所對(duì)應(yīng)的庫(kù)要么全部放在libs,要么全部放在jniLibs。
eclipse現(xiàn)在的使用者已經(jīng)很少了,所以還是以Android Studio為主。建議全部放在jniLibs,不需要額外的任何配置。
說(shuō)點(diǎn)題外話
在第三方提供的NDK庫(kù)中,大多都是成套的為了適配不同的cpu廠商,也就是常說(shuō)的高通,聯(lián)發(fā)科這些。
在拷貝庫(kù)的時(shí)候也會(huì)成套的拷貝進(jìn)項(xiàng)目,一般是四五個(gè),百度語(yǔ)音的.so庫(kù)全部導(dǎo)入的話加起來(lái)足足在15M以上。
所以在選擇第三方服務(wù)的時(shí)候這也是需要考慮的一個(gè)因素。
以
我的demo為例,最近公司要選擇一套語(yǔ)音方案,所以暫時(shí)就體驗(yàn)了百度的和訊飛的。
集成之前安裝包是4M,集成后21M。

如果要精簡(jiǎn)通過(guò)so庫(kù)來(lái)減少安裝包的大小其實(shí)還可以通過(guò)動(dòng)態(tài)選擇需要添加的.so庫(kù)
在App下的build.gradle中配置:
ndk {
//選擇要添加的對(duì)應(yīng)cpu類型的.so庫(kù)。
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
// 還可以添加 'x86', 'x86_64', 'mips', 'mips64'
}
這樣就可以指定加載庫(kù)。
相關(guān)文檔參考:
ANDROID動(dòng)態(tài)加載 使用SO庫(kù)時(shí)要注意的一些問(wèn)題
Android jniLibs下目錄詳解(.so文件)
項(xiàng)目demo參考:
android-CollectionDemo