Java Opencv将Mat从Android传递到JNI错误

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

我查了所有的东西,但我不明白为什么我收到了致命信号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.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
,并找到它。您的本机函数只需要一个参数(a
long
),但是您正在从Java代码中传递两个参数。根据您向我们展示的代码,我看不出您是如何得到不满意的链接错误的。JNI使用C链接(没有名称损坏),因此链接器只查找
Java\u com\u example\u myfacedetection\u DetectionBasedTracker\u nativeFeatures
,并找到它。您不能重载JNI方法。确实可以:“对于重载的本机方法,两个下划线(“”)后跟被损坏的参数签名“()啊,是的,但很明显,这只适用于首先重载的方法(Java端)。“不能重载JNI方法。”当然可以:“对于重载的本机方法,两个下划线(”)后面是被破坏的参数签名“z(),是的,但是很明显,这只适用于方法被重载的情况(Java端)。