gpt4 book ai didi

c++ - jbyteArray 是一个 jobject(即 : as a parameter to DeleteLocalRef)?

转载 作者:太空狗 更新时间:2023-10-29 21:25:31 28 4
gpt4 key购买 nike

在 JNI 中,jbyteArray 是否被视为作业对象?即:如果我有一些长时间运行的 C++ 代码,我可以使用像下面这样的代码来释放对象引用吗?

JNIEnv* env;

jobject getJavaObj(bool useArray) {
if (useArray) {
jbyteArray dataArray = env->NewByteArray(getDataSize());
env->SetByteArrayRegion(dataArray, 0, getDataSize(), dataPtr);
return static_cast<jobject>(dataArray)
} else {
jobject javaByteBuffer = env->NewDirectByteBuffer(dataPtr, getDataSize());
return javaByteBuffer;
}
}

// ...
jobject theData = getJavaObj(true);
// ... Code to use theData jobject goes here...
env->DeleteLocalRef(theData); // Will this cause any issues?

JDK 的 jni.h 包含文件似乎表明这是一个正确的假设,但我在网上找不到太多支持这个假设的东西:

#ifdef __cplusplus
class _jobject {};
...
class _jarray : public _jobject {};
typedef _jbyteArray *jbyteArray;
#else
....
#endif

背景:

我有一些 JNI 代码存在内存泄漏,我正试图查明这一点。总进程大小不断增加,但 JConsole 表示 JVM 的堆内存使用量和非堆内存使用量保持相当稳定。所以我的结论是泄漏一定是在原始 C++ 本身,或者在 JNI 代码中。

最佳答案

要回答您的问题,是的,jbyteArray 是一个jobject,是的,您可以通过调用DeleteLocalRef 明确告诉GC 释放它。否则,当当前 JNI 调用返回到 JVM 时,它将被自动释放。 但我认为这对您没有帮助。通过使用 NewByteArrayNewDirectByteBuffer,您正在分配 JVM 堆,而不是 native 内存。必须如此,否则 GC 无法到达它(并且调用 DeleteLocalRef 也没有意义)。但是您说 JVM 堆使用率相当稳定。如果 java 进程内存使用量增加但 JVM 堆没有增加,那么你的 native 分配有问题。您的 dataPtr 来自哪里?你正确地解除分配了吗?您的“长时间运行的代码”中没有其他重要分配吗?根本不需要绑定(bind)到 JNI...

关于c++ - jbyteArray 是一个 jobject(即 : as a parameter to DeleteLocalRef)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13823325/

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