Android關於libs,jniLibs庫的基本使用說明及衝突解決

最近在開發中遇到了一個問題,因爲項目需要集成不同的sdk。相對應的也是不同的.so文件。

針對libs中.so庫的引入會遇到一些問題。

比如要集成第三方NDK庫:

image.png

如果是在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。

image.png

如果要精簡通過so庫來減少安裝包的大小其實還可以通過動態選擇需要添加的.so庫

在App下的build.gradle中配置:

ndk {
            //選擇要添加的對應cpu類型的.so庫。
            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
            // 還可以添加 'x86', 'x86_64', 'mips', 'mips64'
        }

這樣就可以指定加載庫。


相關文檔參考: 
ANDROID動態加載 使用SO庫時要注意的一些問題 
Android jniLibs下目錄詳解(.so文件)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章