Ответ 1
Да. (Просто так это не выглядит без ответа.)
Я думаю, да, но лучшие 12 примеров, которые я нашел, делают что-то вроде иллюстративного, например
JNIEXPORT jstring JCALL Java_com_foo_dumbImpl(JNIEnv* env, jobject thisObj)
{
return (*env)->NewStringUTF(env, "constant string");
}
поэтому для потомков я спрошу: это плохо, да?
JNIEXPORT jstring JCALL Java_com_foo_dumbImpl(JNIEnv* env, jobject thisObj)
{
char *leak = malloc(1024);
leak[0] = '\0';
return (*env)->NewStringUTF(env, leak);
}
... и должен быть:
JNIEXPORT jstring JCALL Java_com_foo_dumbImpl(JNIEnv* env, jobject thisObj)
{
char *emptystring = NULL;
jstring r = NULL;
emptystring = malloc(1024);
emptystring[0] = '\0';
r = (*env)->NewStringUTF(env, emptystring);
free(emptystring);
emptystring = NULL;
return r;
}
Да. (Просто так это не выглядит без ответа.)
Хорошо быть обеспокоенным утечками памяти, однако в этом случае утечки нет (исходный пример). "constant string" - буквальная строка; он не выделяется из кучи.
Итак, нет, вам не нужно очищать пройденный char * (исходный пример).
Ваши отредактированные примеры лучше для иллюстрации вашей точки. В отредактированном примере да, вам нужно очистить переданную строку.