我最近一直都更新的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,
注:如果要重新编译可以去这里看看 http://www.cnblogs.com/linguanh/p/4624768.html
- * 如何正确的引用.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