未定义的引用“简历:: initModule_nonfree()”在Android中 [英] Undefined Reference To 'cv::initModule_nonfree()' In 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的文件夹。然后,我编辑的Android.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!
推荐答案
- 的Android 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 -
我们实际上只需要从
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 toOpenCV-2.4.10-android-sdk
, namely:
Copy the nonfree folder fromOpenCV-2.4.10\sources\modules\nonfree\include\opencv2\
toOpenCV-2.4.10-android-sdk\sdk\native\jni\include\opencv2
.- <一个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)
- <一个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 yourOpenCV-2.4.10-android-sdk
is) -
创建项目文件夹调用
libnonfree_demo
。创建一个JNI
项目文件夹内的文件夹中。然后复制libnonfree.so
与libopencv_java.so
沿线和libgnustl_shared.so
到JNI
。 Create a project folder call
libnonfree_demo
. Create ajni
folder inside the project folder. Then copylibnonfree.so
along withlibopencv_java.so
andlibgnustl_shared.so
intojni
.- <一个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 yourOpenCV-2.4.10-android-sdk
is)
创建一个文件夹来保存我们的 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:
建筑 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
.
光盘
到项目文件夹 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在你的Android应用程序,你只需要编写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.
创建一个<一个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
:
光盘
到项目文件夹 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屋!