java - 访问 JNA 指针的对等值

标签 java pointers jna

我正在使用 JNA . Pointer类表示 native 指针。访问似乎是 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甚至比上面的方法还要少,因为它也很脆。

最佳答案

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

正如我对其他答案的评论,“除非您知道自己在做什么,否则不要使用它。” JNA 中的任何内容通常都不需要它。只有当您确实出于其他目的需要内存地址时,对等值才真正相关。您可以迭代从 0 开始的偏移量以完成像 link 中的代码示例这样的习语。你在那里发表了你的评论。

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

关于java - 访问 JNA 指针的对等值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51803909/

相关文章:

java - 计算为 Java 代码执行的字节码的最佳方法

c - 在 C 中搜索 BST 元素函数

c - 通过字符串引用传递

java - 使用 JNA 的函数 scanf

java - 如何将 16 位字符数组转换为 8 位字符数组并使用 JNA 发送到 C 代码?

java - 如何使用 JNA 创建同一个库的多个实例?

java - 我认为我没有正确关闭连接 - Java

Java:如何表示图形?

Java Swing - 全局更改面板以具有粉红色背景

在 C 中创建数组并将指向所述数组的指针传递给函数