如果jobject代表相同的Java实例,是否总是具有相同的地址?

时间:2018-11-19 23:59:45

标签: java c java-native-interface native jniwrapper

给出了一个Java对象A a = new A()和一堆本地实例方法,如果我要使用表示传递到这些方法中的jobject的{​​{1}}的地址,地址总是一样吗?

这些类中有多个final字段,我想将它们存储在C代码的哈希图中(因此,我不必继续使用a来获取它们),并使用{{1 }}是地址。如果我可以保证代表Get___Field的{​​{1}}的传入地址始终是相同的,则哈希是确定性的,这意味着程序的行为不会不一致。

1 个答案:

答案 0 :(得分:1)

正如评论所建议的那样,您不能将传入的jobject保留在当前JNI调用上下文之外,因为它是本地引用。 jobject值可能会被重用(导致重复的表条目)或变得无效。此外,每次对CreateGlobalRef()的调用都会创建一个不同的新jobject。简短的回答是“您不能这样操作”。 this post中已经解决了这一问题。作为一种替代方法,请注意,每个Java对象都有一个hashCode()equals()方法。您可以使用JNI 从C / C ++代码中调用这些方法,并在哈希表中使用它们。但是,在不知道何时以及如何获取字段值的详细信息的情况下,调用JNI方法可能比重新获取字段值更好。

最后,根据this question的回答,您可以直接使用jobject测试env->IsSameObject(jobject1, jobject2)的相等性。大概jobject1是您创建并存储的 global 引用,而jobject2是您要测试的传入的 local 引用反对。不幸的是,这仍然无法帮助您探究哈希表。