Android平台OpenCV 3.4.1编译失败:Stitcher函数未定义引用
解决Android项目中OpenCV Stitcher类的“未定义引用”错误
嘿,我来帮你搞定这个问题!你遇到的编译错误本质是你当前链接的libopencv_java3.so并没有包含Stitcher所属的stitching模块的原生实现——OpenCV Android SDK默认的Java绑定库只打包了核心模块的JNI接口,像Stitcher这种扩展模块得单独处理。
核心原因
libopencv_java3.so是为Java层调用OpenCV准备的,它只暴露了Java对应的JNI方法,并没有把stitching这类非核心模块的C++函数编译进去。所以当你在Native代码里直接调用cv::Stitcher的方法时,链接器找不到对应的函数定义,就会抛出“未定义引用”错误。
解决方案:链接OpenCV静态库
最直接的办法是直接链接OpenCV原生的静态库,这些库在你下载的OpenCV-android-sdk的sdk/native/libs/${ANDROID_ABI}/目录下(比如armeabi-v7a、arm64-v8a等)。修改你的CMakeLists.txt如下:
set(pathToProject C:/Users/Filip/AndroidStudioProjects/PanoStich) set(pathToOpenCV C:/Users/Filip/Downloads/OpenCV-android-sdk) cmake_minimum_required(VERSION 3.4.1) set(CMAKE_VERBOSE_MAKEFILE on) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11 -v") # 导入OpenCV头文件 include_directories(${pathToOpenCV}/sdk/native/jni/include/) # 定义OpenCV原生库的路径,自动匹配当前编译的ABI set(OPENCV_NATIVE_LIB_DIR ${pathToOpenCV}/sdk/native/libs/${ANDROID_ABI}) # 你的Native库 add_library(native-lib SHARED src/main/cpp/native-lib.cpp) # 导入Stitcher依赖的所有静态库(注意依赖顺序,底层库放后面) add_library(opencv_stitching STATIC IMPORTED) set_target_properties(opencv_stitching PROPERTIES IMPORTED_LOCATION ${OPENCV_NATIVE_LIB_DIR}/libopencv_stitching.a) add_library(opencv_calib3d STATIC IMPORTED) set_target_properties(opencv_calib3d PROPERTIES IMPORTED_LOCATION ${OPENCV_NATIVE_LIB_DIR}/libopencv_calib3d.a) add_library(opencv_features2d STATIC IMPORTED) set_target_properties(opencv_features2d PROPERTIES IMPORTED_LOCATION ${OPENCV_NATIVE_LIB_DIR}/libopencv_features2d.a) add_library(opencv_imgcodecs STATIC IMPORTED) set_target_properties(opencv_imgcodecs PROPERTIES IMPORTED_LOCATION ${OPENCV_NATIVE_LIB_DIR}/libopencv_imgcodecs.a) add_library(opencv_imgproc STATIC IMPORTED) set_target_properties(opencv_imgproc PROPERTIES IMPORTED_LOCATION ${OPENCV_NATIVE_LIB_DIR}/libopencv_imgproc.a) add_library(opencv_core STATIC IMPORTED) set_target_properties(opencv_core PROPERTIES IMPORTED_LOCATION ${OPENCV_NATIVE_LIB_DIR}/libopencv_core.a) # 查找系统log库 find_library(log-lib log) # 链接所有需要的库 target_link_libraries(native-lib opencv_stitching opencv_calib3d opencv_features2d opencv_imgcodecs opencv_imgproc opencv_core ${log-lib})
额外注意事项
- ABI匹配:确保你在Android Studio中设置的编译ABI(比如在
build.gradle的ndk.abiFilters)和OpenCV库的ABI目录一致,否则会出现找不到库的问题。 - 代码检查:确认你的
native-lib.cpp中正确包含了头文件:#include <opencv2/stitching.hpp>,并且使用了3.4.1版本正确的Stitcher创建方式:cv::Ptr<cv::Stitcher> stitcher = cv::Stitcher::createDefault(); - 日志排查:你已经开启了
CMAKE_VERBOSE_MAKEFILE on,可以查看编译输出的详细链接日志,确认所有需要的静态库都被正确引入了。
如果静态库方式还是有问题,你也可以尝试从OpenCV源码编译包含stitching模块的自定义动态库,不过这个步骤相对繁琐,适合需要定制模块的场景。
内容的提问来源于stack exchange,提问作者Filip Dospiva
相关产品推荐
相关产品推荐

