Date: Thu, 6 Jan 2000 04:34:23 JST From: SHUDO Kazuyuki Subject: [JavaHouse-Brewers:29794] Re: JNI =?ISO-2022-JP?B?GyRCJT0hPCU5JEckTiUoJWkhPBsoQg==?=( DOM =?ISO-2022-JP?B?GyRCNElNfSUvJWklOTtITVEbKEI=?=) To: java-house-brewers at java-house.etl.go.jp (JavaHouse Brewers ML) Message-Id: <20000106045213Y.shudoh at muraoka.info.waseda.ac.jp> 高取さん wrote: > Javaアプリ実施中、以下のようなエラーダイアログが表示されたのですが、 > 意味が分かりません。 > │ Debug Assertion Failed! │ > │ Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) │ > │ │ > │ For information on how your program can cause an assertion │ > │ failure, see the Visual C++ documentation on asserts. │ > 参考になるかわかりませんが、以下がソースの一部です。 > JNIEXPORT jlong JNICALL Java_FjEbfClientJa_InitClient > (JNIEnv *env, jobject thisJEBFClient, jstring strObjectURI) > { 高取さんの問題に積極的に取り組もうとは思っていないのですが… JNI の使用法について一点気づきました。 > str = (char*) env->GetStringUTFChars(strObjectURI, &strCopy); > if (strCopy == JNI_TRUE) > env->ReleaseStringUTFChars(strObjectURI, str); ここでは『if (strCopy == JNI_TRUE)』という判断はせずに、 無条件に ReleaseStringUTFChars() を呼ぶべきです。 JNI について書かれた本で、よく上記のように GetStringUTFChars() の 第 2引数に JNI_TRUE が返ってきた場合にのみ、ReleaseStringUTFChars() を 呼んでいますが、これは実はよくない (& 危険な) 書き方です。 GetString... を呼んだ場合は常に ReleaseString... を呼ぶべきです。 この誤った書き方、僕もどこか -- 確か英語の ML -- で目にしたのですが、 どうして広まったのでしょうね。 というのは… GetStringUTFChars() の際、String 型オブジェクトの内容は コピーされるか (第 2引数が JNI_TRUE)、 pinning されるか (第 2引数が JNI_FALSE) します。 Java 仮想マシンの作りによっては、ReleaseString... で pinning の解除をしないとまずいことが起きるかもしれません。 JDK の付属ドキュメントの JNI について書かれた部分、 『2. Design Overview』中のコード例 2-1 Implementing a Native Method Using C と 2-2 Implementing a Native Method Using C++ でも、 無条件で ReleaseString... を呼んでいます。 SHUDO Kazuyuki/首藤一幸 私をたばねないで あらせいとうの花のように shudoh at muraoka.info.waseda.ac.jp