如何通过JNA Pointer获取内存偏移指针并写入数据?
问题原因分析
你遇到的Invalid memory access错误,核心是误用了Pointer.getPointer(int offset)方法!
这个方法不是用来创建指向原内存偏移位置的指针,而是从当前指针指向的内存的offset位置读取一个指针类型的值,把这个随机的未初始化值当作新的指针地址。因为你刚分配的Memory内存块内容是未定义的随机值,所以getPointer(4)返回的是指向无效内存的指针,调用setInt自然会触发内存访问错误。
正确的解决方案
要获取指向原内存偏移位置的有效指针,应该用Pointer.share(int offset)方法,它会返回一个共享原内存块的新指针,指向原指针偏移offset后的地址:
方法1:使用share创建偏移指针
Pointer pM = new Memory(65536); // 创建指向pM偏移4字节位置的有效指针 Pointer p = pM.share(4); pM.setInt(0, 0xFFFF); // 修改原内存0-3字节 p.setInt(0, 0xBBBB); // 修改原内存4-7字节(和pM.setInt(4, 0xBBBB)效果完全一致)
方法2:直接使用原指针+偏移写入
如果不需要单独的偏移指针,直接在原Memory对象上调用带偏移参数的setInt方法更直接:
Pointer pM = new Memory(65536); pM.setInt(0, 0xFFFF); // 写入0偏移位置 pM.setInt(4, 0xBBBB); // 直接写入4偏移位置,无需额外指针
验证操作是否正确
你可以通过读取原内存的对应偏移位置来确认写入成功:
// 读取原内存4偏移位置的值,预期输出为bbbb System.out.println(Integer.toHexString(pM.getInt(4)));
内容的提问来源于stack exchange,提问作者p1906
相关产品推荐
相关产品推荐

