gpt4 book ai didi

java - OpenCV Java JNIEXPORT 内存管理

转载 作者:太空狗 更新时间:2023-10-29 23:40:31 27 4
gpt4 key购买 nike

我对 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_;

它通过将其转换为 jlong​​ 来返回 mat 对象地址,并且不会删除该对象。那么,内存管理是如何完成的? java是否运行垃圾收集器?或者 C++ 端是否有任何其他代码以某种方式清除内存?

最佳答案

这里没有进行内存管理。

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

实际上这个方法对应于Java类org.opencv.core.Mat,它有一个名为nativeObj的长属性。所以这个 java 类正在管理一个指针,它总是传递给底层的 C++ 实现。

在 Java Mat 对象上,您必须调用 release 方法,该方法又调用 JNI 函数 Java_org_opencv_core_Mat_n_release

finalize 方法还调用释放内存的n_delete

可以看到Java代码here .

关于java - OpenCV Java JNIEXPORT 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19296395/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com