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

谷歌从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为例)

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

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

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

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


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

3、使用dlopen 加载libOpenCL.so

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

你可能感兴趣的:(android开发笔记)