2015-06-18 85 views
0

在編譯Eclipse ADT/NDK中的native.cpp文件時出現錯誤。JNI中cv :: FileStorage的錯誤

雖然編譯下面的代碼行

FileStorage storage(nativepath, FileStorage::WRITE); 
storage << "img" << mat; 
storage.release(); 

的錯誤是

D:/androidworkspace/Augmented-Reality//obj/local/arm64-v8a/objs/ndksetup/native.o: In function Java_com_shahrukh_AugmentedReality_CAMShiftDetection_savemat(_JNIEnv*, _jobject*, long long, _jstring*)': D:\androidworkspace\Augmented-Reality/jni/native.cpp:14: undefined reference to cv::FileStorage::FileStorage(std::string const&, int, std::string const&)' D:/androidworkspace/Augmented-Reality//obj/local/arm64-v8a/objs/ndksetup/native.o: In function operator<<': D:/android-development/OpenCV-2.4.10-android-sdk/OpenCV-2.4.10-android-sdk/sdk/native/jni/include/opencv2/core/operations.hpp:2923: undefined reference to cv::operator<<(cv::FileStorage&, std::string const&)' D:/androidworkspace/Augmented-Reality//obj/local/arm64-v8a/objs/ndksetup/native.o: In function operator<< <cv::Mat>': D:/android-development/OpenCV-2.4.10-android-sdk/OpenCV-2.4.10-android-sdk/sdk/native/jni/include/opencv2/core/operations.hpp:2914: undefined reference to cv::write(cv::FileStorage&, std::string const&, cv::Mat const&)' D:/androidworkspace/Augmented-Reality//obj/local/arm64-v8a/objs/ndksetup/native.o: In function Java_com_shahrukh_AugmentedReality_CAMShiftDetection_savemat(_JNIEnv*, _jobject*, long long, _jstring*)': D:\androidworkspace\Augmented-Reality/jni/native.cpp:16: undefined reference to cv::FileStorage::release()' D:\androidworkspace\Augmented-Reality/jni/native.cpp:18: undefined reference to cv::FileStorage::~FileStorage()' D:/androidworkspace/Augmented-Reality//obj/local/arm64-v8a/objs/ndksetup/native.o: In function operator<< ': D:/android-development/OpenCV-2.4.10-android-sdk/OpenCV-2.4.10-android-sdk/sdk/native/jni/include/opencv2/core/operations.hpp:2913: undefined reference to cv::Exception::Exception(int, std::string const&, std::string const&, std::string const&, int)' D:/android-development/OpenCV-2.4.10-android-sdk/OpenCV-2.4.10-android-sdk/sdk/native/jni/include/opencv2/core/operations.hpp:2913: undefined reference to cv::error(cv::Exception const&)' D:/android-development/OpenCV-2.4.10-android-sdk/OpenCV-2.4.10-android-sdk/sdk/native/jni/include/opencv2/core/operations.hpp:2913: undefined reference to cv::Exception::~Exception()' D:/android-development/OpenCV-2.4.10-android-sdk/OpenCV-2.4.10-android-sdk/sdk/native/jni/include/opencv2/core/operations.hpp:2913: undefined reference to cv::Exception::~Exception()' D:/androidworkspace/Augmented-Reality//obj/local/arm64-v8a/objs/ndksetup/native.o: In function Java_com_shahrukh_AugmentedReality_CAMShiftDetection_savemat(_JNIEnv*, _jobject*, long long, _jstring*)': D:\androidworkspace\Augmented-Reality/jni/native.cpp:18: undefined reference to cv::FileStorage::~FileStorage()' collect2.exe: error: ld returned 1 exit status make.exe: *** [D:/androidworkspace/Augmented-Reality//obj/local/arm64-v8a/libndksetup.so] Error 1

這是我native.cpp文件

#include <jni.h> 
#include <stdio.h> 
#include <string.h> 
#include <android/log.h> 
#include <opencv2/core/core.hpp> 

using namespace cv; 

JNIEXPORT void Java_com_shahrukh_AugmentedReality_CAMShiftDetection_savemat(JNIEnv *env, jobject obj,jlong addrmat, jstring path) 
{ 
    const char *nativepath = env->GetStringUTFChars(path, 0); 
    Mat& mat = *(Mat*)addrmat; 

    FileStorage storage(nativepath, FileStorage::WRITE); 
    storage << "img" << mat; 
    storage.release(); 

    env->ReleaseStringUTFChars(path, nativepath); 
} 

這是我Android.mk文件

LOCAL_PATH := $(call my-dir) 

export OPENCV_PACKAGE_DIR = D:/android-development/OpenCV-2.4.10-android-sdk/OpenCV-2.4.10-android-sdk/sdk/native/jni 

include $(CLEAR_VARS) 
OPENCV_CAMERA_MODULES:=off 
include $(OPENCV_PACKAGE_DIR)/OpenCV.mk 

LOCAL_LDLIBS := -llog -ldl 

LOCAL_MODULE := ndksetup 
LOCAL_SRC_FILES := native.cpp 

include $(BUILD_SHARED_LIBRARY) 

這是我Application.mk

APP_STL := gnustl_static 
APP_CPPFLAGS := -frtti -fexceptions 
APP_ABI := all 

回答

0

經過大量的調試,我發現該錯誤是相當小

錯誤是在該行

LOCAL_LDLIBS := -llog -ldl 

的線路應有已被

LOCAL_LDLIBS += -llog -ldl