7

java から c に渡されるオブジェクトについて少し混乱していますか? それらはネイティブの jni メソッド内で削除する必要があります。そうしないと、メソッドが戻るときにガベージ コレクションが行われます。例えば:

Java ファイルにネイティブ宣言がpublic native printString(String msg);あり、ネイティブ メソッドを使用const char *message = (jni_env)->GetStringUTFChars(msg, &iscopy);して文字列の C スタイル文字配列を取得している場合。Shoud I call (jni_env)->ReleaseStringUTFChars(msg, message);ネイティブメソッドですべてのことをした後。はいの場合、なぜそれが必要なのですか?プログラマーに代わってJavaランタイム環境がこれを実行しないのはなぜですか? 結局、文字列は Java 環境から宣言されて渡されました。

4

1 に答える 1

5

Get Characters関数は、Releaseメソッドが呼び出されるまで、メモリ内の文字を固定します。Javaは、誰も使用していないことが確実になるまで、このデータをガベージコレクションしたり移動したりすることはできません。

Java VMは、Java仮想マシンを離れた後のメモリの使用期間について何も知ることができないため、メモリが終了したことを手動で通知する必要があります。

于 2012-08-21T17:22:04.333 に答える