OpenCV Java JNIEXPORT内存管理
我有一个关于OpenCV的java端口内存管理的问题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
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++实现。
在JavaMat
对象上,必须调用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文件?