1. 程式人生 > >Android Studio 使用 System.loadLibrary()的一些問題

Android Studio 使用 System.loadLibrary()的一些問題

我最近一直都更新的Andorid Studio 和sdk,我現在用的是3.6的Android Studio ,sdk的api已經更新到了27, andorid8.0

好了,其他的不說了,我來說一下我的問題吧,我現在載入一些.so包就出現瞭如下問題


     java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/device.android.com.hfdemo1-1/base.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_dependencies_apk.apk"
, zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_0_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_1_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_2_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_3_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_4_apk.apk"
, zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_5_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_6_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_7_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_8_apk.apk", zip file "/data/app/device.android.com.hfdemo1-1/split_lib_slice_9_apk.apk"
],nativeLibraryDirectories=[/data/app/device.android.com.hfdemo1-1/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libSerialPort.so" at java.lang.Runtime.loadLibrary(Runtime.java:367) at java.lang.System.loadLibrary(System.java:1076)

在api使用大於23了之後就有如下問題,或著引用沒有配置時也有如下問題


couldn't find "libSerialPort.so"
                      at java.lang.Runtime.loadLibrary(Runtime.java:367)
                      at java.lang.System.loadLibrary(System.java:1076)

* 現在解決第一個問題,API大於23時引用.so包問題 *

發生的環境:此類問題一般發生在 Android 6.0 及其以上的系統,具體也存在於其他的 api 版本,主要集中在 api >=23;

同一個 APP 在 api <=22 的 sdk 情況下編譯,可以執行正常,不存在閃退或者 .so 庫載入失敗的情況,當你採用 api >=23 的sdk 編譯的時候,安裝到 Android 6.0 及其以上的手機的時候,大範圍出現崩潰 或者 .so 庫載入失敗,而在 6.0 以下的手機卻正常;

Catch的資訊:dlopen failed: cannot locate symbol "XXXX" xxxx.so, XX 是泛配,此類崩潰資訊。

第一種,把你的 APK target API 先降低到 23以下,若不行再把 編譯時 API 降低到 23 以下,還出問題就繼續降低,這意味著,你很多 Android Sdk 的新控制元件用不了;

第二是你有.so檔案的原始碼,在 Application.mk 中修改 APP_STL,重新編譯 .so ,如果,我說如果你沒有原始碼,那麼悲劇了,要麼等他們解決,要麼採用第一種,建議嘗試,APP_STL := gnustl_shared,

  • * 如何正確的引用.so包 *
    1. 加入.so包, 加到libs下面或回到jniLibs下
    2. 引用包,修改jniLibs的預設路徑為libs,直接修改build.gradle
 android {
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
}
  1. java檔案載入包

private void load() {
       try {
           System.loadLibrary("xxxxx");

       } catch (Throwable e) {
           Log.d("zzzzz","載入xx庫異常 :"+e.toString());
       }
 }

還有一種就是適配機型要使用的各個cpu下都要加入一個.so包

                  |---arm64-v8a
                         |---xxxxx.so
                  |---armeabi
                         |---xxxxx.so
                  |---armeabi-v7a
                         |---xxxxx.so
                  |---x86
                         |---xxxxx.so
                  |---x86_64
                         |---xxxxx.so
                  |---mips
                         |---xxxxx.so
                  |---mips64
                         |---xxxxx.so