Android Studio 使用 System.loadLibrary()的一些问题

好了,其他的不说了,我来说一下我的问题吧,我现在加载一些.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,

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

* 如何正确的引用.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
复制代码

转载于:https://juejin.im/post/5c0fcb536fb9a049c2324889

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值