ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
你可以在一个Native函数的多次调用过程中使用一个全局引用。一个全局引用可以被多线程引用,且只要没有被开发人员手动释放,它会一直有效。跟局部引用一样,全局引用保证被引用的对象不被系统回收。 与局部引用的创建是很多JNI函数的返回不同,全局引用的创建仅仅被一个JNI函数创建:NewGlobalRef.以下版本的MyNewString展示了如何使用全局引用。 ~~~ /* This code is OK */ jstring MyNewString(JNIEnv *env, jchar *chars, jint len) { static jclass stringClass; jmethodID cid; jcharArray elemArr; jstring result; if(!stringClass) { jclass localRefCls = (*env)->FindClass(env, "java/lang/String"); if(!localRefCls){ return 0; /* exception thrown */ } /*Create a global reference */ stringClass = (*env)->NewGlobalRef(env, localRefCls); /* The local reference is no longer useful */ (*env)->DeleteLocalRef(env, localRefCls); /* Is the global reference created successfully ? */ if(!stringClass){ return NULL; /* out of memory exception thrown */ } } /* It is wrong to use the cached stringClass here' * because it may be invalid. */ cid = (*env)->GetMethodID(env, stringClass, "<init>", "([C)V"); if(!cid) { return 0; /* exception thrown */ } /* Create a char[] that holds the string characters */ elemArr = (*env)->NewCharArray(env, len); if(!elemArr) { return 0; /* exception thrown */ } (*env)->SetCharArrayRegion(env, elemArr, 0, len, chars); /* Construct a java.lang.String */ result = (*env)->NewObject(env, stringClass, cid, elemArr); /* Free local references */ (*env)->DeleteLocalRef(env, elemArr); return result; } ~~~ 以上修改版的MyNewString中,将从FindClass函数返回的局部引用作为参数传递给NewGlobalRef来创建一个指向java.lang.String的全局引用,同时立刻使用DeleteLocalRef释放了localRefCls占用的资源。