Sollten Sie ReleaseStringUTFChars aufrufen, wenn GetStringUTFChars eine Kopie zurückgegeben hat?

74

Das Buch "Essential JNI: Java Native Interface" von Rob Gordon enthält das folgende Codebeispiel zum Konvertieren eines Jstrings in einen C-String:

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

Beachten Sie, dass nur aufgerufen wird, ReleaseStringUTFCharswenn dies der isCopyFall ist.

Das Buch Java Native Interface: Programmierhandbuch und Spezifikation (alternativer Link :) http://192.9.162.55/docs/books/jni/html/objtypes.html#5161lautet jedoch:

Der Aufruf von ReleaseString-Chars ist erforderlich, unabhängig davon, ob GetStringChars * isCopy auf JNI_TRUE oder JNI_FALSE gesetzt hat. ReleaseStringChars gibt entweder die Kopie frei oder hebt die Instanz auf, je nachdem, ob GetStringChars eine Kopie zurückgegeben hat oder nicht.

Ich gehe zu Recht davon aus, dass dies ein Fehler in Gordons Buch ist.

Edward Loper
quelle
2
wo ist strdefiniert?
Etwas Etwas

Antworten:

63

Ja, Ihre Annahme ist richtig (Sie sollten immer ReleaseStringUTFChars aufrufen).

Brett Kail
quelle
Was passiert, wenn es nicht aufgerufen wird?
HoangVu
1
Der Speicher geht verloren (die JVM glaubt, dass Sie den Speicher auf unbestimmte Zeit benötigen).
Brett Kail
2
Sicher ! Aber warum haben wir keine frei zugewiesene Speicherfunktion für andere Datentypen wie: int, double. Es sollte RealseInt (arg, arg), ReleaseDouble (arg, arg) sein ... oder so ähnlich?
HoangVu
4
Int und double sind nicht wie Zeichenfolgen mit variabler Länge, sodass die Daten trivial in den Aufrufer kopiert werden können. (Es ist wahrscheinlich am besten, eine neue Frage zu erstellen, anstatt ein Gespräch über eine 6-jährige Antwort fortzusetzen.)
Brett Kail
1
Vielen Dank! Ich habe verstanden.
HoangVu