web-dev-qa-db-ja.com

JNI:jobjectがネイティブcコードのnullオブジェクトであるかどうかを確認するにはどうすればよいですか?

JNI:jobjectがネイティブcコードのnullオブジェクトであるかどうかを確認するにはどうすればよいですか?

36
RahulMohan82

JavaとCコードのオブジェクトは実際には同じメモリ位置を使用するため(ネイティブコードに渡されるオブジェクトは両方の世界で同じメモリ参照です)、単純です

if (someJObject == NULL) {}

cコードでは問題ないと思います。私はそれをテストしていません:-)

35
David Sauter

Steworiのコメントは答えに値するので、ここにあります:

(*env)->IsSameObject(env, someJObject, NULL) 

このテストは、参照型がJNIWeakGlobalRefTypeである場合に値の比較が失敗する場合と、ローカルまたはグローバル参照である場合に成功すると思います。

25
nmr

受け入れられた答えと他の答えはすべて正しいです。しかし、より明確にするために、あなたはいつでもチェックすることができます

if (someJObject == NULL) {}

ローカル参照とグローバル参照の両方。

弱いグローバル参照については、

(*env)->IsSameObject(env, someJObject, NULL)

Java側の元のオブジェクトはすでにガベージコレクションされている可能性がありますが、C側のsomeJObjectにはまだ古い参照がありますしたがって、後者は常に両方の場合に機能すると言っても過言ではありません。

しかし、ここで注意すべきことがもう1つあります。弱いグローバル参照の場合は、IsSameObject()の結果値に基づいてJNI関数を呼び出さないでください。これは、IsSameObject()からTRUEを取得した直後でも、オブジェクトをいつでもガベージコレクションできるためです。 ここここ から私が意味することを得ることができます。

したがって、個人的には、グローバル参照が弱い特殊なケースを扱っているのでない限り、好きなものを選択できると思います。単純なケースの場合、前者はJNI関数を呼び出すよりも読みやすく、さらに安価です。

3
Jenix