dlopen failed: library “libomp.so“ not found
解决dlopen failed: library "libomp.so" not found
1.问题描述
Android NDK开发时,如果开启多线程加速,需要用到openMP库,一些版本的差异,会出现dlopen failed: library "libomp.so" not found的错误,即找到libomp.so库
解决方法有两种方式
2.解决方法1
解决思路也很粗暴,直接将NDK里libomp.so拷贝到src/main/jniLibs或者libs,即可解决问题。
比如我使用的是NDK版本是:android-ndk-r21e,在该目录下搜索libomp.so,
至于拷贝哪个处理器版本,需要根据你的平台选择,一般在abiFilters会指定 "armeabi-v7a", "arm64-v8a"平台,拷贝对应的版本即可;如果不存在,可以复制其他平台的libomp.so代替试试。
拷贝的目的地址,由jniLibs.srcDirs指定so库的位置:
jniLibs.srcDirs = [src/main/jniLibs, libs]
举个例子:
比如将【aarch64】里面的libomp库复制到项目src/main/jniLibs中的 "armeabi-v7a", "arm64-v8a"目录下(目录不存在,则新建),然后再运行测试(大部分手机都可以这么解决) 如果还不能正常运行,则复制【arm】或者其他平台的libomp.so代替试试
3.解决方法2(不推荐)
为了减小APK的大小,项目只适配了【"armeabi-v7a", "arm64-v8a" 】处理器架构库,这会导致部分手机不支持。build完成后,在app/build/intermediates/cmake/debug/obj可查看到已经编译且支持库;其中libomp.so可能因为一些差异导致没有生成或者没有找到
解决方法:
先删除之前build的中间产物:把app/.cxx和app/build目录都删除掉 注释掉app/build.gradle文件中:abiFilters "armeabi-v7a", "arm64-v8a" (这样就会生成所有处理器架构库,但打包APK会比较大) 重新build,run 重新查看app/build/intermediates/cmake/debug/obj,发现已经支持【"armeabi-v7a", "arm64-v8a","x86","x86_64"】等库
