未定义的引用“简历:: initModule_nonfree()”在Android中 [英] Undefined Reference To 'cv::initModule_nonfree()' In Android

查看:1399
本文介绍了未定义的引用“简历:: initModule_nonfree()”在Android中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个Android应用程序,它使用BOW + SVM在本地(用C ++)为predicting。不幸的是我有问题,建立本土的一部分。由于非自由的模块不包含在OpenCV的SDK为Android,我需要建立自己的模块,使用的本教程。看来我成功地构建了.so文件。下面是输出:

I want to create an Android app which uses BOW + SVM in native (using C++) for predicting. Unfortunately I have problem with building the native part. Since the non-free module is not included in the OpenCV SDK for Android, I need to build the module myself, using this tutorial. It seems I built the .so file successfully. Here is the output:

[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

于是问题就来了这里,当我有这个.so文件添加到我的项目。我说libnonfree.so到我的JNI的文件夹。然后,我编辑的Andr​​oid.mk。在这里,我提供我的.mk文件。

So the problem comes here, when I have to add this .so file to my project. I added libnonfree.so to my jni folder. Then I edited the Android.mk. Here I provide my .mk files.

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)

Application.mk

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions

APP_ABI := armeabi-v7a

APP_PLATFORM := android-15

但是,这并不正常工作。当我尝试建立的应用程序,我得到以下错误:

But this doesn't work. When I try to build the app, I get the following error:

./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()'

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

When I click right button on initModule_nonfree();, Eclipse opens the nonfree.hpp file and here are it's contents:

#ifndef __OPENCV_NONFREE_HPP__
#define __OPENCV_NONFREE_HPP__

#include "opencv2/nonfree/features2d.hpp"

namespace cv
{

CV_EXPORTS_W bool initModule_nonfree();

}

#endif

但我不知道链接器知道哪里是这种方法的实现。因为它给出了一个错误,它没有。

But I'm not sure the linker knows where is the implementation of this method. Since it gives an error, it doesn't.

修改

如果我加入 LOCAL_ALLOW_UNDEFINED_SYMBOLS:= TRUE ,该项目编译成功,但它会导致运行时错误:

If I add LOCAL_ALLOW_UNDEFINED_SYMBOLS := true, the project compiles successfully but it causes run time error:

 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"...

你知道我在做什么错了?在此先感谢!

Do you know what am I doing wrong? Thanks in advance!

推荐答案

  • 的Andr​​oid NDK-r10d(安装路径: D:\ ADT-束的Windows x86_64-20140702 \ Android的NDK-r10d \
  • OpenCV的-2.4.10-Android的SDK(安装路径: D:\ code \ OpenCV的-2.4.10-Android的SDK \ ),<一个href="https://sourceforge.net/projects/opencvlibrary/files/opencv-android/2.4.10/OpenCV-2.4.10-android-sdk.zip/download">Download链接
  • 的OpenCV-2.4.10(安装路径: D:\ code \ OpenCV的-2.4.10 \ ),<一个href="https://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.10/opencv-2.4.10.exe/download">Download链接

My development environment is set up as follows:

  • android-ndk-r10d (install path: D:\adt-bundle-windows-x86_64-20140702\android-ndk-r10d\)
  • OpenCV-2.4.10-android-sdk (install path: D:\CODE\OpenCV-2.4.10-android-sdk\), Download link
  • OpenCV-2.4.10 (install path: D:\CODE\OpenCV-2.4.10\), Download link
    1. 我们实际上只需要从 OpenCV的-2.4.10 源$ C ​​$ C复制一些文件到 OpenCV的-2.4。 10,Android的SDK ,即:
      OpenCV的-2.4.10复制非自由文件夹\ \源模块\非自由\包括\ opencv2 \ OpenCV的-2.4.10-Android的SDK \ SDK \本地\ JNI \包括\ opencv2

    1. We actually only need to copy a few files from OpenCV-2.4.10 source code to OpenCV-2.4.10-android-sdk, namely:
      Copy the nonfree folder from OpenCV-2.4.10\sources\modules\nonfree\include\opencv2\ to OpenCV-2.4.10-android-sdk\sdk\native\jni\include\opencv2.

    创建一个文件夹来保存我们的 libnonfree.so 新项目。在这里,我把它叫做 libnonfree 。创建一个 JNI libnonfree 文件夹。从 OpenCV的-2.4.10 \来源\模块\非自由的\ src libnonfree \ JNI \ 文件夹中复制以下文件

    Create a folder to hold our new project for libnonfree.so. Here, I call it libnonfree. Create a jni folder under libnonfree. Copy the following files from OpenCV-2.4.10\sources\modules\nonfree\src to libnonfree\jni\ folder:

    • <一个href="https://github.com/bkornel/opencv_android_nonfree/blob/master/libnonfree/jni/nonfree_init.cpp">nonfree_init.cpp
    • <一个href="https://github.com/bkornel/opencv_android_nonfree/blob/master/libnonfree/jni/$p$pcomp.hpp">$p$pcomp.hpp
    • <一个href="https://github.com/bkornel/opencv_android_nonfree/blob/master/libnonfree/jni/sift.cpp">sift.cpp (使用原始文件的)
    • <一个href="https://github.com/bkornel/opencv_android_nonfree/blob/master/libnonfree/jni/surf.cpp">surf.cpp (使用原始文件的)
    • nonfree_init.cpp
    • precomp.hpp
    • sift.cpp (use the original file)
    • surf.cpp (use the original file)

    建筑 libnonfree.so
    创建 Android.mk Application.mk 脚本。这 Android.mk 是用来建立 libnonfree.so

    Building libnonfree.so:
    Create Android.mk and Application.mk scripts. This Android.mk is used to build libnonfree.so.

    • <一个href="https://github.com/bkornel/opencv_android_nonfree/blob/master/libnonfree/jni/Application.mk">Application.mk
    • <一个href="https://github.com/bkornel/opencv_android_nonfree/blob/master/libnonfree/jni/Android.mk">Android.mk (你应该修改 OPENCV_PATH ,你的 OpenCV的-2.4.10-Android的SDK 是)
    • Application.mk
    • Android.mk (you should modify OPENCV_PATH where your OpenCV-2.4.10-android-sdk is)

    光盘到项目文件夹 libnonfree 键,键入 NDK建造 libnonfree.so

    cd into the project folder libnonfree and type ndk-build to build the libnonfree.so.

    到目前为止,你已经得到了 libnonfree.so 以及 libopencv_java.so libgnustl_shared.so libnonfree \库\ armeabi-V7A 文件夹。 您可以轻松地构建使用这些库中的任何SIFT或SURF应用。如果你想使用SIFT和SURF在JAVA code在你的Andr​​oid应用程序,你只需要编写JNI接口要使用的功能。

    So far, you have got libnonfree.so along with libopencv_java.so and libgnustl_shared.so in libnonfree\libs\armeabi-v7a folder.
    You can easily build any SIFT or SURF applications using those libraries. If you want to use SIFT and SURF in JAVA code in your Android application, you only need to write JNI interfaces for the functions you want to use.

    1. 创建项目文件夹调用 libnonfree_demo 。创建一个 JNI 项目文件夹内的文件夹中。然后复制 libnonfree.so libopencv_java.so 沿线和 libgnustl_shared.so JNI

    1. Create a project folder call libnonfree_demo. Create a jni folder inside the project folder. Then copy libnonfree.so along with libopencv_java.so and libgnustl_shared.so into jni.

    创建一个<一个href="https://github.com/bkornel/opencv_android_nonfree/blob/master/libnonfree_demo/jni/nonfree_jni.cpp">nonfree_jni.cpp在 JNI 。这是简单的SIFT测试程序。它基本上读取图像并检测关键点,然后提取特征描述符,最后得出的关键点,以输出图像。

    Create a nonfree_jni.cpp in jni. It is simple SIFT test program. It basically reads an image and detects the keypoints, then extracts feature descriptors, finally draws the keypoints to an output image.

    创建 Android.mk Application.mk JNI

    • <一个href="https://github.com/bkornel/opencv_android_nonfree/blob/master/libnonfree_demo/jni/Application.mk">Application.mk
    • <一个href="https://github.com/bkornel/opencv_android_nonfree/blob/master/libnonfree_demo/jni/Android.mk">Android.mk (你应该修改 OPENCV_PATH ,你的 OpenCV的-2.4.10-Android的SDK 是)
    • Application.mk
    • Android.mk (you should modify OPENCV_PATH where your OpenCV-2.4.10-android-sdk is)

    光盘到项目文件夹 libnonfree_demo 键,键入 NDK建造 libnonfree_demo.so

    cd into the project folder libnonfree_demo and type ndk-build to build the libnonfree_demo.so.

    在这一点上,你可以很容易地扩展示例应用程序与你的 SVMDetector 。只需复制源和包含文件诠释到文件夹 libnonfree_demo \ JNI 和<$ C添加CPP文件 LOCAL_SRC_FILES $ C> Android.mk 。

    At this point you can easily extend the sample app with your SVMDetector. Just copy the source and include files int to the folder libnonfree_demo\jni and add cpp files to LOCAL_SRC_FILES in Android.mk.

    整个源代码可以从下载:<一href="https://github.com/bkornel/opencv_android_nonfree">https://github.com/bkornel/opencv_android_nonfree.

    The whole source can be downloaded from: https://github.com/bkornel/opencv_android_nonfree.

    原始来源:<一href="http://web.guohuiwang.com/technical-notes/sift_surf_opencv_android">http://web.guohuiwang.com/technical-notes/sift_surf_opencv_android

    这篇关于未定义的引用“简历:: initModule_nonfree()”在Android中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆