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的前边,警告信息消失。

你可能感兴趣的:(JNI,JNI,Android,OpenCL)