Android Studio原生项目配置OpenCV3.4.14的libopencv_java3.so重复构建错误
集成OpenCV 3.4.14时重复SO文件构建错误解决方法
错误场景
在搭载原生C++支持的Android Studio 4.0.0项目中配置OpenCV 3.4.14,构建时触发报错:
More than one file was found with OS independent path 'lib/arm64-v8a/libopencv_java3.so'
执行失败的任务为:app:mergeDebugNativeLibs,错误提示明确指向jniLibs与CMake IMPORTED目标的SO打包冲突。
冲突根因
构建打包阶段libopencv_java3.so存在多个同源可打包路径,Android Gradle Plugin无法自动判定打包优先级,触发冲突:
- 配置CMake时,通过IMPORTED目标引用了放置在
app/src/main/jniLibs目录下的OpenCV SO文件,AGP会自动将CMake关联的SO纳入打包范围 - 作为模块依赖导入的
openCVLibrary3414库,本身内置全ABI版本的libopencv_java3.so,会通过依赖链路进入主项目打包流程 - 两个来源的SO文件在打包映射中的路径完全一致,触发文件重复检测拦截
分步解决操作
- 清理冗余SO文件
打开项目路径app/src/main/jniLibs,删除所有ABI子目录下的libopencv_java3.so文件。这部分SO已经由OpenCV库模块提供,不需要单独在jniLibs目录放置拷贝。 - 调整CMake的OpenCV SO引用路径
原有CMake配置为从项目本地jniLibs目录加载SO,修改为直接从本地OpenCV SDK路径引用:
找到配置块:
替换为:set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)
注意保持set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${pathToOpenCv}/sdk/native/libs/${ANDROID_ABI}/libopencv_java3.so)pathToOpenCv变量的路径与本地OpenCV Android SDK的解压路径一致。 - 增加打包去重规则
在app模块的build.gradle的android{}配置块中,补充打包优先级规则:
该规则的作用是当多来源存在同路径SO时,自动选择第一个匹配的文件完成打包,避免构建中断。android { // 保留原有所有配置 packagingOptions { pickFirst '**/libopencv_java3.so' } } - 移除重复的SO加载逻辑
OpenCV库模块本身会自动完成libopencv_java3.so的加载,不需要在业务代码中手动加载。找到MainActivity中的静态加载块:
删除static { System.loadLibrary("native-lib"); System.loadLibrary("opencv_java3"); }System.loadLibrary("opencv_java3")这一行,避免运行时出现SO重复加载错误。
注意:所有配置调整完成后,需要执行一次Clean Project清理旧构建缓存,再重新发起构建。
内容的提问来源于stack exchange,提问作者Daniel Rotnemer
相关产品推荐
相关产品推荐

