Android -- 出現.so檔案找不到時怎麼處理
阿新 • • 發佈:2019-02-10
一. 問題
在專案中我們有時會遇到這樣的錯誤: cannot find “xxx.so”
這其中有兩種原因導致的錯誤,這種錯誤可能會讓我們的應用程式產生閃退和ANR錯誤(應用程式無響應),
我們的解決辦法也是從這兩個方面入手
二. 解決
(1).so檔案沒有被呼叫
在model下的build.gradle中的android內新增以下程式碼:
sourceSets { main { jniLibs.srcDirs = ['libs'] } }
(2)由AAR引起的
介紹一下.aar和jar包的不同之處:
.aar : 包含了整個專案的資源,res下的資原始檔和class檔案。
jar包,只有class檔案和清單檔案。
有時我們呼叫第三方時,第三方SDK是.aar字尾檔案,這時我們同時添加了.aar檔案和.so檔案時,可能會引起衝突,
這是由於當.aar內部的so檔案型別比外部.so檔案多時,會導致外部的so檔案找不到。
解決辦法:需要剔除.aar中不需要的.so檔案。
(3)載入不到檔案
手機也有32位和64位系統,當jnilibs中有多個資料夾,但其中的.so檔案不一樣多,不相同時,也會報.so檔案找不到。
這是由於32位的手機系統只會讀32位檔案中的.so包,執行不會有錯,因為一開始新增進來的都是加在32位中;但是當
64位手機系統來讀取時,會出現.so檔案找不到,這樣因為在相應的資料夾下沒有該.so檔案。
android studio jnilibs下各資料夾意義:
- armeabiv-v7a: 第7代及以上的 ARM 處理器。2011年15月以後的生產的大部分Android裝置都使用它.
- arm64-v8a: 第8代、64位ARM處理器,很少裝置,三星 Galaxy S6是其中之一。
- armeabi: 第5代、第6代的ARM處理器,早期的手機用的比較多。
- x86: 平板、模擬器用得比較多。
- x86_64: 64位的平板。
解決辦法:將jnilibs下各個檔案包中的.so檔案保持同樣的.so檔案。
還有一種情況,就是你的jnilibs下只有一個檔案包,這時候就需要新建對應的資料夾(一般是新建v7a和X86的),再將
所有的.so檔案複製貼上進去即可。
The end !