Android Studio 使用 System.loadLibrary()的一些問題
阿新 • • 發佈:2019-02-19
我最近一直都更新的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包 *
- 加入.so包, 加到libs下面或回到jniLibs下
- 引用包,修改jniLibs的預設路徑為libs,直接修改build.gradle
android {
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
- 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