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代码中应该很好我猜.我没有测试过它:-)
nmr*_*nmr 23
Stewori的评论值得回答,所以这里是:
(*env)->IsSameObject(env, someJObject, NULL)
Run Code Online (Sandbox Code Playgroud)
我认为当引用类型为JNIWeakGlobalRefType,与本地或全局引用相比时,此测试成功,其中值比较失败.
接受的答案和其他答案都是正确的。但为了更清楚,您可以随时检查
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 函数更便宜。
| 归档时间: |
|
| 查看次数: |
19659 次 |
| 最近记录: |