Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV Java JNIEXPORT内存管理_Java_C++_Opencv_Java Native Interface - Fatal编程技术网

OpenCV Java JNIEXPORT内存管理

OpenCV Java JNIEXPORT内存管理,java,c++,opencv,java-native-interface,Java,C++,Opencv,Java Native Interface,我有一个关于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* _re

我有一个关于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;
            }
        }
此代码块取自“..\OpenCV-2.4.5\modules\java\generator\src\cpp\Mat.cpp”。我的问题是关于以下部分:

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

它通过将mat对象地址强制转换为
jlong
来返回mat对象地址,并且不会删除该对象。那么,内存管理是如何进行的呢?java运行垃圾收集器吗?或者C++中还有其他代码可以清除内存吗?< /p> < p>嗯,我找不到答案,但我做了一个小把戏。我将成员变量定义为

cv::Mat* mat = nullptr;
当我需要为一个新的
Mat
对象分配内存时,我首先运行下面的代码,然后进行内存分配

if(mat != nullptr) // this is satisfied if memory is already allocated and not deleted
{
    delete mat;
    mat = nullptr;
}
mat = new cv::Mat(rows, cols, type);
return (jlong)mat;

但我仍在努力学习,OpenCV如何克服这个问题。

这里没有内存管理

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

实际上,这个方法对应于Java类
org.opencv.core.Mat
,它有一个名为
nativeObj
的长属性。这个java类管理一个指针,它总是传递给底层C++实现。 在Java
Mat
对象上,必须调用
release
方法,该方法反过来调用JNI函数
Java\u org\u opencv\u core\u Mat\u n\u release

finalize
方法还调用
n\u delete
,释放内存


你可以看到java代码。< /p>我知道这里没有内存管理,我问它在哪里和怎么做。我在上面,两分钟。C++通过“代码>分配新内存>代码>将留在内存中,直到相应的<代码>删除< /Cuth>调用。对于jni,我假设Java

dispose
finalize
将依次调用本机方法,传递要删除的jlong变量它将进行jni调用并运行
JNIEXPORT jlong JNICALL Java_org_opencv_core_Mat n_1Mat__(JNIEnv*,jclass){LOGD(“Mat::n_1Mat_()”);返回(jlong)new cv::Mat()}
。但从何处调用release方法呢?在java中,它被命名为
n\u Mat
,但在cpp中,它被命名为
n\u 1Mat\uu
。core+Mat.java和Mat.cpp之间是否还有其他java文件?