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
D:\adt-bundle-windows-x86_64-20140702\android-ndk-r10d\)D:\CODE\OpenCV-2.4.10-android-sdk\,下载链接D:\CODE\OpenCV-2.4.10\,下载链接实际上,我们只需要几个文件复制从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.
创建一个文件夹来保存我们的新项目libnonfree.so.在这里,我称之为libnonfree.jni在下创建一个文件夹libnonfree.将以下文件复制OpenCV-2.4.10\sources\modules\nonfree\src到libnonfree\jni\文件夹:
构建libnonfree.so:
创建Android.mk和Application.mk脚本.这Android.mk用于构建libnonfree.so.
OPENCV_PATH你的OpenCV-2.4.10-android-sdk位置)cd进入项目文件夹libnonfree并键入ndk-build以构建libnonfree.so.
到目前为止,你已经得到了libnonfree.so沿libopencv_java.so和libgnustl_shared.so在libnonfree\libs\armeabi-v7a文件夹中.
您可以使用这些库轻松构建任何SIFT或SURF应用程序.如果要在Android应用程序中的JAVA代码中使用SIFT和SURF,则只需要为要使用的函数编写JNI接口.
创建项目文件夹调用libnonfree_demo.jni在项目文件夹中创建一个文件夹.然后libnonfree.so一起复制libopencv_java.so并libgnustl_shared.so进入jni.
创建nonfree_jni.cpp在jni.这是简单的SIFT测试程序.它基本上读取图像并检测关键点,然后提取特征描述符,最后将关键点绘制到输出图像.
创建Android.mk和Application.mk内部jni:
OPENCV_PATH你的OpenCV-2.4.10-android-sdk位置)cd进入项目文件夹libnonfree_demo并键入ndk-build以构建libnonfree_demo.so.
此时,您可以轻松扩展示例应用程序SVMDetector.只需复制源文件和include文件诠释文件夹libnonfree_demo\jni和cpp文件添加到LOCAL_SRC_FILES在Android.mk.
整个来源可以从以下网址下载:https://github.com/bkornel/opencv_android_nonfree.
原始来源:http://web.guohuiwang.com/technical-notes/sift_surf_opencv_android
| 归档时间: |
|
| 查看次数: |
4910 次 |
| 最近记录: |