JNI 中 cv::FileStorage 的错误
Error for cv::FileStorage in JNI
我在 Eclipse ADT/NDK 中编译我的 native.cpp 文件时遇到错误 ADT/NDK。
编译以下代码行时
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
经过大量调试发现误差很小
错误在行
LOCAL_LDLIBS := -llog -ldl
该行应该是
LOCAL_LDLIBS += -llog -ldl
我在 Eclipse ADT/NDK 中编译我的 native.cpp 文件时遇到错误 ADT/NDK。
编译以下代码行时
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 functionoperator<<': 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 functionoperator<< <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 functionJava_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 tocv::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 tocv::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 tocv::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 functionJava_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
经过大量调试发现误差很小
错误在行
LOCAL_LDLIBS := -llog -ldl
该行应该是
LOCAL_LDLIBS += -llog -ldl