未定义的引用“简历:: initModule_nonfree()”在Android中简历、未定义、Android、initModule_nonfree

2023-09-07 08:35:06 作者:爱意藏眼底

我想创建一个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 \ ),Download链接 的OpenCV-2.4.10(安装路径: D:\ code \ OpenCV的-2.4.10 \ ),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

我们实际上只需要从 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

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:

nonfree_init.cpp $p$pcomp.hpp sift.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.

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

Excel定义名称引用的问题

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

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.

创建一个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

Application.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 和 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.

整个源代码可以从下载:https://github.com/bkornel/opencv_android_nonfree.

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

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

 
精彩推荐
图片推荐