1. ホーム
  2. java

GetStringUTFCharsがコピーを返した場合、ReleaseStringUTFCharsを呼び出すべきですか?

2023-08-30 13:49:15

質問

Rob Gordon著「Essential JNI: Java Native Interface"」には、jstringをC言語の文字列に変換する次のようなコード例があります。

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

を呼び出すだけであることに注意してください。 ReleaseStringUTFChars もし isCopy が真であれば

しかし、この本は Java Native Interface: プログラマーズ・ガイドと仕様書 (代替リンクです。 http://192.9.162.55/docs/books/jni/html/objtypes.html#5161 )に書いてあります。

ReleaseString-Charsの呼び出しは GetStringCharsが が *isCopy を JNI_TRUE または JNI_FALSE に設定しているかどうかに関係なく必要です。 ReleaseStringCharsは、コピーを解放するか、インスタンスをアンインストールするかのどちらかです。 コピーを解放するか、インスタンスをアンインストールします。 ReleaseStringCharsは、GetStringCharsがコピーを返したかどうかに応じて、コピーを解放するかインスタンスをアンインストールします。 がコピーを返したかどうかに応じて、コピーを解放するかインスタンスをアンインストールします。

これはGordonの本のバグだと考えていいのでしょうか?

どのように解決するのですか?

はい、あなたの仮定は正しいです(常にReleaseStringUTFCharsを呼び出す必要があります)。