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

Rah*_*n82 35 null java-native-interface object

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

Dav*_*ter 33

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

if (someJObject == NULL) {}
Run Code Online (Sandbox Code Playgroud)

在C代码中应该很好我猜.我没有测试过它:-)

  • 虽然这种方法很常见,但我遇到的情况是someJObject是!= NULL,但仍然表示Java-null.更安全的测试是(*env) - > IsSameObject(env,someJObject,NULL)总是有效,所以我推荐一个. (17认同)
  • 我测试了这个.有用.C++中的'null'Java对象(作为jobject)== NULL. (3认同)

nmr*_*nmr 23

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

(*env)->IsSameObject(env, someJObject, NULL) 
Run Code Online (Sandbox Code Playgroud)

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

  • 应该是`(*env)->NewLocalRef(env, someJObject) == NULL` 吗?弱引用可能随时被释放,所以没有某种锁,检查是没有用的 (2认同)

Jen*_*nix 8

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

if (someJObject == NULL) {}
Run Code Online (Sandbox Code Playgroud)

供本地和全球参考。

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

(*env)->IsSameObject(env, someJObject, NULL)
Run Code Online (Sandbox Code Playgroud)

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

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

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