У меня есть функция JNI в C++, которая возвращает строку Java. Этот сборщик строк собран 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
переменной? Является ли код выше свободного от утечки памяти?
Перепишите это как
jstring result = env->NewStringUTF(output);
free(output); // or whatever will release this memory
return result; // result does not need output
Строка Java (т.е. java.lang.String
), которую вы возвращаете из функции JNI, зависит от сбора мусора. char*
вы поставляете в NewStringUTF
, отсутствует, потому что NewStringUTF
создает копию содержимого в новой строке Java. Поэтому, если output
указывает на память, распределенную динамически внутри вашего собственного кода и не освобожден вами каким-либо другим способом, тогда у вас будет утечка памяти (или, по крайней мере, вы будете иметь ее, если нативный метод вызывается повторно).