访问 JNA 指针的对等值

我正在使用JNA. 本Pointer类代表了本地指针。访问似乎是peer成员变量的指针地址似乎很常见。但是,他们确保您无法查询它。为什么?如果您想使用它,推荐的获取方式是什么?


我写了以下“黑客”:


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比上述方法更少的方法,因为它也很脆弱。


智慧大石
浏览 220回答 2
2回答

一只萌萌小番薯

虽然子类化(如在 technomage 的回答中)有效,但这是不必要的。 Pointer.nativeValue(p)会给你p的同行。正如我对另一个答案的评论一样,“除非您知道自己在做什么,否则不要使用它。” JNA 中的任何内容通常都不需要它。只有当您确实出于其他目的需要内存地址时,对等值才真正相关。您可以迭代从 0 开始的偏移量以完成习语,例如您在评论中发布的链接中的代码示例。Pointer 的 getter 都接受一个offset参数,您也可以简单地使用 返回一个指向原始对等值偏移量的指针share()。

jeck猫

创建一个子类,Pointer你可以对受保护的字段做任何你想做的事情。通常,您不应直接访问该值,将字段设置为 protected 的目的正是为了防止无意中犯此类错误。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java