Неопределенная ссылка на 'cv :: initModule_nonfree ()' в Android
Я хочу создать приложение для Android, которое использует BOW + SVM на родном языке (используя C ++) для прогнозирования. К сожалению у меня проблема со сборкой родной части. Поскольку несвободный модуль не включен в OpenCV SDK для 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
Таким образом, проблема возникает здесь, когда мне нужно добавить этот .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)
Application.mk
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-15
Но это не работает. Когда я пытаюсь собрать приложение, я получаю следующую ошибку:
./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 и вот его содержимое:
#ifndef __OPENCV_NONFREE_HPP__
#define __OPENCV_NONFREE_HPP__
#include "opencv2/nonfree/features2d.hpp"
namespace cv
{
CV_EXPORTS_W bool initModule_nonfree();
}
#endif
Но я не уверен, что компоновщик знает, где находится реализация этого метода. Так как это дает ошибку, это не так.
РЕДАКТИРОВАТЬ
Если я добавлю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"...
Вы знаете, что я делаю не так? Заранее спасибо!