内存泄漏使用JNI从Java代码中检索String的值

我正在使用GetStringUTFChars使用JNI从java代码中检索字符串的值,并使用ReleaseStringUTFChars释放字符串。 当代码在JRE 1.4上运行时,没有内存泄漏,但如果使用JRE 1.5或更高版本运行相同的代码,则内存会增加。 这是代码的一部分

msg_id=(*env)->GetStringUTFChars(env, msgid,NULL); opcdata_set_str(opc_msg_id, OPCDATA_MSGID, msg_id); (*env)->ReleaseStringUTFChars(env, msgid,msg_id); 

我无法理解泄漏的原因。有人帮忙吗?


这个是因为如果我评论其余代码但是留下这部分内存泄漏发生。 这是我正在使用的代码的一部分

 JNIEXPORT jobjectArray JNICALL Java_msiAPI_msiAPI_msgtoescalate( JNIEnv *env, jobject job, jstring msgid, jlong msgseverity, jstring msgprefixtext, jint flag ) { opcdata opc_msg_id; /* data struct to store a mesg ID */ const char *msg_id; int ret, ret2; jint val; val=67; jstring str=NULL; jobjectArray array = NULL; jclass sclass=NULL; /* create an opc_data structure to store message ids of */ /* messages to escalate */ if ((ret2=opcdata_create(OPCDTYPE_MESSAGE_ID, &opc_msg_id))!= OPC_ERR_OK) { fprintf(stderr, "Can't create opc_data structure to store message. opcdata_create()=%d\n", ret2); cleanup_all(); } ////////////////////////////////////////////////////////// msg_id=(*env)->GetStringUTFChars(env,msgid,NULL); opcdata_set_str(opc_msg_id, OPCDATA_MSGID, msg_id); (*env)->ReleaseStringUTFChars(env, msgid, msg_id); ret=opcmsg_ack(connection,opc_msg_id); ////////////////////////////////////////////////////////// if(flag==0 && ret==0) { sclass = (*env)->FindClass(env, "java/lang/String"); array = (*env)->NewObjectArray(env, 2, sclass, NULL); str=(*env)->NewStringUTF(env,"0"); (*env)->SetObjectArrayElement(env,array,0,str); (*env)->DeleteLocalRef(env, str); str=(*env)->NewStringUTF(env,"0"); (*env)->SetObjectArrayElement(env,array,1,str); (*env)->DeleteLocalRef(env, str); } opcdata_free(&opc_msg_id); if(ret!=0) return NULL; else return(array); } 

在上面的一个是如果我评论/////之间的部分我没有看到任何内存泄漏。

释放数组对象。

(* env) – > DeleteLocalRef(env,array);