访问JNA Pointer的对等值

时间:2018-08-11 21:31:42

标签: java pointers jna

我正在使用JNAPointer类表示本机指针。访问指针的地址似乎很普遍,该地址似乎是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 个答案:

答案 0 :(得分:2)

设为{{1}}的子类,您可以使用保护字段进行任何操作。

通常,您不应该直接访问该值,完全是使字段受保护的意图,因此很难无意中犯此类错误。

答案 1 :(得分:1)

虽然子类化(如技术专家的回答)有效,但没有必要,也很难获得peer值。 Pointer.nativeValue(p)将给您p的同伴。

就像我对另一个答案的评论一样,“除非您知道自己在做什么,否则请不要使用它。” JNA内部通常不需要它。只有当您实际上出于其他目的需要内存地址时,对等值才真正重要。您可以从0迭代一个偏移值来完成习惯用法,例如链接中的代码示例。

Pointer的getter都带有一个offset参数,您还可以使用share()简单地返回一个指向原始对等值的偏移量的指针。