代码之家  ›  专栏  ›  技术社区  ›  Mario Ishac

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

  •  0
  • Mario Ishac  · 技术社区  · 7 年前

    给定Java对象 A a = new A() 以及一组本机实例方法,如果我要获取 jobject 代表 a 通过这些方法, 地址总是一样吗?

    我在这些类中有多个最终字段,我希望将它们存储在C代码的哈希图中(因此我不必继续用 Get___Field )的哈希值 工作项目 地址。如果我能保证 工作项目 代表 一 总是一样的,那么散列是确定性的,这意味着我的程序的行为不会不一致。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Wheezil    7 年前

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

    最后,如中所回答的 this question 你可以测试 工作项目 直接使用等同性 env->IsSameObject(jobject1, jobject2) . 大概, jobject1 是 全球的 您已创建和存储的引用,而 jobject2 是传进来的吗 地方的 要测试的引用。不幸的是,这仍然不能帮助您探究哈希表。