【问题标题】:opencv3.3.0: undefined reference to cv::imwrite - androidopencv3.3.0:未定义对 cv::imwrite 的引用 - android
【发布时间】:2022-04-01 10:06:27
【问题描述】:

我面临错误的 Android 项目具有用于图像处理的一些 cpp 类的 OpenCV 和自定义实现。我在 CMakeLists.txt 中包含了 opencv-3-3-0-android-sdk,它用于构建原生组件。

 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>());

对我来说,这似乎是链接错误。有什么想法为什么在运行应用程序时会引发上述错误?

【问题讨论】:

  • 你的opencv是用gnu_stl构建的吗?您在本机代码中使用 c++_stl 吗?
  • @DmitriiZ。将 C++_Stl 用于本机代码。
  • 您需要在本机代码中使用 gnu_stl 或使用 c++_stl 构建 opencv。
  • @DmitriiZ。多谢,伙计。但我使用的是opencv-3-3-0-android-sdk,它是运行 make & make install 命令的输出。请多多指教。

标签: android android-studio opencv opencv4android


【解决方案1】:

我遇到了同样的问题,除了 OP 3 年后,我现在正在使用 4.5.5 版的 OpenCV for Android SDK。

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

在旧版本的 OpenCV 中,该库可能已作为单个大型(整体)库发布,即您的 CMakeLists.txt 引用的“lib_opencv”。

然而,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() 参数列表,链接错误就会消失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-25
    • 2015-09-25
    • 2014-06-24
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2019-06-29
    相关资源
    最近更新 更多