BOW + SVM をネイティブ (C++ を使用) で予測に使用する Android アプリを作成したいと考えています。残念ながら、ネイティブ部分の構築に問題があります。non-free モジュールは 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
したがって、この .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)
アプリケーション.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"...
私が間違っていることを知っていますか?前もって感謝します!