Java Opencv将Mat从Android传递到JNI错误
我查了所有的东西,但我不明白为什么我收到了致命信号11 Java方面:Java Opencv将Mat从Android传递到JNI错误,java,android,c++,opencv,java-native-interface,Java,Android,C++,Opencv,Java Native Interface,我查了所有的东西,但我不明白为什么我收到了致命信号11 Java方面: mRgba = inputFrame.rgba(); String nativeTesting = mNativeDetector.getFeatures(mRgba); Log.e(TAG, nativeTesting); // In another class public String getFeatures(Mat image) { Log.e("FRAME", " Rows:" +image.r
mRgba = inputFrame.rgba();
String nativeTesting = mNativeDetector.getFeatures(mRgba);
Log.e(TAG, nativeTesting);
// In another class
public String getFeatures(Mat image) {
Log.e("FRAME", " Rows:" +image.rows()); // This correctly returns the number of rows
String resultMsg = nativeFeatures(mNativeObj, image.getNativeObjAddr());
return resultMsg;
}
C++方面:
JNIEXPORT jstring JNICALL Java_com_example_myfacedetection_DetectionBasedTracker_nativeFeatures (JNIEnv* env, jclass, jlong image){
LOGD("NativeFeatures enter");
try {
Mat* frame = (Mat*) image;
// if (frame.empty()) // This also results in Fatal Signal
// LOGD("EMPTY FRAME");
LOGD("Size: %d", frame->rows);
}
catch(cv::Exception& e)
{
LOGD("nativeCreateObject caught cv::Exception: %s", e.what());
jclass je = env->FindClass("org/opencv/core/CvException");
if(!je)
je = env->FindClass("java/lang/Exception");
env->ThrowNew(je, e.what());
}
return (env)->NewStringUTF("Hello from JNI !");
}
我试图计算直方图,但任何对帧的访问都会导致SegFault。我做错了什么?问题
这里最可能的问题是Java中的本机方法声明(您没有列出)与JNI库中的签名不匹配
你称之为:
String resultMsg = nativeFeatures(mNativeObj, image.getNativeObjAddr())
所以您可能有(否则javac不会编译):
但在您的JNI库中,您有:
JNIEXPORT jstring JNICALL Java_{snip}_nativeFeatures (JNIEnv* env, jclass, jlong image)
因此,您将mNativeObj
传递到image
,将其投射到Mat
,并在实际尝试跟随指针时获得SIGSEGV
解决方案
要解决此问题,请更新方法签名以匹配。例如,如果不需要访问实例,请将静态方法设为nativeDetect(long image)
(并且不要将mNativeObj
传递给它)
注
您负责确保Java和C/C++源文件之间的方法签名匹配。无法判断参数或类型的数量不匹配。问题
这里最可能的问题是Java中的本机方法声明(您没有列出)与JNI库中的签名不匹配
你称之为:
String resultMsg = nativeFeatures(mNativeObj, image.getNativeObjAddr())
所以您可能有(否则javac不会编译):
但在您的JNI库中,您有:
JNIEXPORT jstring JNICALL Java_{snip}_nativeFeatures (JNIEnv* env, jclass, jlong image)
因此,您将mNativeObj
传递到image
,将其投射到Mat
,并在实际尝试跟随指针时获得SIGSEGV
解决方案
要解决此问题,请更新方法签名以匹配。例如,如果不需要访问实例,请将静态方法设为nativeDetect(long image)
(并且不要将mNativeObj
传递给它)
注
您负责确保Java和C/C++源文件之间的方法签名匹配。并且无法判断参数或类型的数量是否不匹配。您的本机函数只接受一个参数(a
long
),但您正在从Java代码中传递两个参数。根据您向我们展示的代码,我看不出您是如何得到不满意的链接错误的。JNI使用C链接(没有名称损坏),因此链接器只查找Java\u com\u示例\u myfacedetection\u DetectionBasedTracker\u nativeFeatures
,并找到它。您的本机函数只需要一个参数(along
),但是您正在从Java代码中传递两个参数。根据您向我们展示的代码,我看不出您是如何得到不满意的链接错误的。JNI使用C链接(没有名称损坏),因此链接器只查找Java\u com\u example\u myfacedetection\u DetectionBasedTracker\u nativeFeatures
,并找到它。您不能重载JNI方法。确实可以:“对于重载的本机方法,两个下划线(“”)后跟被损坏的参数签名“()啊,是的,但很明显,这只适用于首先重载的方法(Java端)。“不能重载JNI方法。”当然可以:“对于重载的本机方法,两个下划线(”)后面是被破坏的参数签名“z(),是的,但是很明显,这只适用于方法被重载的情况(Java端)。