1

JNIコードに次の警告が表示されます。

JNI WARNING: 0x44be7258 is not a valid JNI reference

JNIのFindClassメソッドによって返されるLocalReferenceを、コンストラクター内のクラスメンバー変数に割り当てています。

ヘッダ:

...
jclass m_class;

Cpp:

m_class = env->FindClass( classSignature );

FindClassはLocalReferenceを返し、それをクラスメンバー変数に格納することは無効ですか?

4

1 に答える 1

2

Liangの本、第5.1.1章「ローカルリファレンス」から

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

正確にあなたのメソッドを使用する違法なコード例が続きますFindClass。つまり、yesFindClassはローカル参照を返します。次の章では、必要な方法で使用できるグローバル参照を作成する例を示します。DeleteGlobalRefもう必要なくなったときは忘れないでください。そうしないと、JVMはそれをGCできず、プログラムがリークします。

于 2012-08-10T20:53:42.250 に答える