OpenCV Java JNIEXPORT内存管理

gun*_*yim 2 c++ java java-native-interface opencv

我对OpenCV的java端口的内存管理有一个疑问.

JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat_n_1Mat__III
          (JNIEnv* env, jclass, jint rows, jint cols, jint type)
        {
            try {
                LOGD("Mat::n_1Mat__III()");

                Mat* _retval_ = new Mat( rows, cols, type );

                return (jlong) _retval_;
            } catch(cv::Exception e) {
                LOGD("Mat::n_1Mat__III() catched 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 0;
            } catch (...) {
                LOGD("Mat::n_1Mat__III() catched unknown exception (...)");
                jclass je = env->FindClass("java/lang/Exception");
                env->ThrowNew(je, "Unknown exception in JNI code {Mat::n_1Mat__III()}");
                return 0;
            }
        }
Run Code Online (Sandbox Code Playgroud)

此代码块取自'..\OpenCV-2.4.5\modules\java\generator\src\cpp\Mat.cpp'.我的问题是关于以下部分:

Mat* _retval_ = new Mat( rows, cols, type );
return (jlong) _retval_;
Run Code Online (Sandbox Code Playgroud)

它通过将mat对象转换为jlong并且不删除对象来返回mat对象地址.那么,内存管理是如何完成的呢?java运行垃圾收集器吗?或者C++方面是否有其他代码以某种方式清除内存?

Geo*_*roy 6

这里没有内存管理.

该函数确实返回指向堆分配对象的指针,而不关心内存管理.

实际上,此方法对应于org.opencv.core.Mat具有名为long属性的Java类nativeObj.所以这个java类正在管理一个指针,它总是传递给底层的C++实现.

在Java Mat对象上,您必须调用该release方法,该方法又调用JNI函数Java_org_opencv_core_Mat_n_release.

finalize方法还调用n_delete哪个释放内存.

您可以在此处查看Java代码.