代码之家  ›  专栏  ›  技术社区  ›  BullyWiiPlaza

访问JNA指针的对等值

  •  0
  • BullyWiiPlaza  · 技术社区  · 6 年前

    JNA . 这个 Pointer peer 成员变量。但是,他们确保你不能查询它。为什么?如果你想使用它,推荐的方法是什么?

    我写了下面的“hack”:

    public static long getBaseAddress(Pointer pointer)
    {
        String stringPointer = pointer.toString();
        String[] splitStringPointer = stringPointer.split("@");
        int expectedSplitLength = 2;
    
        if (splitStringPointer.length != expectedSplitLength)
        {
            throw new IllegalStateException("Expected a length of "
                    + expectedSplitLength + " but got " + splitStringPointer.length);
        }
    
        String hexadecimalAddress = splitStringPointer[1].substring("0x".length());
        return parseLong(hexadecimalAddress, 16);
    }
    

    toString() 获取地址的方法?

    我想用 Reflection 甚至比上面的方法还少,因为它也很脆弱。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Daniel Widdis    5 年前

    虽然子类化(如technomage的答案所示)是有效的,但它是不必要的。 Pointer.nativeValue(p) 会给你 p

    在我对另一个答案的评论中,“除非你知道你在做什么,否则不要用这个。”JNA中的任何东西通常都不需要它。只有当您实际需要内存地址用于其他用途时,对等值才真正相关。您可以从0开始迭代偏移量,以完成类似于 link

    指针的getter都接受 offset share() .

        2
  •  2
  •   gpmcadam    6 年前

    生成的子类 Pointer 你可以对保护区做任何你想做的事。

    不应该 确切地 使不经意间犯这样的错误变得困难。