问题
Following is the Android.mk file of my android application in eclipse.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_CAMERA_MODULES := off
OPENCV_MK_PATH:=C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk
OPENCV_LIB_TYPE:=STATIC
OPENCV_INSTALL_MODULES:=on
include $(OPENCV_MK_PATH)
#Profiler
#-include android-ndk-profiler.mk
#include ../includeOpenCV.mk
#ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
# #try to load OpenCV.mk from default install location
# include $(TOOLCHAIN_PREBUILT_ROOT)/user/share/OpenCV/OpenCV.mk
#else
# include $(OPENCV_MK_PATH)
#endif
LOCAL_C_INCLUDES := C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include
LOCAL_MODULE := native_wallet
LOCAL_SRC_FILES := jni_recognizer.cpp NativeVision/vision.cpp
LOCAL_CFLAGS=-ffast-math -O3 -funroll-loops
#LOCAL_CFLAGS=-O3 -funroll-loops
LOCAL_LDLIBS += -llog -ldl
#Profiling
#LOCAL_CFLAGS := -pg
#LOCAL_STATIC_LIBRARIES := andprof
include $(BUILD_SHARED_LIBRARY)
After updating the opencv_mk_path and local_c_includes, the application is not compiling through ndk. I have tried every possible solution but no luck. Following are the errors that occured:
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml
[armeabi-v7a] Compile++ thumb: native_wallet <= jni_recognizer.cpp
jni/jni_recognizer.cpp: In function 'void Java_com_ndu_mobile_darwinwallet_Recognizer_nvTrainImage(JNIEnv*, jobject, jstring, jstring)':
jni/jni_recognizer.cpp:18:88: warning: format not a string literal and no format arguments [-Wformat-security]
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "JNI_DEBUGGING", __VA_ARGS__)
^
jni/jni_recognizer.cpp:78:3: note: in expansion of macro 'LOGD'
LOGD( out.str().c_str() );
^
jni/jni_recognizer.cpp:18:88: warning: format not a string literal and no format arguments [-Wformat-security]
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "JNI_DEBUGGING", __VA_ARGS__)
^
jni/jni_recognizer.cpp:89:3: note: in expansion of macro 'LOGD'
LOGD( out.str().c_str() );
^
jni/jni_recognizer.cpp: In function '_jstring* Java_com_ndu_mobile_darwinwallet_Recognizer_nvRecognize(JNIEnv*, jobject, jint, jint, jbyteArray)':
jni/jni_recognizer.cpp:18:88: warning: format not a string literal and no format arguments [-Wformat-security]
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "JNI_DEBUGGING", __VA_ARGS__)
^
jni/jni_recognizer.cpp:216:4: note: in expansion of macro 'LOGD'
LOGD( (char*) out.str().c_str());
^
[armeabi-v7a] Compile++ thumb: native_wallet <= vision.cpp
jni/NativeVision/vision.cpp: In function 'cv::Ptr<cv::ORB> getQueryDetector()':
jni/NativeVision/vision.cpp:18:76: error: cannot allocate an object of abstract type 'cv::ORB'
Ptr<ORB> detector1 = new ORB(DEFAULT_QUERY_FEATURES, 1.2f, 5U, 10, 1, 2);
^
In file included from C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/calib3d.hpp:48:0,
from C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/calib3d/calib3d.hpp:48,
from jni/NativeVision/vision.h:2,
from jni/NativeVision/vision.cpp:1:
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:254:20: note: because the following virtual functions are pure within 'cv::ORB':
class CV_EXPORTS_W ORB : public Feature2D
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:292:26: note: virtual void cv::ORB::setMaxFeatures(int)
CV_WRAP virtual void setMaxFeatures(int maxFeatures) = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:293:25: note: virtual int cv::ORB::getMaxFeatures() const
CV_WRAP virtual int getMaxFeatures() const = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:295:26: note: virtual void cv::ORB::setScaleFactor(double)
CV_WRAP virtual void setScaleFactor(double scaleFactor) = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:296:28: note: virtual double cv::ORB::getScaleFactor() const
CV_WRAP virtual double getScaleFactor() const = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:298:26: note: virtual void cv::ORB::setNLevels(int)
CV_WRAP virtual void setNLevels(int nlevels) = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:299:25: note: virtual int cv::ORB::getNLevels() const
CV_WRAP virtual int getNLevels() const = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:301:26: note: virtual void cv::ORB::setEdgeThreshold(int)
CV_WRAP virtual void setEdgeThreshold(int edgeThreshold) = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:302:25: note: virtual int cv::ORB::getEdgeThreshold() const
CV_WRAP virtual int getEdgeThreshold() const = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:304:26: note: virtual void cv::ORB::setFirstLevel(int)
CV_WRAP virtual void setFirstLevel(int firstLevel) = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:305:25: note: virtual int cv::ORB::getFirstLevel() const
CV_WRAP virtual int getFirstLevel() const = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:307:26: note: virtual void cv::ORB::setWTA_K(int)
CV_WRAP virtual void setWTA_K(int wta_k) = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:308:25: note: virtual int cv::ORB::getWTA_K() const
CV_WRAP virtual int getWTA_K() const = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:310:26: note: virtual void cv::ORB::setScoreType(int)
CV_WRAP virtual void setScoreType(int scoreType) = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:311:25: note: virtual int cv::ORB::getScoreType() const
CV_WRAP virtual int getScoreType() const = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:313:26: note: virtual void cv::ORB::setPatchSize(int)
CV_WRAP virtual void setPatchSize(int patchSize) = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:314:25: note: virtual int cv::ORB::getPatchSize() const
CV_WRAP virtual int getPatchSize() const = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:316:26: note: virtual void cv::ORB::setFastThreshold(int)
CV_WRAP virtual void setFastThreshold(int fastThreshold) = 0;
^
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:317:25: note: virtual int cv::ORB::getFastThreshold() const
CV_WRAP virtual int getFastThreshold() const = 0;
^
jni/NativeVision/vision.cpp: In function 'cv::Ptr<cv::ORB> getTrainerDetector(int)':
jni/NativeVision/vision.cpp:29:76: error: cannot allocate an object of abstract type 'cv::ORB'
Ptr<ORB> detector2 = new ORB(DEFAULT_QUERY_FEATURES, 1.2f, 5U, 10, 1, 2);
^
In file included from C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/calib3d.hpp:48:0,
from C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/calib3d/calib3d.hpp:48,
from jni/NativeVision/vision.h:2,
from jni/NativeVision/vision.cpp:1:
C:\Users\rabbia\Downloads\OpenCV300androidsdk1\OpenCV-android-sdk\sdk\native\jni\include/opencv2/features2d.hpp:254:20: note: since type 'cv::ORB' has pure virtual functions
class CV_EXPORTS_W ORB : public Feature2D
^
jni/NativeVision/vision.cpp: In function 'cv::Mat trainImage(const cv::Mat&, cv::Ptr<cv::ORB>&, cv::Ptr<cv::DescriptorMatcher>&)':
jni/NativeVision/vision.cpp:149:24: error: 'class cv::ORB' has no member named 'operator()'
detector->operator()( img, cv::noArray(), keypoints, descriptors, false );
^
jni/NativeVision/vision.cpp: In function 'RecognitionResult recognize(const cv::Mat&, bool, cv::Mat*, cv::Ptr<cv::ORB>&, cv::Ptr<cv::DescriptorMatcher>&, std::vector<std::basic_string<char> >&, bool, int*)':
jni/NativeVision/vision.cpp:177:24: error: 'class cv::ORB' has no member named 'operator()'
detector->operator()( queryImg, cv::noArray(), queryKeypoints, queryDescriptors, false );
^
make.exe: *** [obj/local/armeabi-v7a/objs/native_wallet/NativeVision/vision.o] Error 1
Please help me out with this.
回答1:
for
LOGD(), useLOGD("%s", out.str().c_str());to get
Ptr<ORB> detector1, you should useORB::create(), notnew ORB().
来源:https://stackoverflow.com/questions/33256159/android-ndk-giving-errors-while-compiling-in-eclipse