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

Does `jobject` always have the same address if it represents the same Java instance?

给定一个 java 对象 A a = new A() 和一堆本地实例方法,如果我要获取代表 ajobject 的地址传递给那些方法,地址总是一样吗?

我在这些 类 中有多个 final 字段,我想将它们存储在我的 C 代码的哈希图中(这样我就不必继续使用 Get___Field 获取它们),与jobject 的散列是地址。如果我能保证传入的一个 jobject 代表 a 的地址永远相同,那么哈希是确定性的,这意味着我的程序的行为不会不一致。

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

最后,如 this question 中的回答,您可以直接使用 env->IsSameObject(jobject1, jobject2) 测试 jobject 相等性。据推测,jobject1 是您创建和存储的 global 引用,而 jobject2 是传入的 local您要测试的参考。不幸的是,这仍然无法帮助您探查您的散列 table.