8

JNI メソッドから jstring を返しています。値を返す前に、それへのローカル参照を削除します。

JNIEXPORT jstring JNICALL TestJNIMethod( JNIEnv* env, jclass )
{
    jstring  test_string = env->NewStringUTF( "test_string_value" );
    env->DeleteLocalRef( test_string );
    return test_string;
}

呼び出し元の JAVA メソッドは、返された jstring に引き続きアクセスできますか? それともガベージ コレクターがメモリをクリーンアップしますか?

4

1 に答える 1

19

いいえ、そうではありませんが、コードは ICS より前の Android バージョンで動作します。このコードの ICS から正しく失敗します。

通常、ローカル参照を自分で削除する必要はありません。JNI 関数が Java に戻ると、参照は GC されます。

その規則の例外は、おそらくループでそれらを多数作成する場合です。次に、ローカル参照テーブルを埋めることができます。IBM: JNI オブジェクト参照の概要 を参照してください。

JNI Local Reference Changes in ICSを読む必要があります。Android 向けに書いていなくても、多くのよくある間違いを特定できます。

于 2013-06-06T16:49:11.277 に答える