opencv3.3.0:对cv::imwrite-android的未定义引用



我面临错误的Android项目有OpenCV&一些用于图像处理的cpp类的自定义实现。我已经将opencv-3-3-0-android-sdk包含在用于构建本机组件的CMakeLists.txt中。

include_directories( ../opencv-3-3-0-android-sdk/sdk/native/jni/include/)
add_library( lib_opencv
SHARED
IMPORTED )
set_target_properties( lib_opencv
PROPERTIES IMPORTED_LOCATION
${PROJECT_SOURCE_DIR}/../opencv-3-3-0-android-sdk/sdk/native/libs/${ANDROID_ABI}/libopencv_java3.so )

当调用以下方法时,它抛出错误:

void saveMat(const cv::Mat& mat, std::string dst){
cv::imwrite(dst, mat);//throws error - undefined reference
}

在运行状态为无法引用imwrite的项目时出现以下错误。尽管

error: undefined reference to 'cv::imwrite(cv::String const&, cv::_InputArray const&, std::__ndk1::vector<int, std::__ndk1::allocator<int> > const&)'.

尽管在使用ctrl导航到该函数时,我确实找到了opencv2/imgcodecs.hpp中的适当函数。

CV_EXPORTS_W bool imwrite( const String& filename, InputArray img,
const std::vector<int>& params = std::vector<int>());

对我来说,这似乎是链接错误。你知道为什么在运行应用程序时会出现上述错误吗?

我也遇到过同样的问题,只是在OP发布3年后,我现在使用的是Android SDK的OpenCV 4.5.5版本。

链接错误的解决方案是确保CMake可以通过CMakeLists.txt 中的一点配置设置找到必要的库包

在OpenCV的旧版本中,该库可能已经作为单个大型(单片(库发布;lib_opencv";CMakeLists.txt引用的。

然而,OpenCV已经变得太大,无法将其全部集成到一个库中,当您的Android通过JNI加载库时,它会占用宝贵的内存,而内存是移动平台上的关键资源。因此,OpenCV目前提供了一个核心库和一些可选库/包。您将始终加载核心库,但只加载应用程序实际需要的可选包。

我的CMakeLists.txt看起来是这样的(注意,根据您的CMAKE和OpenCV版本,您可能需要不同的设置(:

project(mynativeapp)
cmake_minimum_required(VERSION 3.18)
set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv-mobile-4.5.5-android/sdk/native/jni)
# include any additional OpenCV package names in the argument list below:
find_package(OpenCV REQUIRED core imgproc imgcodecs)
add_library(mynativeapp SHARED mynativeapp.cpp myalgorithm.cpp ndkcamera.cpp)
target_link_libraries(mynativeapp ${OpenCV_LIBS} camera2ndk mediandk)

在我的例子中,当我将imgcodecs添加到find_package((参数列表时,链接错误就消失了。

最新更新