美文网首页
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