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



给定一个java对象A a = new A()和一堆本机实例方法,如果我取传递到这些方法中的代表ajobject的地址,地址是否总是相同的

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

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

最后,正如这个问题中所回答的,您可以直接使用env->IsSameObject(jobject1, jobject2)测试jobject的相等性。据推测,jobject1是您创建并存储的全局引用,而jobject2是您要测试的传入本地参考。不幸的是,这仍然不能帮助您探究哈希表。

相关内容

最新更新