JNI:我如何检查jobject是否是本机c代码中的空对象
答案 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之后也是如此。 您可以从here和here了解我的意思。
所以,我个人认为你可以选择任何你想要的东西,除非你处理一些弱全球参考的特殊情况。对于简单的情况,前者比调用JNI函数更容易阅读甚至更便宜。