extern"C"JNIEXPORTjstringJNICALLJava_com_glumes_cppso_jnioperations_LocalAndGlobalReferenceOps_errorCacheUseLocalReference(JNIEnv*env,jobjectinstance){staticjmethodIDmid=NULL;staticjclasscls;// 局部引用不能使用 static 来缓存,否则函数退出后,自动释放,成为野指针,程序 Crashif(cls==NULL){cls=env->FindClass("java/lang/String");if(cls==NULL){returnNULL;}}else{LOGD("cls is not null but program will crash");}if(mid==NULL){mid=env->GetMethodID(cls,"<init>","([C)V");if(mid==NULL){returnNULL;}}jcharArraycharEleArr=env->NewCharArray(10);constjchar*j_char=env->GetStringChars(env->NewStringUTF("LocalReference"),NULL);env->SetCharArrayRegion(charEleArr,0,10,j_char);jstringresult=(jstring)env->NewObject(cls,mid,charEleArr);env->DeleteLocalRef(charEleArr);returnresult;}
// Use EnsureLocalCapacityintlen=20;if(env->EnsureLocalCapacity(len)<0){// 创建失败,out of memory}for(inti=0;i<len;++i){jstringjstr=env->GetObjectArrayElement(arr,i);// 处理 字符串// 创建了足够多的局部引用,这里就不用删除了,显然占用更多的内存}
extern"C"JNIEXPORTvoidJNICALLJava_com_glumes_cppso_jnioperations_LocalAndGlobalReferenceOps_useWeakGlobalReference(JNIEnv*env,jobjectinstance){staticjclassstringClass=NULL;if(stringClass==NULL){jclasslocalRefs=env->FindClass("java/lang/String");if(localRefs==NULL){return;}stringClass=(jclass)env->NewWeakGlobalRef(localRefs);if(stringClass==NULL){return;}}staticjmethodIDstringMid=NULL;if(stringMid==NULL){stringMid=env->GetMethodID(stringClass,"<init>","(Ljava/lang/String;)V");if(stringMid==NULL){return;}}jbooleanisGC=env->IsSameObject(stringClass,NULL);if(isGC){LOGD("weak reference has been gc");}else{jstringstr=(jstring)env->NewObject(stringClass,stringMid,env->NewStringUTF("jstring"));LOGD("str is %s",env->GetStringUTFChars(str,NULL));}}
while(JNI_TRUE){jstringinfoString=GetInfoString(info);.../* process infoString */???/* we need to call DeleteLocalRef, DeleteGlobalRef, or DeleteWeakGlobalRef depending on the type of reference returned by GetInfoString. */}
staticjstringcachedString=NULL;if(cachedString==NULL){/* create cachedString for the first time */jstringcachedStringLocal=...;/* cache the result in a global reference */cachedString=(*env)->NewGlobalRef(env,cachedStringLocal);}return(*env)->NewLocalRef(env,cachedString);