访问 JNA 指针的对等值

Accessing JNA Pointer's peer value

我正在使用 JNA. The Pointer class represents a native pointer. It seems quite common to access the pointer's address which seems to be the 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 比上面的方法更少,因为它也很脆弱。

创建 Pointer 的子类,您可以对受保护的字段做任何您想做的事情。

一般来说,您不应该直接访问该值,使该字段受保护的目的确实使其难以访问一不小心就犯了这样的错误

虽然子类化(如 technomage 的回答)有效,但没有必要。 Pointer.nativeValue(p) 会给你 p 的同伴。

正如我对其他答案的评论,"Don't use this unless you know what you're doing." JNA 内部的任何内容通常都不需要它。只有当您确实出于其他目的需要内存地址时,对等值才真正相关。您可以迭代从 0 开始的偏移量以完成像您在评论中发布的 中的代码示例这样的习语。

Pointer 的 getter 都带有一个 offset 参数,您也可以使用 share().

简单地 return 指向与原始对等值的偏移量的指针