JNI函数返回的字符串被垃圾收集

JNI function returning string is garbage collected?

本文关键字:字符串 函数 返回 JNI      更新时间:2023-10-16

我有一个c++中的JNI函数,它返回一个Java String。这个字符串垃圾被JVM收集了吗?

extern "C" 
JNIEXPORT jstring JNICALL  
Java_com_playax_fingerprint_Echoprint_code(JNIEnv *env, jobject obj, jstring fileName){
  const char *nativeString = env->GetStringUTFChars(fileName, 0);
  char* str1 = const_cast<char *>(nativeString); 
  codegen_response_t* response = codegen_file(str1, 0, 0, 0);       
  char *output = make_short_json_string(response);
  free(response);
  env->ReleaseStringUTFChars(fileName, nativeString);
  return env->NewStringUTF(output);      
}

谁负责释放output变量的内存?上面的代码没有内存泄漏吗?

从JNI函数返回的Java字符串(即java.lang.String)受到垃圾收集的影响。您提供给NewStringUTFchar*不是,因为NewStringUTF创建了新Java字符串中内容的副本。因此,如果output指向在本机代码中动态分配的内存,并且没有通过其他方式释放,那么您将有内存泄漏(或者至少如果重复调用本机方法,您将有内存泄漏)。

重写为

jstring result = env->NewStringUTF(output);
free(output);  // or whatever will release this memory
return result; // result does not need output