我对 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
并且不会删除该对象。那么,内存管理是如何完成的呢?java是否运行垃圾收集器?或者 C++ 端是否还有其他代码可以以某种方式清除内存?