jni deleteRef for jclass and jobject

jni deleteRef for jclass and jobject

本文关键字:and jobject jclass for deleteRef jni      更新时间:2023-10-16

是删除JCLASS和JOVIGHT

的正确方法
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参考文档状态

原始类型(例如整数,字符等)被复制 在Java和本机代码之间。任意Java对象,另一个 手,通过引用传递。VM必须跟踪所有对象 已传递给本机代码,以便这些对象是 没有被垃圾收集器释放。本机代码又必须 有办法通知VM它不再需要对象。在 此外,垃圾收集器必须能够移动对象 由本机代码引用。

因此,当本机代码确实需要该对象时,必须将本机代码使用的任何对象从本机代码的角度标记为垃圾收集的条件。JNI有两种类型的参考 - 全球和本地参考。从GetObjectArrayElementGetObjectClass检索的参考文献是本地的,因为:

JNI函数返回的所有Java对象都是本地参考。

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

但是,如果一个函数调用中需要很多本地引用,则该调用需要很长时间,那么在不需要的情况下,值得立即明确释放它们,并且不要等待函数返回。释放有助于VM进行更好的内存管理。