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,

注:如果要重新编译可以去这里看看 http://www.cnblogs.com/linguanh/p/4624768.html

  • * 如何正确的引用.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

你可能感兴趣的:(Android)