Android 加载so异常笔记
记得以前有这个笔记 找不到了,从新记录。
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