android public 库引起的dlopen 错误

以前在Android5.0上直接这样调用是没问题.

s_handle = dlopen("/system/lib/libHWMI.so", RTLD_NOW);

但是项目移植到Android 8.0上就报了如上错误.

说下解决方法,想知道原理的移步:http://jackwish.net/namespace-based-dynamic-linking.html

想看代码的话Android8.0是在: system/core/libnativeloader

其实错误log里面已经提示了,不过会有其它问题.

permitted_paths="/data:/mnt/expand:/data/data/org.ftd.gyn"

放在如上路径下面,虽然dlopen过了,但是报了其他的错误,如"libcutils.so" not found.

/data:/mnt/expand

如上所指的路径在文件system/core/libnativeloader/native_loader.cpp里面,在它的上面一行我们看到了

static constexpr const char* kPublicNativeLibrariesSystemConfigPathFromRoot =
        "/etc/public.libraries.txt";
static constexpr const char* kPublicNativeLibrariesVendorConfig =
        "/vendor/etc/public.libraries.txt";

系统的public native lib path: /system/etc/public.libraries.txt,

厂商的public native lib path: /vendor/etc/public.libraries.txt, 这个文件可能不存在, 没有的可以新建, 然后预置到vendor/etc/下面

因为我操作的是camera和vendor相关,所以在/vendor/etc/public.libraries.txt里面加入我的libHWMI.so, 然后就不报错了。
————————————————
版权声明:本文为CSDN博主「ngyzqf」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ngyzqf/article/details/78991929

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
dlopen() 函数是一个动态链接的加载函数,它用于在运行时加载动态链接,并返回相应的句柄。然而,当使用 dlopen() 函数时,可能会出现段错误。 段错误是一种在程序运行过程中出现的错误,它表示程序访问了无效的、未分配的、越界或者只读内存区域,导致程序崩溃。 造成 dlopen() 函数段错误的原因可能有以下几种: 1. 动态链接不存在或路径错误:如果指定的动态链接文件不存在或路径错误,调用 dlopen() 函数时就会出现段错误。 2. 动态链接缺少依赖关系:当动态链接缺少依赖的其他动态链接时,调用 dlopen() 函数可能会出现段错误。 3. 动态链接中存在错误:在编写动态链接时,如果存在错误或者内存越界的操作,使用 dlopen() 加载动态链接时就可能导致段错误。 解决 dlopen() 函数段错误的方法: 1. 确保动态链接存在且路径正确。 2. 检查动态链接的依赖关系,确保所有依赖的动态链接都存在。 3. 检查动态链接的代码,确保没有错误或者内存越界的操作。 4. 使用调试工具,如 gdb,来查找段错误的具体原因,定位问题所在。 5. 如果问题仍然存在,尝试使用其他加载动态链接的函数,如 dlfcn.h 头文件中的 dlsym() 函数。 总之,dlopen() 函数段错误往往是由于动态链接的问题所导致的,可以通过确认动态链接的存在、路径和依赖关系来解决。如仍无法解决,可以通过调试工具来定位问题所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值