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

发布于 2024-08-23 22:04:14 字数 36 浏览 5 评论 0原文

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

JNI: How can i check if jobject is a null object in native c code

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

诗化ㄋ丶相逢 2024-08-30 22:04:14

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

if (someJObject == NULL) {}

我认为 C 代码中的简单应该就可以了。不过我还没有测试过:-)

Since the objects in Java and C code actually use the same memory locations (the object passed to the native code is the same memory reference in both worlds), a simple

if (someJObject == NULL) {}

in the C code should be just fine I guess. I haven't tested it though :-)

枫以 2024-08-30 22:04:14

Stewori 的评论应该是一个答案,所以这里是:

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

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

Stewori's comment deserves to be an answer, so here it is:

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

I think that this test succeeds where value comparison fails when the reference type is JNIWeakGlobalRefType, vs a local or a global ref.

那一片橙海, 2024-08-30 22:04:14

接受的答案和其他答案都是正确的。
但更清楚地说,您始终可以检查

if (someJObject == NULL) {}

本地和全局引用。

至于弱全局引用,你应该使用,

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

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

但这里还有另一件事需要注意。如果它是弱全局引用,则不应根据 IsSameObject() 的结果值调用任何 JNI 函数。
这是因为该对象可以随时被垃圾回收,即使是在从 IsSameObject() 获得 TRUE 之后。
您可以从此处 和 这里

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

The accepted answer and the other answers are all correct.
But to be more clear, you can always check

if (someJObject == NULL) {}

for both local and global references.

As for a weak global reference, you should use

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

because the original object on Java side could be garbage collected already while the someJObject on C side still has the old reference value.
So it's safe to say the latter always will work for both cases.

But there's another thing to note here. You shouldn't call any JNI functions based on the result value of IsSameObject(), if it's a weak global reference.
This is because the object can be garbage collected anytime, even just after getting TRUE from IsSameObject().
You can get what I mean from here and here.

So, personally I think you may choose whatever you want unless you're dealing with some special cases with weak global references. For simple cases, the former is more easy to read and even cheaper than calling a JNI function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文