Android JNI中使用了libOpenCL.so,依赖libGLES_mali.so,但是link时出错

Posted GreenArrowMan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android JNI中使用了libOpenCL.so,依赖libGLES_mali.so,但是link时出错相关的知识,希望对你有一定的参考价值。

欢迎关注公众号可以查看更多完整文章

我在JNI项目中使用到了OpenCL并行计算,对项目中的亿级别的for循环计算,进行优化。

本身在PC上Debug时需要运行260s,在android上需要运行13s的计算过程,在Android上使用OpenCL后,可以将计算耗时提升到20ms,提升了几百倍的速度,运行效率达到了可以让项目落地实施的程度。

使用的libOpenCL.so是Android系统中自带的,一般在目录system/vendor/lib64下。

使用OpenCL库,还需要一些其他的库,基本上都在上述目录下。如果没有,可以看下/system/lib64目录下。

在Android工程编译的过程中,遇到了一个警告信息:

/system/vendor/lib64/egl/libGLES_mali.so" ("/vendor/lib64/egl/libGLES_mali.so") needed or dlopened by "/data/app/com.numericcal.ocl_peak-1/lib/arm64/libOpenCL.so" is not accessible for the namespace: [name="classloader-namespace"

这个问题是Android系统做的限制,在Android N以上系统引用系统so时,有可能会出现这个问题。

查了网上的解决方法:

1.使用动态加载dlopen;

2.把库拷贝到Android lib64目录下,一起打包;

我已经按照上述第二种方案进行操作,但是还是有警告信息。

查了好多资料,也没有得到解决。

最后经过摸索:修改了Android.mk中lib的引用顺序,将libGLES_mali.so放在了libOpenCL.so的前边,警告信息消失。

以上是关于Android JNI中使用了libOpenCL.so,依赖libGLES_mali.so,但是link时出错的主要内容,如果未能解决你的问题,请参考以下文章

Android中JNI的使用

android中使用jni对字符串加解密实现分析

Android 动态注册JNI函数

Android JNI编程—JNI基础

Android JNI 使用总结

实例详解Android中JNI的使用方法