无法在Java中释放Mat对象

无法在Java中释放Mat对象,java,c++,opencv,java-native-interface,Java,C++,Opencv,Java Native Interface,我试图使用JNI将Mat对象从C++传递到Java。我查看了OpenCV Java dll的源代码,使用的代码与OpenCV使用的完全相同。当我想从Java中释放一个由OpenCV Java API创建的Mat对象时,它可以正常工作,但当我想释放一个使用相同代码创建的Mat对象时,我的应用程序崩溃 我正在发布我正在使用的代码。如果有人有想法,我将不胜感激。提前谢谢 [编辑] 我还想补充一点,如果你看代码块3和4,爪哇和C++边的函数定义有相同的函数名,ReaDimeG0,但是在C++和1中,函数

我试图使用JNI
Mat
对象从C++传递到Java。我查看了OpenCV Java dll的源代码,使用的代码与OpenCV使用的完全相同。当我想从Java中释放一个由OpenCV Java API创建的
Mat
对象时,它可以正常工作,但当我想释放一个使用相同代码创建的
Mat
对象时,我的应用程序崩溃

我正在发布我正在使用的代码。如果有人有想法,我将不胜感激。提前谢谢

[编辑]

我还想补充一点,如果你看代码块3和4,爪哇和C++边的函数定义有相同的函数名,ReaDimeG0,但是在C++和1中,函数名称在其名称、IMDeLe11和IimeRe1中有额外的1,这两个函数是如何链接的?也许有一个额外的层,我不知道

[/EDIT]

[EDIT2]

在Windows7、VC11上运行时,使用OpenCV 2.4.5和2.4.8进行了尝试

[/EDIT2]

1。这是在OpenCV源代码中传递<代码> Mat < /Cord>对象的C++代码:< /St>>/P>
JNIEXPORT jlong JNICALL Java_org_opencv_highgui_Highgui_imread_11 (JNIEnv*, jclass, jstring);

JNIEXPORT jlong JNICALL Java_org_opencv_highgui_Highgui_imread_11
  (JNIEnv* env, jclass , jstring filename)
{
    static const char method_name[] = "highgui::imread_11()";
    try {
        LOGD("%s", method_name);
        const char* utf_filename = env->GetStringUTFChars(filename, 0); std::string n_filename( utf_filename ? utf_filename : "" ); env->ReleaseStringUTFChars(filename, utf_filename);
        Mat _retval_ = cv::imread( n_filename );
        return (jlong) new Mat(_retval_);
    } catch(const std::exception &e) {
        throwJavaException(env, &e, method_name);
    } catch (...) {
        throwJavaException(env, 0, method_name);
    }
    return 0;
}
public static Mat imread(String filename)
{
     Mat retVal = new Mat(imread_1(filename));
     return retVal;
}

private static native long imread_1(String filename);
JNIEXPORT jlong JNICALL Java_tr_com_guney_opencvcpp2java_OpenCVCpp2Java_readImage0(JNIEnv *env, jclass, jstring imagePath)

JNIEXPORT jlong JNICALL Java_tr_com_guney_opencvcpp2java_OpenCVCpp2Java_readImage0(JNIEnv *env, jclass, jstring imagePath)
{   
    static const char method_name[] = "OpenCVCpp2Java::readImage0()";
    try {
        LOGD("%s", method_name);
        const char* utf_filename = env->GetStringUTFChars(imagePath, 0); std::string n_filename( utf_filename ? utf_filename : "" );  env->ReleaseStringUTFChars(imagePath, utf_filename);
        cv::Mat _retval_ = cv::imread( n_filename );
        return (jlong) new cv::Mat(_retval_);
    } catch(const std::exception &e) {
        throwJavaException(env, &e, method_name);
    } catch (...) {
        throwJavaException(env, 0, method_name);
    }
    return 0;
}
public static Mat readImage(String imagePath) 
{
     Mat retVal = new Mat(readImage0(imagePath));
     return retVal;
}

private static native long readImage0(String imagePath);
Mat image = Highgui.imread("e:/image.png"); //this works fine
Highgui.imwrite("e:/imageJava.png", image); // this is to check if image is read correctly and works fine
image.release(); // this works fine
//system.gc(); // this also works fine

Mat image2 = OpenCVCpp2Java.readImage("e:/image.png"); //this works fine
Highgui.imwrite("e:/imageJava2.png", image2); // this is to check if image is read correctly and works fine
image2.release(); // this throws exception!
//system.gc(); // this causes application to crash!
Exception in thread "main" java.lang.Exception: Unknown exception in JNI code {Mat::n_1release()}
    at org.opencv.core.Mat.n_release(Native Method)
    at org.opencv.core.Mat.release(Mat.java:1875)
Stack: [0x28880000,0x288d0000],  sp=0x288cf620,  free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [ntdll.dll+0x2e3be]  RtlInitUnicodeString+0x196
C  [ntdll.dll+0x2e023]  RtlFreeHeap+0x7e
C  [kernel32.dll+0x114ad]  HeapFree+0x14
C  [opencv_java245.dll+0x48e877]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x429a47
C  [opencv_java245.dll+0x904f3]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x2b6c3
C  [opencv_java245.dll+0x6516a]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x33a
j  org.opencv.core.Mat.n_delete(J)V+0
j  org.opencv.core.Mat.finalize()V+4
v  ~StubRoutines::call_stub
V  [jvm.dll+0xfb88b]
V  [jvm.dll+0x18d551]
V  [jvm.dll+0xfb90d]
V  [jvm.dll+0x96301]
V  [jvm.dll+0x990c9]
C  [java.dll+0x2100]  Java_java_lang_ref_Finalizer_invokeFinalizeMethod+0x39
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+24
v  ~StubRoutines::call_stub
V  [jvm.dll+0xfb88b]
V  [jvm.dll+0x18d551]
V  [jvm.dll+0xfba31]
V  [jvm.dll+0xfba8b]
V  [jvm.dll+0xb5e89]
V  [jvm.dll+0x119b74]
V  [jvm.dll+0x14217c]
C  [msvcr71.dll+0x9565]  endthreadex+0xa0
C  [kernel32.dll+0x1336a]  BaseThreadInitThunk+0x12
C  [ntdll.dll+0x39f72]  RtlInitializeExceptionChain+0x63
C  [ntdll.dll+0x39f45]  RtlInitializeExceptionChain+0x36

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  org.opencv.core.Mat.n_delete(J)V+0
j  org.opencv.core.Mat.finalize()V+4
v  ~StubRoutines::call_stub
j  java.lang.ref.Finalizer.invokeFinalizeMethod(Ljava/lang/Object;)V+0
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+24
v  ~StubRoutines::call_stub
2。这是OpenCV源代码中的Java代码:

JNIEXPORT jlong JNICALL Java_org_opencv_highgui_Highgui_imread_11 (JNIEnv*, jclass, jstring);

JNIEXPORT jlong JNICALL Java_org_opencv_highgui_Highgui_imread_11
  (JNIEnv* env, jclass , jstring filename)
{
    static const char method_name[] = "highgui::imread_11()";
    try {
        LOGD("%s", method_name);
        const char* utf_filename = env->GetStringUTFChars(filename, 0); std::string n_filename( utf_filename ? utf_filename : "" ); env->ReleaseStringUTFChars(filename, utf_filename);
        Mat _retval_ = cv::imread( n_filename );
        return (jlong) new Mat(_retval_);
    } catch(const std::exception &e) {
        throwJavaException(env, &e, method_name);
    } catch (...) {
        throwJavaException(env, 0, method_name);
    }
    return 0;
}
public static Mat imread(String filename)
{
     Mat retVal = new Mat(imread_1(filename));
     return retVal;
}

private static native long imread_1(String filename);
JNIEXPORT jlong JNICALL Java_tr_com_guney_opencvcpp2java_OpenCVCpp2Java_readImage0(JNIEnv *env, jclass, jstring imagePath)

JNIEXPORT jlong JNICALL Java_tr_com_guney_opencvcpp2java_OpenCVCpp2Java_readImage0(JNIEnv *env, jclass, jstring imagePath)
{   
    static const char method_name[] = "OpenCVCpp2Java::readImage0()";
    try {
        LOGD("%s", method_name);
        const char* utf_filename = env->GetStringUTFChars(imagePath, 0); std::string n_filename( utf_filename ? utf_filename : "" );  env->ReleaseStringUTFChars(imagePath, utf_filename);
        cv::Mat _retval_ = cv::imread( n_filename );
        return (jlong) new cv::Mat(_retval_);
    } catch(const std::exception &e) {
        throwJavaException(env, &e, method_name);
    } catch (...) {
        throwJavaException(env, 0, method_name);
    }
    return 0;
}
public static Mat readImage(String imagePath) 
{
     Mat retVal = new Mat(readImage0(imagePath));
     return retVal;
}

private static native long readImage0(String imagePath);
Mat image = Highgui.imread("e:/image.png"); //this works fine
Highgui.imwrite("e:/imageJava.png", image); // this is to check if image is read correctly and works fine
image.release(); // this works fine
//system.gc(); // this also works fine

Mat image2 = OpenCVCpp2Java.readImage("e:/image.png"); //this works fine
Highgui.imwrite("e:/imageJava2.png", image2); // this is to check if image is read correctly and works fine
image2.release(); // this throws exception!
//system.gc(); // this causes application to crash!
Exception in thread "main" java.lang.Exception: Unknown exception in JNI code {Mat::n_1release()}
    at org.opencv.core.Mat.n_release(Native Method)
    at org.opencv.core.Mat.release(Mat.java:1875)
Stack: [0x28880000,0x288d0000],  sp=0x288cf620,  free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [ntdll.dll+0x2e3be]  RtlInitUnicodeString+0x196
C  [ntdll.dll+0x2e023]  RtlFreeHeap+0x7e
C  [kernel32.dll+0x114ad]  HeapFree+0x14
C  [opencv_java245.dll+0x48e877]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x429a47
C  [opencv_java245.dll+0x904f3]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x2b6c3
C  [opencv_java245.dll+0x6516a]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x33a
j  org.opencv.core.Mat.n_delete(J)V+0
j  org.opencv.core.Mat.finalize()V+4
v  ~StubRoutines::call_stub
V  [jvm.dll+0xfb88b]
V  [jvm.dll+0x18d551]
V  [jvm.dll+0xfb90d]
V  [jvm.dll+0x96301]
V  [jvm.dll+0x990c9]
C  [java.dll+0x2100]  Java_java_lang_ref_Finalizer_invokeFinalizeMethod+0x39
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+24
v  ~StubRoutines::call_stub
V  [jvm.dll+0xfb88b]
V  [jvm.dll+0x18d551]
V  [jvm.dll+0xfba31]
V  [jvm.dll+0xfba8b]
V  [jvm.dll+0xb5e89]
V  [jvm.dll+0x119b74]
V  [jvm.dll+0x14217c]
C  [msvcr71.dll+0x9565]  endthreadex+0xa0
C  [kernel32.dll+0x1336a]  BaseThreadInitThunk+0x12
C  [ntdll.dll+0x39f72]  RtlInitializeExceptionChain+0x63
C  [ntdll.dll+0x39f45]  RtlInitializeExceptionChain+0x36

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  org.opencv.core.Mat.n_delete(J)V+0
j  org.opencv.core.Mat.finalize()V+4
v  ~StubRoutines::call_stub
j  java.lang.ref.Finalizer.invokeFinalizeMethod(Ljava/lang/Object;)V+0
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+24
v  ~StubRoutines::call_stub
3。这是我的代码:

JNIEXPORT jlong JNICALL Java_org_opencv_highgui_Highgui_imread_11 (JNIEnv*, jclass, jstring);

JNIEXPORT jlong JNICALL Java_org_opencv_highgui_Highgui_imread_11
  (JNIEnv* env, jclass , jstring filename)
{
    static const char method_name[] = "highgui::imread_11()";
    try {
        LOGD("%s", method_name);
        const char* utf_filename = env->GetStringUTFChars(filename, 0); std::string n_filename( utf_filename ? utf_filename : "" ); env->ReleaseStringUTFChars(filename, utf_filename);
        Mat _retval_ = cv::imread( n_filename );
        return (jlong) new Mat(_retval_);
    } catch(const std::exception &e) {
        throwJavaException(env, &e, method_name);
    } catch (...) {
        throwJavaException(env, 0, method_name);
    }
    return 0;
}
public static Mat imread(String filename)
{
     Mat retVal = new Mat(imread_1(filename));
     return retVal;
}

private static native long imread_1(String filename);
JNIEXPORT jlong JNICALL Java_tr_com_guney_opencvcpp2java_OpenCVCpp2Java_readImage0(JNIEnv *env, jclass, jstring imagePath)

JNIEXPORT jlong JNICALL Java_tr_com_guney_opencvcpp2java_OpenCVCpp2Java_readImage0(JNIEnv *env, jclass, jstring imagePath)
{   
    static const char method_name[] = "OpenCVCpp2Java::readImage0()";
    try {
        LOGD("%s", method_name);
        const char* utf_filename = env->GetStringUTFChars(imagePath, 0); std::string n_filename( utf_filename ? utf_filename : "" );  env->ReleaseStringUTFChars(imagePath, utf_filename);
        cv::Mat _retval_ = cv::imread( n_filename );
        return (jlong) new cv::Mat(_retval_);
    } catch(const std::exception &e) {
        throwJavaException(env, &e, method_name);
    } catch (...) {
        throwJavaException(env, 0, method_name);
    }
    return 0;
}
public static Mat readImage(String imagePath) 
{
     Mat retVal = new Mat(readImage0(imagePath));
     return retVal;
}

private static native long readImage0(String imagePath);
Mat image = Highgui.imread("e:/image.png"); //this works fine
Highgui.imwrite("e:/imageJava.png", image); // this is to check if image is read correctly and works fine
image.release(); // this works fine
//system.gc(); // this also works fine

Mat image2 = OpenCVCpp2Java.readImage("e:/image.png"); //this works fine
Highgui.imwrite("e:/imageJava2.png", image2); // this is to check if image is read correctly and works fine
image2.release(); // this throws exception!
//system.gc(); // this causes application to crash!
Exception in thread "main" java.lang.Exception: Unknown exception in JNI code {Mat::n_1release()}
    at org.opencv.core.Mat.n_release(Native Method)
    at org.opencv.core.Mat.release(Mat.java:1875)
Stack: [0x28880000,0x288d0000],  sp=0x288cf620,  free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [ntdll.dll+0x2e3be]  RtlInitUnicodeString+0x196
C  [ntdll.dll+0x2e023]  RtlFreeHeap+0x7e
C  [kernel32.dll+0x114ad]  HeapFree+0x14
C  [opencv_java245.dll+0x48e877]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x429a47
C  [opencv_java245.dll+0x904f3]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x2b6c3
C  [opencv_java245.dll+0x6516a]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x33a
j  org.opencv.core.Mat.n_delete(J)V+0
j  org.opencv.core.Mat.finalize()V+4
v  ~StubRoutines::call_stub
V  [jvm.dll+0xfb88b]
V  [jvm.dll+0x18d551]
V  [jvm.dll+0xfb90d]
V  [jvm.dll+0x96301]
V  [jvm.dll+0x990c9]
C  [java.dll+0x2100]  Java_java_lang_ref_Finalizer_invokeFinalizeMethod+0x39
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+24
v  ~StubRoutines::call_stub
V  [jvm.dll+0xfb88b]
V  [jvm.dll+0x18d551]
V  [jvm.dll+0xfba31]
V  [jvm.dll+0xfba8b]
V  [jvm.dll+0xb5e89]
V  [jvm.dll+0x119b74]
V  [jvm.dll+0x14217c]
C  [msvcr71.dll+0x9565]  endthreadex+0xa0
C  [kernel32.dll+0x1336a]  BaseThreadInitThunk+0x12
C  [ntdll.dll+0x39f72]  RtlInitializeExceptionChain+0x63
C  [ntdll.dll+0x39f45]  RtlInitializeExceptionChain+0x36

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  org.opencv.core.Mat.n_delete(J)V+0
j  org.opencv.core.Mat.finalize()V+4
v  ~StubRoutines::call_stub
j  java.lang.ref.Finalizer.invokeFinalizeMethod(Ljava/lang/Object;)V+0
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+24
v  ~StubRoutines::call_stub
4。这是我的Java代码:

JNIEXPORT jlong JNICALL Java_org_opencv_highgui_Highgui_imread_11 (JNIEnv*, jclass, jstring);

JNIEXPORT jlong JNICALL Java_org_opencv_highgui_Highgui_imread_11
  (JNIEnv* env, jclass , jstring filename)
{
    static const char method_name[] = "highgui::imread_11()";
    try {
        LOGD("%s", method_name);
        const char* utf_filename = env->GetStringUTFChars(filename, 0); std::string n_filename( utf_filename ? utf_filename : "" ); env->ReleaseStringUTFChars(filename, utf_filename);
        Mat _retval_ = cv::imread( n_filename );
        return (jlong) new Mat(_retval_);
    } catch(const std::exception &e) {
        throwJavaException(env, &e, method_name);
    } catch (...) {
        throwJavaException(env, 0, method_name);
    }
    return 0;
}
public static Mat imread(String filename)
{
     Mat retVal = new Mat(imread_1(filename));
     return retVal;
}

private static native long imread_1(String filename);
JNIEXPORT jlong JNICALL Java_tr_com_guney_opencvcpp2java_OpenCVCpp2Java_readImage0(JNIEnv *env, jclass, jstring imagePath)

JNIEXPORT jlong JNICALL Java_tr_com_guney_opencvcpp2java_OpenCVCpp2Java_readImage0(JNIEnv *env, jclass, jstring imagePath)
{   
    static const char method_name[] = "OpenCVCpp2Java::readImage0()";
    try {
        LOGD("%s", method_name);
        const char* utf_filename = env->GetStringUTFChars(imagePath, 0); std::string n_filename( utf_filename ? utf_filename : "" );  env->ReleaseStringUTFChars(imagePath, utf_filename);
        cv::Mat _retval_ = cv::imread( n_filename );
        return (jlong) new cv::Mat(_retval_);
    } catch(const std::exception &e) {
        throwJavaException(env, &e, method_name);
    } catch (...) {
        throwJavaException(env, 0, method_name);
    }
    return 0;
}
public static Mat readImage(String imagePath) 
{
     Mat retVal = new Mat(readImage0(imagePath));
     return retVal;
}

private static native long readImage0(String imagePath);
Mat image = Highgui.imread("e:/image.png"); //this works fine
Highgui.imwrite("e:/imageJava.png", image); // this is to check if image is read correctly and works fine
image.release(); // this works fine
//system.gc(); // this also works fine

Mat image2 = OpenCVCpp2Java.readImage("e:/image.png"); //this works fine
Highgui.imwrite("e:/imageJava2.png", image2); // this is to check if image is read correctly and works fine
image2.release(); // this throws exception!
//system.gc(); // this causes application to crash!
Exception in thread "main" java.lang.Exception: Unknown exception in JNI code {Mat::n_1release()}
    at org.opencv.core.Mat.n_release(Native Method)
    at org.opencv.core.Mat.release(Mat.java:1875)
Stack: [0x28880000,0x288d0000],  sp=0x288cf620,  free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [ntdll.dll+0x2e3be]  RtlInitUnicodeString+0x196
C  [ntdll.dll+0x2e023]  RtlFreeHeap+0x7e
C  [kernel32.dll+0x114ad]  HeapFree+0x14
C  [opencv_java245.dll+0x48e877]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x429a47
C  [opencv_java245.dll+0x904f3]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x2b6c3
C  [opencv_java245.dll+0x6516a]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x33a
j  org.opencv.core.Mat.n_delete(J)V+0
j  org.opencv.core.Mat.finalize()V+4
v  ~StubRoutines::call_stub
V  [jvm.dll+0xfb88b]
V  [jvm.dll+0x18d551]
V  [jvm.dll+0xfb90d]
V  [jvm.dll+0x96301]
V  [jvm.dll+0x990c9]
C  [java.dll+0x2100]  Java_java_lang_ref_Finalizer_invokeFinalizeMethod+0x39
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+24
v  ~StubRoutines::call_stub
V  [jvm.dll+0xfb88b]
V  [jvm.dll+0x18d551]
V  [jvm.dll+0xfba31]
V  [jvm.dll+0xfba8b]
V  [jvm.dll+0xb5e89]
V  [jvm.dll+0x119b74]
V  [jvm.dll+0x14217c]
C  [msvcr71.dll+0x9565]  endthreadex+0xa0
C  [kernel32.dll+0x1336a]  BaseThreadInitThunk+0x12
C  [ntdll.dll+0x39f72]  RtlInitializeExceptionChain+0x63
C  [ntdll.dll+0x39f45]  RtlInitializeExceptionChain+0x36

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  org.opencv.core.Mat.n_delete(J)V+0
j  org.opencv.core.Mat.finalize()V+4
v  ~StubRoutines::call_stub
j  java.lang.ref.Finalizer.invokeFinalizeMethod(Ljava/lang/Object;)V+0
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+24
v  ~StubRoutines::call_stub
5。这就是我运行代码的方式:

JNIEXPORT jlong JNICALL Java_org_opencv_highgui_Highgui_imread_11 (JNIEnv*, jclass, jstring);

JNIEXPORT jlong JNICALL Java_org_opencv_highgui_Highgui_imread_11
  (JNIEnv* env, jclass , jstring filename)
{
    static const char method_name[] = "highgui::imread_11()";
    try {
        LOGD("%s", method_name);
        const char* utf_filename = env->GetStringUTFChars(filename, 0); std::string n_filename( utf_filename ? utf_filename : "" ); env->ReleaseStringUTFChars(filename, utf_filename);
        Mat _retval_ = cv::imread( n_filename );
        return (jlong) new Mat(_retval_);
    } catch(const std::exception &e) {
        throwJavaException(env, &e, method_name);
    } catch (...) {
        throwJavaException(env, 0, method_name);
    }
    return 0;
}
public static Mat imread(String filename)
{
     Mat retVal = new Mat(imread_1(filename));
     return retVal;
}

private static native long imread_1(String filename);
JNIEXPORT jlong JNICALL Java_tr_com_guney_opencvcpp2java_OpenCVCpp2Java_readImage0(JNIEnv *env, jclass, jstring imagePath)

JNIEXPORT jlong JNICALL Java_tr_com_guney_opencvcpp2java_OpenCVCpp2Java_readImage0(JNIEnv *env, jclass, jstring imagePath)
{   
    static const char method_name[] = "OpenCVCpp2Java::readImage0()";
    try {
        LOGD("%s", method_name);
        const char* utf_filename = env->GetStringUTFChars(imagePath, 0); std::string n_filename( utf_filename ? utf_filename : "" );  env->ReleaseStringUTFChars(imagePath, utf_filename);
        cv::Mat _retval_ = cv::imread( n_filename );
        return (jlong) new cv::Mat(_retval_);
    } catch(const std::exception &e) {
        throwJavaException(env, &e, method_name);
    } catch (...) {
        throwJavaException(env, 0, method_name);
    }
    return 0;
}
public static Mat readImage(String imagePath) 
{
     Mat retVal = new Mat(readImage0(imagePath));
     return retVal;
}

private static native long readImage0(String imagePath);
Mat image = Highgui.imread("e:/image.png"); //this works fine
Highgui.imwrite("e:/imageJava.png", image); // this is to check if image is read correctly and works fine
image.release(); // this works fine
//system.gc(); // this also works fine

Mat image2 = OpenCVCpp2Java.readImage("e:/image.png"); //this works fine
Highgui.imwrite("e:/imageJava2.png", image2); // this is to check if image is read correctly and works fine
image2.release(); // this throws exception!
//system.gc(); // this causes application to crash!
Exception in thread "main" java.lang.Exception: Unknown exception in JNI code {Mat::n_1release()}
    at org.opencv.core.Mat.n_release(Native Method)
    at org.opencv.core.Mat.release(Mat.java:1875)
Stack: [0x28880000,0x288d0000],  sp=0x288cf620,  free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [ntdll.dll+0x2e3be]  RtlInitUnicodeString+0x196
C  [ntdll.dll+0x2e023]  RtlFreeHeap+0x7e
C  [kernel32.dll+0x114ad]  HeapFree+0x14
C  [opencv_java245.dll+0x48e877]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x429a47
C  [opencv_java245.dll+0x904f3]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x2b6c3
C  [opencv_java245.dll+0x6516a]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x33a
j  org.opencv.core.Mat.n_delete(J)V+0
j  org.opencv.core.Mat.finalize()V+4
v  ~StubRoutines::call_stub
V  [jvm.dll+0xfb88b]
V  [jvm.dll+0x18d551]
V  [jvm.dll+0xfb90d]
V  [jvm.dll+0x96301]
V  [jvm.dll+0x990c9]
C  [java.dll+0x2100]  Java_java_lang_ref_Finalizer_invokeFinalizeMethod+0x39
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+24
v  ~StubRoutines::call_stub
V  [jvm.dll+0xfb88b]
V  [jvm.dll+0x18d551]
V  [jvm.dll+0xfba31]
V  [jvm.dll+0xfba8b]
V  [jvm.dll+0xb5e89]
V  [jvm.dll+0x119b74]
V  [jvm.dll+0x14217c]
C  [msvcr71.dll+0x9565]  endthreadex+0xa0
C  [kernel32.dll+0x1336a]  BaseThreadInitThunk+0x12
C  [ntdll.dll+0x39f72]  RtlInitializeExceptionChain+0x63
C  [ntdll.dll+0x39f45]  RtlInitializeExceptionChain+0x36

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  org.opencv.core.Mat.n_delete(J)V+0
j  org.opencv.core.Mat.finalize()V+4
v  ~StubRoutines::call_stub
j  java.lang.ref.Finalizer.invokeFinalizeMethod(Ljava/lang/Object;)V+0
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+24
v  ~StubRoutines::call_stub
6。这是写在例外中的内容:

JNIEXPORT jlong JNICALL Java_org_opencv_highgui_Highgui_imread_11 (JNIEnv*, jclass, jstring);

JNIEXPORT jlong JNICALL Java_org_opencv_highgui_Highgui_imread_11
  (JNIEnv* env, jclass , jstring filename)
{
    static const char method_name[] = "highgui::imread_11()";
    try {
        LOGD("%s", method_name);
        const char* utf_filename = env->GetStringUTFChars(filename, 0); std::string n_filename( utf_filename ? utf_filename : "" ); env->ReleaseStringUTFChars(filename, utf_filename);
        Mat _retval_ = cv::imread( n_filename );
        return (jlong) new Mat(_retval_);
    } catch(const std::exception &e) {
        throwJavaException(env, &e, method_name);
    } catch (...) {
        throwJavaException(env, 0, method_name);
    }
    return 0;
}
public static Mat imread(String filename)
{
     Mat retVal = new Mat(imread_1(filename));
     return retVal;
}

private static native long imread_1(String filename);
JNIEXPORT jlong JNICALL Java_tr_com_guney_opencvcpp2java_OpenCVCpp2Java_readImage0(JNIEnv *env, jclass, jstring imagePath)

JNIEXPORT jlong JNICALL Java_tr_com_guney_opencvcpp2java_OpenCVCpp2Java_readImage0(JNIEnv *env, jclass, jstring imagePath)
{   
    static const char method_name[] = "OpenCVCpp2Java::readImage0()";
    try {
        LOGD("%s", method_name);
        const char* utf_filename = env->GetStringUTFChars(imagePath, 0); std::string n_filename( utf_filename ? utf_filename : "" );  env->ReleaseStringUTFChars(imagePath, utf_filename);
        cv::Mat _retval_ = cv::imread( n_filename );
        return (jlong) new cv::Mat(_retval_);
    } catch(const std::exception &e) {
        throwJavaException(env, &e, method_name);
    } catch (...) {
        throwJavaException(env, 0, method_name);
    }
    return 0;
}
public static Mat readImage(String imagePath) 
{
     Mat retVal = new Mat(readImage0(imagePath));
     return retVal;
}

private static native long readImage0(String imagePath);
Mat image = Highgui.imread("e:/image.png"); //this works fine
Highgui.imwrite("e:/imageJava.png", image); // this is to check if image is read correctly and works fine
image.release(); // this works fine
//system.gc(); // this also works fine

Mat image2 = OpenCVCpp2Java.readImage("e:/image.png"); //this works fine
Highgui.imwrite("e:/imageJava2.png", image2); // this is to check if image is read correctly and works fine
image2.release(); // this throws exception!
//system.gc(); // this causes application to crash!
Exception in thread "main" java.lang.Exception: Unknown exception in JNI code {Mat::n_1release()}
    at org.opencv.core.Mat.n_release(Native Method)
    at org.opencv.core.Mat.release(Mat.java:1875)
Stack: [0x28880000,0x288d0000],  sp=0x288cf620,  free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [ntdll.dll+0x2e3be]  RtlInitUnicodeString+0x196
C  [ntdll.dll+0x2e023]  RtlFreeHeap+0x7e
C  [kernel32.dll+0x114ad]  HeapFree+0x14
C  [opencv_java245.dll+0x48e877]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x429a47
C  [opencv_java245.dll+0x904f3]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x2b6c3
C  [opencv_java245.dll+0x6516a]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x33a
j  org.opencv.core.Mat.n_delete(J)V+0
j  org.opencv.core.Mat.finalize()V+4
v  ~StubRoutines::call_stub
V  [jvm.dll+0xfb88b]
V  [jvm.dll+0x18d551]
V  [jvm.dll+0xfb90d]
V  [jvm.dll+0x96301]
V  [jvm.dll+0x990c9]
C  [java.dll+0x2100]  Java_java_lang_ref_Finalizer_invokeFinalizeMethod+0x39
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+24
v  ~StubRoutines::call_stub
V  [jvm.dll+0xfb88b]
V  [jvm.dll+0x18d551]
V  [jvm.dll+0xfba31]
V  [jvm.dll+0xfba8b]
V  [jvm.dll+0xb5e89]
V  [jvm.dll+0x119b74]
V  [jvm.dll+0x14217c]
C  [msvcr71.dll+0x9565]  endthreadex+0xa0
C  [kernel32.dll+0x1336a]  BaseThreadInitThunk+0x12
C  [ntdll.dll+0x39f72]  RtlInitializeExceptionChain+0x63
C  [ntdll.dll+0x39f45]  RtlInitializeExceptionChain+0x36

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  org.opencv.core.Mat.n_delete(J)V+0
j  org.opencv.core.Mat.finalize()V+4
v  ~StubRoutines::call_stub
j  java.lang.ref.Finalizer.invokeFinalizeMethod(Ljava/lang/Object;)V+0
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+24
v  ~StubRoutines::call_stub
7。这就是坠机报告中所写的内容:

JNIEXPORT jlong JNICALL Java_org_opencv_highgui_Highgui_imread_11 (JNIEnv*, jclass, jstring);

JNIEXPORT jlong JNICALL Java_org_opencv_highgui_Highgui_imread_11
  (JNIEnv* env, jclass , jstring filename)
{
    static const char method_name[] = "highgui::imread_11()";
    try {
        LOGD("%s", method_name);
        const char* utf_filename = env->GetStringUTFChars(filename, 0); std::string n_filename( utf_filename ? utf_filename : "" ); env->ReleaseStringUTFChars(filename, utf_filename);
        Mat _retval_ = cv::imread( n_filename );
        return (jlong) new Mat(_retval_);
    } catch(const std::exception &e) {
        throwJavaException(env, &e, method_name);
    } catch (...) {
        throwJavaException(env, 0, method_name);
    }
    return 0;
}
public static Mat imread(String filename)
{
     Mat retVal = new Mat(imread_1(filename));
     return retVal;
}

private static native long imread_1(String filename);
JNIEXPORT jlong JNICALL Java_tr_com_guney_opencvcpp2java_OpenCVCpp2Java_readImage0(JNIEnv *env, jclass, jstring imagePath)

JNIEXPORT jlong JNICALL Java_tr_com_guney_opencvcpp2java_OpenCVCpp2Java_readImage0(JNIEnv *env, jclass, jstring imagePath)
{   
    static const char method_name[] = "OpenCVCpp2Java::readImage0()";
    try {
        LOGD("%s", method_name);
        const char* utf_filename = env->GetStringUTFChars(imagePath, 0); std::string n_filename( utf_filename ? utf_filename : "" );  env->ReleaseStringUTFChars(imagePath, utf_filename);
        cv::Mat _retval_ = cv::imread( n_filename );
        return (jlong) new cv::Mat(_retval_);
    } catch(const std::exception &e) {
        throwJavaException(env, &e, method_name);
    } catch (...) {
        throwJavaException(env, 0, method_name);
    }
    return 0;
}
public static Mat readImage(String imagePath) 
{
     Mat retVal = new Mat(readImage0(imagePath));
     return retVal;
}

private static native long readImage0(String imagePath);
Mat image = Highgui.imread("e:/image.png"); //this works fine
Highgui.imwrite("e:/imageJava.png", image); // this is to check if image is read correctly and works fine
image.release(); // this works fine
//system.gc(); // this also works fine

Mat image2 = OpenCVCpp2Java.readImage("e:/image.png"); //this works fine
Highgui.imwrite("e:/imageJava2.png", image2); // this is to check if image is read correctly and works fine
image2.release(); // this throws exception!
//system.gc(); // this causes application to crash!
Exception in thread "main" java.lang.Exception: Unknown exception in JNI code {Mat::n_1release()}
    at org.opencv.core.Mat.n_release(Native Method)
    at org.opencv.core.Mat.release(Mat.java:1875)
Stack: [0x28880000,0x288d0000],  sp=0x288cf620,  free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [ntdll.dll+0x2e3be]  RtlInitUnicodeString+0x196
C  [ntdll.dll+0x2e023]  RtlFreeHeap+0x7e
C  [kernel32.dll+0x114ad]  HeapFree+0x14
C  [opencv_java245.dll+0x48e877]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x429a47
C  [opencv_java245.dll+0x904f3]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x2b6c3
C  [opencv_java245.dll+0x6516a]  Java_org_opencv_contrib_Contrib_chamerMatching_11+0x33a
j  org.opencv.core.Mat.n_delete(J)V+0
j  org.opencv.core.Mat.finalize()V+4
v  ~StubRoutines::call_stub
V  [jvm.dll+0xfb88b]
V  [jvm.dll+0x18d551]
V  [jvm.dll+0xfb90d]
V  [jvm.dll+0x96301]
V  [jvm.dll+0x990c9]
C  [java.dll+0x2100]  Java_java_lang_ref_Finalizer_invokeFinalizeMethod+0x39
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+24
v  ~StubRoutines::call_stub
V  [jvm.dll+0xfb88b]
V  [jvm.dll+0x18d551]
V  [jvm.dll+0xfba31]
V  [jvm.dll+0xfba8b]
V  [jvm.dll+0xb5e89]
V  [jvm.dll+0x119b74]
V  [jvm.dll+0x14217c]
C  [msvcr71.dll+0x9565]  endthreadex+0xa0
C  [kernel32.dll+0x1336a]  BaseThreadInitThunk+0x12
C  [ntdll.dll+0x39f72]  RtlInitializeExceptionChain+0x63
C  [ntdll.dll+0x39f45]  RtlInitializeExceptionChain+0x36

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  org.opencv.core.Mat.n_delete(J)V+0
j  org.opencv.core.Mat.finalize()V+4
v  ~StubRoutines::call_stub
j  java.lang.ref.Finalizer.invokeFinalizeMethod(Ljava/lang/Object;)V+0
j  java.lang.ref.Finalizer.runFinalizer()V+45
j  java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j  java.lang.ref.Finalizer$FinalizerThread.run()V+24
v  ~StubRoutines::call_stub

我已经知道问题出在哪里了。我认为这有点复杂,至少对我来说是这样

问题是我使用的是opencv_java248.dll,它与opencv一起分发,并且已经编译。opencv_java248.dll是静态构建的,这意味着编译后它不需要任何opencv dll(opencv_core248.dll等)。我已经创建了自己的dll opencvcpp2java.dll,它也是静态构建的,因此在运行时不需要任何dll

在我撞车后,我开始思考是什么导致了这个问题。然后我意识到内存分配和释放是在完全不同的dll上完成的。我使用opencvcpp2java.dll分配内存,并期望opencv_java248.dll发布它。当它试图释放它时,程序崩溃了。另一方面,当我使用opencv_java248.dll进行分配和解除分配时,没有问题。因此,凭直觉,我认为分配和解除分配应该在同一个dll上完成

在这种直觉之后,我自己编译了opencv_java248.dll(顺便说一句,您需要编译所有的opencv dll,当您使用CMake时,这是小菜一碟),并使其依赖于其他opencv dll,重新编译opencvcpp2java.dll,还使其依赖于opencv dll。因此,当我想使用opencvcpp2java.dll分配内存时,它会使用OpenCV dll的(更具体地说,是OpenCV_core248.dll),当我想使用OpenCV_java248.dll解除分配内存时,它会使用创建的相同dll解除分配内存


我不能100%确定这是正确的解决方案,但它对我有效。

这可能是一个问题:。你能用调试器进行附加并得到完整的回溯吗?我还注意到在发布时没有空检查