Функция JNI, возвращающая строку, является сборщиком мусора?

0

У меня есть функция 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 переменной? Является ли код выше свободного от утечки памяти?

  • 1
    Это может быть дубликатом чего-то подобного, но я сомневаюсь в этом, но это должно ответить на ваш вопрос: stackoverflow.com/a/3879515/67566
Теги:
garbage-collection
jni

2 ответа

1
Лучший ответ

Перепишите это как

jstring result = env->NewStringUTF(output);
free(output);  // or whatever will release this memory
return result; // result does not need output
  • 0
    мне нужно также запускать free (nativeString) и free (str1)?
3

Строка Java (т.е. java.lang.String), которую вы возвращаете из функции JNI, зависит от сбора мусора. char* вы поставляете в NewStringUTF, отсутствует, потому что NewStringUTF создает копию содержимого в новой строке Java. Поэтому, если output указывает на память, распределенную динамически внутри вашего собственного кода и не освобожден вами каким-либо другим способом, тогда у вас будет утечка памяти (или, по крайней мере, вы будете иметь ее, если нативный метод вызывается повторно).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню