UnsatisfiedLinkError、couldn't find "xxx.so"

相關環境僅作參考

android 6.0.1
cpu 高通驍龍625 8核 2.0G
gradle 3.3
com.android.tools.build:gradle 2.2.3

錯誤日誌:

java.lang.UnsatisfiedLinkError: 
dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.telecom.video-1/base.apk"],
nativeLibraryDirectories=[/data/app/com.telecom.video-1/lib/arm64, /data/app/*packagename*-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] 
couldn't find "libijkffmpeg.so"

分析

項目目錄中的僅配置了armeabi-v7a目錄

../lib
    |-armeabi-v7a
            |-libijkffmpeg.so
            |-..

從日誌中看到虛擬機加載了/lib/arm64 和 /lib/arm64-v8a,沒有/lib/armeabi-v7a,不科學啊

對生成的apk分析

apk中lib/
      |-armeabi-v7a
          |-libijkffmpeg.so
          |-libsophix
          |-..
      |-x86_64
          |-libsophix
      |-arm64-v8a
          |-libsophix
      |-armeabi
          |-libsophix
      |-x86
          |-libsophix

發現存在多個cpu兼容目錄,而我們只兼容armeabi-v7a,根據apk發現其中的libsophix是項目中的一個依賴其包含了多個兼容庫被一起打包到了apk中,這裏根據項目的情況只想要一個兼容庫。

解決

我在build.gradle中這樣配置,增加了過濾設置cpu兼容:

android {
    defaultConfig {
        ndk {
            abiFilter "armeabi-v7a" //, "armeabi", "x86" 按需設置
        }
    }
}

然後再次分析apk,其僅兼容armeabi-v7a了:

apk中lib/
      |-armeabi-v7a
             |-libijkffmpeg.so
             |-libsophix.so
             |-..

虛擬機加載so庫時,如果發現arm64-v8a目錄,就只加載arm64-v8a目錄(但是爲啥還有個arm64目錄?)
arm64-v8a中顯然沒有目標so,所以報錯。其實還可以將armeabi-v7a中的so文件copy到arm64-v8a中,但不是個好方法,因爲我們的目標是兼容armeabi-v7a,不同的cpu版本有不同的開發接口。

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