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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:09:28