gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:44:50 29 4
gpt4 key购买 nike

给定一个java对象A a = new A() ,以及一堆 native 实例方法,如果我要获取 jobject 的地址代表a传递到这些方法中,地址总是相同吗?

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

最佳答案

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

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

关于java - 如果 `jobject` 代表同一个 Java 实例,它是否总是具有相同的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53384354/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com