У меня вопрос о правильном управлении памятью порта Java OpenCV.Управление памятью Java JNIEXPORT OpenCV
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 \ Генератор \ SRC \ CPP \ Mat.cpp. Мой вопрос о следующей части:
Mat* _retval_ = new Mat(rows, cols, type);
return (jlong) _retval_;
возвращает мат объекты адрес литья его jlong
и не удаляет объект. Итак, Как осуществляется управление памятью? Использует ли java сборщик мусора? Или есть ли какой-нибудь другой код на стороне C++, который каким-то образом очищает память?
Я знаю, что здесь нет управления памятью, я спрашивал, где и как это делается. – guneykayim
Я нахожусь, две минуты. – Geoffroy
C++ выделенная память через 'new' останется в памяти до соответствующего вызова' delete'. С jni я бы предположил, что Java 'dispose' или' finalize', в свою очередь, вызовет собственный метод, передавая переменную jlong для удаления. – Samhain