我在C ++中有一个返回Java String的JNI函数。这个字符串垃圾是由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
变量的内存?上面的代码是否没有内存泄漏?
答案 0 :(得分:3)
从JNI函数返回的Java字符串(即java.lang.String
)将进行垃圾回收。您提供给char*
的{{1}}不是,因为NewStringUTF
会在新的Java字符串中创建内容的副本。因此,如果NewStringUTF
指向在您的本机代码中动态分配的内存并且没有被您以其他方式释放,那么您将有内存泄漏(或者至少您将拥有它,如果本机方法被重复调用。)
答案 1 :(得分:1)
将其重写为
jstring result = env->NewStringUTF(output);
free(output); // or whatever will release this memory
return result; // result does not need output