最近在開發中遇到了一個問題,因爲項目需要集成不同的sdk。相對應的也是不同的.so文件。
針對libs中.so庫的引入會遇到一些問題。
比如要集成第三方NDK庫:
如果是在eclipse中,需要放到libs下對應庫的目錄。
如果是在Android Studio中,則會默認匹配main下的jniLibs目錄,如果沒有目錄需要自己手動創建。並且庫的名稱也不能隨便更改。
但是這裏會有一個問題,就是如果使用的是AndroidStudio,但是想用libs下的庫,還需要手動去指定庫的位置:
在App下的build.gradle中加入以下配置。
android {
......
sourceSets {
main {
jniLibs.srcDirs = ['libs']
......
}
......
}
......
}
在集成第三方服務商sdk的時候,大多數都會讓你下載demo,或者是SDK集合包,讓你直接拷貝整個libs或者jniLibs目錄,合併本地項目。這樣就會出問題。
以訊飛語音開發文檔、百度語音開發文檔和極光推送文檔爲例
訊飛的文檔中說明是將libs目錄下所有的文件拷貝至自己項目中的libs目錄。
百度的則是將app/src/main/jniLibs下的所有文件拷貝至自己的項目。
極光文檔就顯得比較人性化
如果你要集成前面兩家的sdk,顯然就會出現衝突。
build配置後,jniLibs庫就無法被識別。但是不配置的話,libs庫無法識別。
結果是改來改去總有一方庫無法加載.so文件。
所以要解決的話,就拋棄前面的文檔吧。
正確姿勢是把所有的.so所對應的庫要麼全部放在libs,要麼全部放在jniLibs。
eclipse現在的使用者已經很少了,所以還是以Android Studio爲主。建議全部放在jniLibs,不需要額外的任何配置。
說點題外話
在第三方提供的NDK庫中,大多都是成套的爲了適配不同的cpu廠商,也就是常說的高通,聯發科這些。
在拷貝庫的時候也會成套的拷貝進項目,一般是四五個,百度語音的.so庫全部導入的話加起來足足在15M以上。
所以在選擇第三方服務的時候這也是需要考慮的一個因素。
以
我的demo爲例,最近公司要選擇一套語音方案,所以暫時就體驗了百度的和訊飛的。
集成之前安裝包是4M,集成後21M。
如果要精簡通過so庫來減少安裝包的大小其實還可以通過動態選擇需要添加的.so庫
在App下的build.gradle中配置:
ndk {
//選擇要添加的對應cpu類型的.so庫。
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
// 還可以添加 'x86', 'x86_64', 'mips', 'mips64'
}
這樣就可以指定加載庫。
相關文檔參考:
ANDROID動態加載 使用SO庫時要注意的一些問題
Android jniLibs下目錄詳解(.so文件)