最近在開發中遇到了一個問題,由於項目須要集成不一樣的sdk。相對應的也是不一樣的.so文件。android
針對libs中.so庫的引入會遇到一些問題。app
好比要集成第三方NDK庫:eclipse
若是是在eclipse中,須要放到libs下對應庫的目錄。
若是是在Android Studio中,則會默認匹配main下的jniLibs目錄,若是沒有目錄須要本身手動建立。而且庫的名稱也不能隨便更改。gradle
可是這裏會有一個問題,就是若是使用的是AndroidStudio,可是想用libs下的庫,還須要手動去指定庫的位置:ui
在App下的build.gradle中加入如下配置。.net
android {
......
sourceSets {
main {
jniLibs.srcDirs = ['libs']
......
}
......
}
......
}
1
2
3
4
5
6
7
8
9
10
11
在集成第三方服務商sdk的時候,大多數都會讓你下載demo,或者是SDK集合包,讓你直接拷貝整個libs或者jniLibs目錄,合併本地項目。這樣就會出問題。blog
以訊飛語音開發文檔、百度語音開發文檔和極光推送文檔爲例ip
訊飛的文檔中說明是將libs目錄下全部的文件拷貝至本身項目中的libs目錄。開發
百度的則是將app/src/main/jniLibs下的全部文件拷貝至本身的項目。v8
極光文檔就顯得比較人性化
若是你要集成前面兩家的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'
}
1
2
3
4
5
6
這樣就能夠指定加載庫。
相關文檔參考: ANDROID動態加載 使用SO庫時要注意的一些問題 Android jniLibs下目錄詳解(.so文件)