我正在使用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
甚至比上面的方法少,因为它也很脆。 最佳答案
虽然子类化(如技术专家的回答)有效,但这是不必要的。 Pointer.nativeValue(p)
将给您p
的同伴。
就像我对其他答案的评论一样,“除非您知道自己在做什么,否则请不要使用它。” JNA内部通常不需要它。只有当您实际上出于其他目的需要内存地址时,对等值才真正重要。您可以迭代从0开始的偏移量,以完成习惯用法,例如您在注释中发布的link中的代码示例。
指针的获取器都带有offset
参数,您也可以使用share()
简单地返回一个指向原始对等值的偏移量的指针。