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

Android JNI多库调用OpenCV报未定义引用错误如何解决

多JNI文件/多JNI库调用OpenCV配置修正方案

核心错误原因

你当前的问题本质是仅将OpenCV库链接到了第一个JNI库目标,新增的第二个JNI目标(对应新的cpp文件)没有关联OpenCV的符号库,所以只要新cpp调用OpenCV接口就会出现未定义引用报错。

具体修正步骤

  • 首先确认OpenCV的全局引入配置放在CMakeLists.txt最顶部,位于所有JNI目标声明之前,保证所有目标都能识别OpenCV变量:
# 示例配置,替换为你本地的OpenCV安卓SDK路径
set(OpenCV_DIR /path/to/opencv-android-sdk/sdk/native/jni)
find_package(OpenCV REQUIRED)
  • 方案1:多JNI独立库场景(每个cpp生成独立so)
    给每个用到OpenCV的JNI目标都单独添加OpenCV链接配置,示例如下:
# 第一个JNI库配置(原有逻辑,不需要修改)
add_library(
        first-lib
        SHARED
        first_activity_jni.cpp
)
target_link_libraries(first-lib ${OpenCV_LIBS} log)

# 第二个JNI库配置(新增OpenCV链接即可)
add_library(
        second-lib
        SHARED
        second_activity_jni.cpp
)
# 必须添加${OpenCV_LIBS}到第二个库的链接列表
target_link_libraries(second-lib ${OpenCV_LIBS} log)
  • 方案2:单JNI库拆分多cpp场景(更推荐,避免生成多个so)
    不需要新增多个add_library,直接把所有cpp文件加到同一个JNI目标的源文件列表即可,只需全局链接一次OpenCV:
add_library(
        native-lib
        SHARED
        first_activity_jni.cpp
        second_activity_jni.cpp # 直接追加新cpp路径即可
)
target_link_libraries(native-lib ${OpenCV_LIBS} log)

生效验证

  1. 清理Android Studio缓存:依次点击File -> Invalidate Caches,勾选清理构建缓存后重启IDE
  2. 重新执行项目构建,确认cv::Mat相关未定义引用报错消失
  3. 分别测试两个Activity的JNI调用,验证OpenCV功能正常运行

注意:OpenCV的链接配置不会自动在多个CMake目标间继承,只要是用到OpenCV接口的独立目标,都必须单独关联${OpenCV_LIBS}

内容的提问来源于stack exchange,提问作者mcy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:30:01