给定一个 java 对象A a = new A()
和一堆本机实例方法,如果我要将jobject
表示的地址a
传递给这些方法,地址是否总是相同的?
我在这些类中有多个 final 字段,我想将它们存储在我的 C 代码中的 hashmap 中(所以我不必继续使用 获取它们Get___Field
),其中 a 的哈希是jobject
地址。如果我可以保证传入的jobject
表示的地址a
总是相同的,那么哈希是确定性的,这意味着我的程序的行为不会不一致。
给定一个 java 对象A a = new A()
和一堆本机实例方法,如果我要将jobject
表示的地址a
传递给这些方法,地址是否总是相同的?
我在这些类中有多个 final 字段,我想将它们存储在我的 C 代码中的 hashmap 中(所以我不必继续使用 获取它们Get___Field
),其中 a 的哈希是jobject
地址。如果我可以保证传入的jobject
表示的地址a
总是相同的,那么哈希是确定性的,这意味着我的程序的行为不会不一致。
正如评论所建议的那样,您不能将传入的内容保留在jobject
当前 JNI 调用上下文之外,因为它是本地引用。这些jobject
值可能会被重复使用(导致重复的表条目)或变得无效。此外,每次调用CreateGlobalRef()
都会创建一个新的、不同的jobject
. 简短的回答是“你不能这样做”。这已经在这篇文章中解决了。作为一种替代方法,请注意每个 Java 对象都有一个hashCode()
andequals()
方法。您可以使用 JNI 从您的 C/C++ 代码中调用这些方法,并在您的哈希表中使用它们。但是,在不知道何时以及如何获取字段值的详细信息的情况下,调用 JNI 方法可能并不比再次获取字段值更好。
最后,正如在这个问题中所回答的那样,您可以直接使用来测试jobject
相等性env->IsSameObject(jobject1, jobject2)
。大概jobject1
是您创建和存储的全局引用,而jobject2
传入的本地引用是您要测试的。不幸的是,这仍然不能帮助您调查您的哈希表。