【问题标题】:OpenCV Android C++ imwrite not found未找到 OpenCV Android C++ imwrite
【发布时间】:2020-10-27 19:34:00
【问题描述】:

我在我的安卓应用中使用 OpenCV C++

我的代码正在构建并且运行良好,直到我添加了这一行 cv::imwrite(result_uri, result_image).

注意:cv:imread 正在工作

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

OpenCV 3.4.10,Ndk 21

我错过了什么? 谢谢

编辑

我正在使用Android.mk 文件:

# ./android/app/src/main/jni/Android.mk

# Set up paths
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

# Specify module name for System.loadLibrary() call
LOCAL_MODULE := helloworld
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES

# Debug mode
NDK_DEBUG=1

# Specify C++ flags
LOCAL_CPPFLAGS := -std=c++17
LOCAL_CPPFLAGS += -fexceptions
LOCAL_CPPFLAGS += -frtti
LOCAL_CPPFLAGS += -Wall
LOCAL_CPPFLAGS += -Wextra
LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/../../../../../djinni/jni
LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/../../../../../djinni/cpp
LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/../../../../../node_modules/djinni/support-lib/jni
LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/../../../../../node_modules/djinni/support-lib
LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/../../../../../src/cpp

# Specify source files
LOCAL_SRC_FILES += $(LOCAL_PATH)/../../../../../djinni/jni/NativeHelloWorld.cpp
LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../src/cpp/*.cpp)
LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../node_modules/djinni/support-lib/jni/*.cpp)
LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../node_modules/djinni/support-lib/*.cpp)

# load opencv
OPENCVROOT:= /Users/Gasp/Library/OpenCV/OpenCV-android-sdk
OPENCV_CAMERA_MODULES:=off
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
OPENCV_INSTALL_MODULES:=on
# LOCAL_STATIC_LIBRARIES += libopencv_contrib libopencv_legacy libopencv_ml libopencv_stitching libopencv_nonfree libopencv_objdetect libopencv_videostab libopencv_calib3d libopencv_photo libopencv_video libopencv_features2d libopencv_highgui libopencv_androidcamera libopencv_flann libopencv_imgproc libopencv_ts libopencv_core
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk


LOCAL_MODULE := helloworld

# Specify C++ flags
LOCAL_CPPFLAGS := -lopencv_imgcodecs
LOCAL_CPPFLAGS := -std=c++17
LOCAL_CPPFLAGS += -fexceptions
LOCAL_CPPFLAGS += -frtti
LOCAL_CPPFLAGS += -Wall
LOCAL_CPPFLAGS += -Wextra
LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/../../../../../djinni/jni
LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/../../../../../djinni/cpp
LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/../../../../../node_modules/djinni/support-lib/jni
LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/../../../../../node_modules/djinni/support-lib
LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/../../../../../src/cpp


# Specify source files
LOCAL_SRC_FILES += $(LOCAL_PATH)/../../../../../djinni/jni/NativeHelloWorld.cpp
LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../src/cpp/*.cpp)
LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../node_modules/djinni/support-lib/jni/*.cpp)
LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/../../../../../node_modules/djinni/support-lib/*.cpp)


# Telling make to build the library
include $(BUILD_SHARED_LIBRARY)

【问题讨论】:

    标签: android c++ opencv opencv3.0 opencv4android


    【解决方案1】:

    我假设您使用 CMake 来构建 OpenCV 库。根据这个问题:undefined reference to 'cv::imwrite with Android NDK,需要添加编译器标志才能使此功能可用:-lopencv_imgcodecs

    在您的 Android.mk 文件中,只需确保将其附加到您的 LOCAL_CPPFLAGS 变量:

    # Specify C++ flags
    LOCAL_CPPFLAGS := -std=c++17
    LOCAL_CPPFLAGS += -lopencv_imgcodecs  # Note - change is here
    LOCAL_CPPFLAGS += -fexceptions
    LOCAL_CPPFLAGS += -frtti
    LOCAL_CPPFLAGS += -Wall
    LOCAL_CPPFLAGS += -Wextra
    LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/../../../../../djinni/jni
    LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/../../../../../djinni/cpp
    LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/../../../../../node_modules/djinni/support-lib/jni
    LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/../../../../../node_modules/djinni/support-lib
    LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/../../../../../src/cpp
    

    完成此更改后,重新配置项目并尝试再次构建源代码。确保在尝试重新配置项目之前清除构建目录中的缓存,否则上面所做的更改将不会生效。

    【讨论】:

    • 非常感谢您的回答。抱歉,这是我的错,我没有表明我使用的是 Android.mk 而不是 Cmake 我遵循了这篇中等帖子的模板 link 你有解决方案吗?还是我需要切换到 CMake ?
    • 啊哈,所以在您的 Android.mk 文件中,只需添加:LOCAL_CPPFLAGS := -lopencv_imgcodecs
    • 我已经添加了LOCAL_CPPFLAGS := -lopencv_imgcodecs,但问题仍然存在:error: undefined reference to 'cv::imwrite(cv::String const&, cv::_InputArray... 如果你看到一些愚蠢的东西,我已经用 Android.mk 文件的内容编辑了问题,谢谢!
    • 亲爱的,我已经用# Specify C++ flags LOCAL_CPPFLAGS := -std=c++17 LOCAL_CPPFLAGS += -lopencv_imgcodecs ... 更新了我的Android.mk 我有hoverer 仍然是同样的问题error: undefined reference to 'cv::imwrite 使用Android 工作室我做了一个Build > Clean Project Invalidate Cache Restart,还有另一个大大地 ?再次感谢?
    【解决方案2】:

    其他尝试:

    我尝试切换到 OpenCV android 4.3.0

    在构建期间没有更多关于未定义引用的错误。

    在运行时悬停该行:

    frame = cv::imread(trim_uri_protocal(uri), cv::IMREAD_COLOR);

    (同时适用于 OpenCV android 3.4.10 和 iOS 上的 OpenCV)

    导致此错误 E/libc++abi: terminating with uncaught exception of type std::bad_cast: std::bad_cast

    也许一个想法来解决这个问题?

    【讨论】:

      猜你喜欢
      • 2015-05-26
      • 2019-02-15
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      相关资源
      最近更新 更多