1

JNI のグローバル参照は、プログラマが手動で解放する必要がある参照であると言われています。c コンテキストとは何の関係もありません。のようなコード:

{
    jclass clsStr = (*env)->NewGlobalRef(env,cls); 
}

return clsStr;

clsStrそれが undefined / undeclaredであるというエラーが表示されます。これは分かります。しかし、私が理解していないのは、これらのタイプの参照の使用です。

clsStr上記のコードでグローバルとは何ですか? この変数は、将来または呼び出しが返された後にどのように役立ちますか? また、 「基本的に、グローバル参照は、それ (およびその内容) が次の JNI 呼び出しまで存続することを保証するのに役立ちます」と読みましたが、これは理解できません。

4

2 に答える 2

1

JNI のグローバル参照は、プログラマーが手動で解放する必要がある参照と言われています。c コンテキストとは何の関係もありません。

いいえ、そうではありません。これは、 JNI 仕様からのひどい誤引用です。これが実際に言っていることです:

JNI は、ネイティブ コードで使用されるオブジェクト参照を、ローカル参照とグローバル参照の 2 つのカテゴリに分類します。ローカル参照は、ネイティブ メソッド呼び出しの間有効であり、ネイティブ メソッドが戻った後に自動的に解放されます。グローバル参照は、明示的に解放されるまで有効です。

JNI では、C プログラミング言語のセマンティクスを変更することはできません。

于 2012-05-15T23:46:23.103 に答える
1

NewGlobalRef()これは、ネイティブメソッドへの複数の呼び出しから取得した参照を保持できることを意味します。明示的に を呼び出すまで、参照は有効なままですDeleteGlobalRef()

これは、ローカル参照とは対照的です。

ローカル参照は、それを作成するネイティブ メソッドの動的コンテキスト内でのみ有効であり、ネイティブ メソッドのその 1 つの呼び出し内でのみ有効です。ネイティブ メソッドの実行中に作成されたすべてのローカル参照は、ネイティブ メソッドが戻ると解放されます。

を呼び出す前にスコープ外に出ることが許可されている変数にグローバル参照を格納するとDeleteGlobalRef()、メモリ リークが発生します。以下はその例です。

{
    jclass clsStr = (*env)->NewGlobalRef(env,cls); 
}
于 2012-05-15T09:48:24.987 に答える