在JNA的Pointer.getPointerArray(长基数)和Pointer.getStringArray(长基数)中,“基数”是什么意思?

时间:2011-09-11 07:43:19

标签: java arrays pointers jna base

JNA的“基础”是什么意思

Pointer.getPointerArray(long base) 
Pointer.getStringArray(long base)

JNA Documentation for Pointer没有解释这应该引用的“基础”。

如果它是文本格式化基础,那么为什么它也会传递给getPointerArray?

它可以指内存地址的位数吗?为什么它需要传递这样的东西(如果在java中,它不能自己解决这个问题,如果不能,我怎么办?)

如果是地址宽度,为什么要用多长时间?为未来做准备? JNA项目是否预见到具有1E19位宽的存储器地址总线的大型机器?

它应该是一个长的所有位设置为1?

它可以参考主机的硬件基础吗?对于二进制文件,这可能不是2吗?

它应该是一个偏移吗?

可能是数组终止字符吗?如果我的终止字符超过64位怎么办?如果小于64位怎么办?

1 个答案:

答案 0 :(得分:1)

挖掘JNA的Pointer类源代码,

Pointer.getPointerArray(long base)
Pointer.getStringArray(long base)

...显然在汇编程序/硬件级别的base+address memory addressing modes上下文中引用'base',其中一个寄存器将存储内存地址,而第二个寄存器将存储该地址的偏移量,即在内存访问期间自动求和。理想情况下,指针将是“基地址”,当您迭代内存的内容时,您将调整“偏移”地址。

所以基本上'base'在这个上下文中意味着'偏移':它从指针位置后的'base'字节开始,然后根据它从这些中读取的地址位置吐出指针/字符串对象内存的一部分,直到找到一个空值。我推测使用“base”一词的原因与内部编码方法有关:

它基于自身创建第二个Pointer对象,但将'base'参数作为'offset'传递,然后创建一个名为'offset'的索引变量...是的。然后它迭代,以地址字大小(通常为8)递增'offset',直到它读取空值。

因为'offset'已被用作局部变量,它将与offset参数冲突,因此编码器将方法的偏移参数命名为“base”。