gpt4 book ai didi

c++ - jclass 和 jobject 的 jni deleteRef

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:40 25 4
gpt4 key购买 nike

这是删除类和对象引用的正确方法吗

JNIEXPORT void JNICALL Java_method(JNIEnv *env,jobject, jobject objArray)
{
int n = env->GetArrayLength(objArray);

for (int i = 0; i<n ; ++i)
{
jobject sObject = env->GetObjectArrayElement(objArray, i);
jclass sObjectClass = env->GetObjectClass(sObject);

dosomething(sObjectClass, sObject);

env->DeleteLocalRef(sObject);
env->DeleteLocalRef(sObjectClass);
}

最佳答案

简答:

是的,这是正确的方法。调用 DeleteLocalRef 不是必需的,但如果 objArray 很大或函数执行时间很长,它很有用。

更长的答案:

Oracle 引用文档状态

Primitive types, such as integers, characters, and so on, are copied between Java and native code. Arbitrary Java objects, on the other hand, are passed by reference. The VM must keep track of all objects that have been passed to the native code, so that these objects are not freed by the garbage collector. The native code, in turn, must have a way to inform the VM that it no longer needs the objects. In addition, the garbage collector must be able to move an object referred to by the native code.

因此,当 native 代码不再需要该对象时,从 native 代码的角度来看, native 代码使用的任何对象都必须标记为符合垃圾回收条件。 JNI 有两种类型的引用——全局引用和局部引用。从 GetObjectArrayElementGetObjectClass 检索到的引用是本地的,因为:

All Java objects returned by JNI functions are local references.

当 native 函数返回时,VM 会自动释放所有本地引用。因此在大多数情况下没有必要通过 DeleteLocalRef 释放这些引用,因为 VM 会自动释放它们。

但是如果在一个函数调用中需要大量本地引用或者调用需要很长时间,那么值得在不需要时立即显式释放它们并且不要等待函数返回。释放有助于 VM 进行更好的内存管理。

关于c++ - jclass 和 jobject 的 jni deleteRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40993312/

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