Android N加载系统私有库时出现is not accessible for the namespace错误和针对该错误的解决方法

本文介绍在Android N及更高版本中加载系统私有库的解决方案,包括将所需库集成到应用程序中,并通过示例libOpenCL.so库演示具体步骤。

谷歌从Android N开始,除了那些在Android NDK提供的库之外,限制了应用对系统私有库的加载。既然是限制了,想通过以前的方法去加载库已经行不通了。所以目前的解决方法就是把应用需要加载的库和需要依赖的库从系统中pull出来,然后集成到自己的应用当中。本文是看了这篇文章才有的启发http://www.wtoutiao.com/p/2e2B7iw.html,并通过实践证实程序可以正确运行。本文以使用libOpenCL.so库为例进行说明。

这里先贴出如果在Android N 加载系统私有库提示的错误:

java.lang.UnsatisfiedLinkError: dlopen failed: library "libcutils.so"
("/system/lib/libcutils.so") needed or dlopened by "/system/lib/libnativeloader.so"
is not accessible for the namespace "classloader-namespace"
  at java.lang.Runtime.loadLibrary0(Runtime.java:977)
  at java.lang.System.loadLibrary(System.java:1602)

1、先从手机系统文件中pull出相关库(以libOpenCL.so为例)



2、导入到libs目录下,并使用System.loadLibrary("OpenCL")加载:



System.loadLibrary("OpenCL");
Note:我只用libOpenCL.so,但为什么我的arm64_v8a目录下还有那么多其他的库呢?如果你试着导入之后运行就会知道,使用OpenCL还要依赖其他很多的库,所以,我一并从手机文件系统中导出这些需要依赖的库。

3、使用dlopen 加载libOpenCL.so

我在另一篇文章中已经介绍了如何动态加载libOpenCL.so,大家可以移步到这里去学习: dlopen动态加载,这个链接的文章提供了一个demo,大家可以下载学习。这里顺便说明一下,在这个链接中介绍到,加载时要指定库的路径,那么针对这个情况,路径就直接这样子设定就可以了:
 dlopen("libOpenCL.so",RTLD_LAZY);

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值