0

给定一个 java 对象A a = new A()和一堆本机实例方法,如果我要将jobject表示的地址a传递给这些方法,地址是否总是相同的?

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

4

1 回答 1

1

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

最后,正如在这个问题中所回答的那样,您可以直接使用来测试jobject相等性env->IsSameObject(jobject1, jobject2)。大概jobject1是您创建和存储的全局引用,而jobject2传入的本地引用是您要测试的。不幸的是,这仍然不能帮助您调查您的哈希表。

于 2018-11-26T15:35:44.870 回答