美文网首页
Android 加载so异常笔记

Android 加载so异常笔记

作者: silencefun | 来源:发表于2020-02-11 13:19 被阅读0次

记得以前有这个笔记 找不到了,从新记录。

0x00 ① is not accessible for the namespace

library "/system/lib/libcrypto.so" needed or dlopened by "/system/lib/libnativeload.so" is not accessible for the namespace:"classloader-namespace"

场景:项目要接入海康摄像头(在家办公事情也多的无语凝噎)
使用海康sdk 跑通demo后项目中移植,在初始化sdk报异常。

排查过程:

猜想1:没有做android 10的适配,是在华为手机android10 做的测试,但是demo跑通排除。
猜想2:引用cpu架构指令集.so文件缺失,但是想到那个错误不应该是这样的,还是把所有的.so全复制一份,无效。
猜想3:项目其他依赖中的重名.so文件引起的,排查没有。

ok那就先百度,再谷歌。

1.直接百度,发现大多类似都是出自android N 版本之后的安装时复制系统.so文件出现这种错误。
参见Android 7.0 行为变更NDK 应用链接至平台库

"为降低此限制可能对当前发布的应用的影响,面向 API 级别 23 或更低级别的应用在 Android N 上可暂时访问颇为常用的一组库,例如 libandroid_runtime.so、libcutils.so、libcrypto.so 和 libssl.so。如果您的应用加载其中某个库,logcat 会生成一个警告,并在目标设备上显示一个 Toast 来通知您。如果您看到这些警告,您应更新您的应用以添加该应用自己的库副本,或仅使用公开 NDK API。将来发布的 Android 平台可能会完全限制对私有库的使用,并导致您的应用崩溃。"

里面果然有libcrypto.so报错的这个动态链接库文件。

2.查看源码

在jar 包hik.common.isms.hpsclient.HPSClient的68-79行

  static {
    int var0;
    if ((var0 = VERSION.SDK_INT) != 21 && var0 != 22) {
        System.loadLibrary("crypto");
        System.loadLibrary("ssl");
    }

    System.loadLibrary("hpr");
    System.loadLibrary("HPSClient");
    System.loadLibrary("SystemTransform");
    System.loadLibrary("HPSClientSDK");
}

简单的看出是做了版本检查控制,想想这大厂这点处理肯定做了。

3.最终解决办法:
想到权限问题会不会是文件路径不对,果然,
现有项目jinlibs 的路径不是默认的在build.gradle 中定义

 sourceSets {
   main {
      jniLibs.srcDirs = ['libs']
          }
   }

默认的libs只是存放jar包,libs路径在module根目录下的和src目录同级的。


image.png

so文件的iniLibs 路径其实在main包下的和java res平级的目录。
更改为默认路径,成功。


image.png

相关文章

网友评论

      本文标题:Android 加载so异常笔记

      本文链接:https://www.haomeiwen.com/subject/thqlxhtx.html