Android關於libs,jniLibs庫的基本使用說明及衝突解決
最近在開發中遇到了一個問題,因為專案需要整合不同的sdk。相對應的也是不同的.so檔案。
針對libs中.so庫的引入會遇到一些問題。
比如要整合第三方NDK庫:
如果是在eclipse中,需要放到libs下對應庫的目錄。
如果是在Android Studio中,則會預設匹配main下的jniLibs目錄,如果沒有目錄需要自己手動建立。並且庫的名稱也不能隨便更改。
但是這裡會有一個問題,就是如果使用的是AndroidStudio,但是想用libs下的庫,還需要手動去指定庫的位置:
在App下的build.gradle中加入以下配置。
android {
......
sourceSets {
main {
jniLibs.srcDirs = ['libs']
......
}
......
}
......
}
1
2
3
4
5
6
7
8
9
10
11
在整合第三方服務商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'
}
1
2
3
4
5
6
這樣就可以指定載入庫。
相關文件參考:
ANDROID動態載入 使用SO庫時要注意的一些問題
Android jniLibs下目錄詳解(.so檔案)
專案demo參考:
android-CollectionDemo
---------------------
作者:wapchief
來源:CSDN
原文:https://blog.csdn.net/wapchief/article/details/78229097
版權宣告:本文為博主原創文章,轉載請