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)
生效验证
- 清理Android Studio缓存:依次点击
File->Invalidate Caches,勾选清理构建缓存后重启IDE - 重新执行项目构建,确认cv::Mat相关未定义引用报错消失
- 分别测试两个Activity的JNI调用,验证OpenCV功能正常运行
注意:OpenCV的链接配置不会自动在多个CMake目标间继承,只要是用到OpenCV接口的独立目标,都必须单独关联${OpenCV_LIBS}
内容的提问来源于stack exchange,提问作者mcy
相关产品推荐
相关产品推荐

