Нужно ли очищать char *, переданный NewStringUTF?

Я думаю, да, но лучшие 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;
}

Ответ 1

Да. (Просто так это не выглядит без ответа.)

Ответ 2

Хорошо быть обеспокоенным утечками памяти, однако в этом случае утечки нет (исходный пример). "constant string" - буквальная строка; он не выделяется из кучи.

Итак, нет, вам не нужно очищать пройденный char * (исходный пример).

Ваши отредактированные примеры лучше для иллюстрации вашей точки. В отредактированном примере да, вам нужно очистить переданную строку.