1. 程式人生 > >Android關於libs,jniLibs庫的基本使用說明及衝突解決

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 
版權宣告:本文為博主原創文章,轉載請