web-dev-qa-db-fra.com

Devez-vous appeler ReleaseStringUTFChars si GetStringUTFChars a renvoyé une copie?

Le livre "Essential JNI: Java Native Interface" de Rob Gordon contient l'exemple de code suivant pour convertir une chaîne jstring en chaîne C:

const char* utf_string;
jboolean isCopy;
utf_string = env->GetStringUTFChars(str, &isCopy);
/* ... use string ... */
if (isCopy == JNI_TRUE) {
    env->ReleaseStringUTFChars(str, utf_string);
}

Notez qu'il appelle uniquement ReleaseStringUTFChars si isCopy est vrai.

Mais le livre Java Native Interface: Programmer's Guide and Specification (lien alternatif: http://192.9.162.55/docs/books/jni/html/objtypes.html#5161) dit:

L'appel ReleaseString-Chars est nécessaire que GetStringChars ait défini * isCopy sur JNI_TRUE ou JNI_FALSE. ReleaseStringChars libère la copie ou débloque l'instance, selon que GetStringChars a renvoyé une copie ou non.

J'ai raison de supposer que c'est un bug dans le livre de Gordon?

70
Edward Loper

Oui, votre hypothèse est correcte (vous devez toujours appeler ReleaseStringUTFChars).

60
Brett Kail