JNI:我如何检查jobject是否是本机c代码中的空对象

时间:2010-02-27 07:58:53

标签: object null java-native-interface

JNI:我如何检查jobject是否是本机c代码中的空对象

3 个答案:

答案 0 :(得分:31)

由于Java和C代码中的对象实际上使用相同的内存位置(传递给本机代码的对象在两个世界中都是相同的内存引用),所以简单

if (someJObject == NULL) {}
在C代码中的

应该很好我猜。我没有测试过它: - )

答案 1 :(得分:22)

Stewori的评论值得回答,所以这里是:

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

我认为当引用类型为JNIWeakGlobalRefType,而不是本地或全局引用时,此测试会成功进行值比较失败。

答案 2 :(得分:2)

接受的答案和其他答案都是正确的。 但更清楚的是,您可以随时查看

if (someJObject == NULL) {}

用于本地和全局参考。

对于弱全局引用,您应该使用

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

因为Java端的原始对象可能已经被垃圾收集,而C端的 someJObject 仍然具有旧的引用值。 因此可以肯定地说后者总是适用于这两种情况。

但这里还有另一件事要注意。如果它是弱全局引用,则不应该根据 IsSameObject()的结果值调用任何JNI函数。 这是因为对象可以随时进行垃圾收集,即使在从 IsSameObject()获取TRUE之后也是如此。 您可以从herehere了解我的意思。

所以,我个人认为你可以选择任何你想要的东西,除非你处理一些弱全球参考的特殊情况。对于简单的情况,前者比调用JNI函数更容易阅读甚至更便宜。