Undefined Verweis auf 'cv :: initModule_nonfree ()' in Android
Ich möchte eine Android-App erstellen, die BOW + SVM in native (mit C ++) für die Vorhersage verwendet. Leider habe ich Probleme beim Erstellen des nativen Teils. Da das unfreie Modul nicht im OpenCV SDK für Android enthalten ist, muss ich das Modul selbst mit @ erstelledieses Tutorial. Es scheint, dass ich die .so-Datei erfolgreich erstellt habe. Hier ist die Ausgabe:
[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 kommt das Problem hier, wenn ich diese .so-Datei meinem Projekt hinzufügen muss. Ich habe libnonfree.so zu meinem jni-Ordner hinzugefügt. Dann habe ich die Android.mk bearbeitet. Hier stelle ich meine .mk-Dateien zur Verfügung.
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
Aber das funktioniert nicht. Wenn ich versuche, die App zu erstellen, wird folgende Fehlermeldung angezeigt:
./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()'
Wenn ich mit der rechten Maustaste auf @ klicinitModule_nonfree();
, Eclipse öffnet die nonfree.hpp-Datei und hier ist der Inhalt:
#ifndef __OPENCV_NONFREE_HPP__
#define __OPENCV_NONFREE_HPP__
#include "opencv2/nonfree/features2d.hpp"
namespace cv
{
CV_EXPORTS_W bool initModule_nonfree();
}
#endif
Aber ich bin nicht sicher, ob der Linker weiß, wo die Implementierung dieser Methode ist. Da es einen Fehler gibt, tut es das nicht.
BEARBEITE
Wenn ich @ hinzufüLOCAL_ALLOW_UNDEFINED_SYMBOLS := true
, das Projekt wird erfolgreich kompiliert, verursacht jedoch einen Laufzeitfehler:
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"...
Weißt du was ich falsch mache? Danke im Voraus