You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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{}配置块中,补充打包优先级规则:
    android {
        // 保留原有所有配置
        packagingOptions {
            pickFirst '**/libopencv_java3.so'
        }
    }
    
    该规则的作用是当多来源存在同路径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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 10:24:04