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时出错的主要内容,如果未能解决你的问题,请参考以下文章