我有一個問題abour內存管理Java端口的OpenCV。OpenCV的Java JNIEXPORT內存管理
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 \模塊\ java中\發生器\ SRC \ CPP \ Mat.cpp'。我的問題是關於以下部分:
Mat* _retval_ = new Mat(rows, cols, type);
return (jlong) _retval_;
它通過它鑄造jlong
返回墊對象的地址,不刪除對象。那麼,內存管理如何完成? Java是否運行垃圾收集器?或者有沒有其他代碼清除內存的C++方面?
我知道這裏沒有做內存管理,我在問在哪裏以及如何完成。 – guneykayim
我在上面,兩分鐘。 – Geoffroy
通過'new'分配的內存將保留在內存中,直到相應的'delete'調用。用jni,我會假定Java'dispose'或'finalize'會依次調用一個本地方法,傳遞要刪除的jlong變量。 – Samhain