未定义的引用'cv :: initModule_nonfree()'在Android中

def*_*era 7 linker android opencv android-ndk opencv4android

我想创建一个Android应用程序,它使用原生(使用C++)BOW + SVM进行预测.不幸的是我在构建原生部分时遇到了问题.由于OpenCV SDK for Android中不包含非免费模块,因此我需要使用本教程自行构建模块.好像我成功构建了.so文件.这是输出:

[armeabi-v7a] Prebuilt       : libopencv_java.so <= /home/crash-id/Development/SDK/OpenCV-2.4.9-android-sdk/sdk/native/jni/../libs/armeabi-v7a/
[armeabi-v7a] SharedLibrary  : libnonfree.so
[armeabi-v7a] Install        : libnonfree.so => libs/armeabi-v7a/libnonfree.so
[armeabi-v7a] Install        : libopencv_java.so => libs/armeabi-v7a/libopencv_java.so
Run Code Online (Sandbox Code Playgroud)

所以当我必须将这个.so文件添加到我的项目时,问题就出现了.我将libnonfree.so添加到了我的jni文件夹中.然后我编辑了Android.mk.在这里,我提供我的.mk文件.

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := nonfree_prebuilt
LOCAL_SRC_FILES := libnonfree.so
include $(PREBUILT_SHARED_LIBRARY)


include $(CLEAR_VARS)
OPENCV_CAMERA_MODULES   := on
OPENCV_INSTALL_MODULES  := on

include /home/crash-id/Development/SDK/OpenCV-2.4.9-android-sdk/sdk/native/jni/OpenCV.mk
#LOCAL_SHARED_LIBRARIES := nonfree_prebuilt #if I add this, it says undefined reference for everything in the cv namespace.
LOCAL_SRC_FILES  := SVMDetector.cpp
LOCAL_MODULE     := svm_detector

LOCAL_C_INCLUDES        += /home/crash-id/Development/SDK/OpenCV-2.4.9-android-sdk/sdk/native/jni/include

LOCAL_CFLAGS            := -Werror -O3 -ffast-math 
LOCAL_LDLIBS            += -llog -ldl 

include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

Application.mk

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions

APP_ABI := armeabi-v7a

APP_PLATFORM := android-15
Run Code Online (Sandbox Code Playgroud)

但这不起作用.当我尝试构建应用程序时,出现以下错误:

./obj/local/armeabi-v7a/objs/svm_detector/SVMDetector.o: in function Java_org_elsys_thesisdiploma_cammect_FrameProcess_SVMDetect:jni/SVMDetector.cpp:23: error: undefined reference to 'cv::initModule_nonfree()'
Run Code Online (Sandbox Code Playgroud)

当我单击右键时initModule_nonfree();,Eclipse打开nonfree.hpp文件,这是它的内容:

#ifndef __OPENCV_NONFREE_HPP__
#define __OPENCV_NONFREE_HPP__

#include "opencv2/nonfree/features2d.hpp"

namespace cv
{

CV_EXPORTS_W bool initModule_nonfree();

}

#endif
Run Code Online (Sandbox Code Playgroud)

但是我不确定链接器知道这个方法的实现在哪里.由于它给出了错误,它没有.

编辑

如果我添加LOCAL_ALLOW_UNDEFINED_SYMBOLS := true,项目编译成功但会导致运行时错误:

 02-17 00:15:58.197: E/AndroidRuntime(8793): FATAL EXCEPTION: main
02-17 00:15:58.197: E/AndroidRuntime(8793): Process: com.example.cammect, PID: 8793
02-17 00:15:58.197: E/AndroidRuntime(8793): java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZN2cv18initModule_nonfreeEv" referenced by "libsvm_detector.so"...
Run Code Online (Sandbox Code Playgroud)

你知道我做错了什么吗?提前致谢!

Kor*_*nel 15

我的开发环境设置如下:

  • Android的NDK-r10d(安装路径:D:\adt-bundle-windows-x86_64-20140702\android-ndk-r10d\)
  • OpenCV-2.4.10-android-sdk(安装路径:) D:\CODE\OpenCV-2.4.10-android-sdk\,下载链接
  • OpenCV-2.4.10(安装路径:) D:\CODE\OpenCV-2.4.10\,下载链接

构建非自由模块

  1. 实际上,我们只需要几个文件复制从OpenCV-2.4.10源代码OpenCV-2.4.10-android-sdk,即:
    复制非免费从文件夹OpenCV-2.4.10\sources\modules\nonfree\include\opencv2\OpenCV-2.4.10-android-sdk\sdk\native\jni\include\opencv2.

  2. 创建一个文件夹来保存我们的新项目libnonfree.so.在这里,我称之为libnonfree.jni在下创建一个文件夹libnonfree.将以下文件复制OpenCV-2.4.10\sources\modules\nonfree\srclibnonfree\jni\文件夹:

  3. 构建libnonfree.so:
    创建Android.mkApplication.mk脚本.这Android.mk用于构建libnonfree.so.

    cd进入项目文件夹libnonfree并键入ndk-build以构建libnonfree.so.

到目前为止,你已经得到了libnonfree.so沿libopencv_java.solibgnustl_shared.solibnonfree\libs\armeabi-v7a文件夹中.
您可以使用这些库轻松构建任何SIFT或SURF应用程序.如果要在Android应用程序中的JAVA代码中使用SIFT和SURF,则只需要为要使用的函数编写JNI接口.

构建示例应用程序

  1. 创建项目文件夹调用libnonfree_demo.jni在项目文件夹中创建一个文件夹.然后libnonfree.so一起复制libopencv_java.solibgnustl_shared.so进入jni.

  2. 创建nonfree_jni.cppjni.这是简单的SIFT测试程序.它基本上读取图像并检测关键点,然后提取特征描述符,最后将关键点绘制到输出图像.

  3. 创建Android.mkApplication.mk内部jni:

    cd进入项目文件夹libnonfree_demo并键入ndk-build以构建libnonfree_demo.so.

此时,您可以轻松扩展示例应用程序SVMDetector.只需复制源文件和include文件诠释文件夹libnonfree_demo\jni和cpp文件添加到LOCAL_SRC_FILESAndroid.mk.

整个来源可以从以下网址下载:https://github.com/bkornel/opencv_android_nonfree.

原始来源:http://web.guohuiwang.com/technical-notes/sift_surf_opencv_android

  • @Kornel如何在Android的OpenCV 3.1中获取非免费的库? (2认同)