我正在尝试使用sun.misc.Unsafe.allocateMemory()分配内存,并以本机代码访问它。
但是,似乎allocateMemory返回的long值在C代码中不能作为正确的地址。
Unsafe unsafe = getUnsafe();
long address = unsafe.allocateMemory(64);
for (int i = 0; i < 64; i += 8)
unsafe.putByte(memory + i, (byte) 0xFF);
nativeMethod(address);
但是在我的本机代码中,当我尝试将“地址”作为指针访问时,它不起作用:(
更新:我附上了一张显示问题的图片。 我将'地址'传递给本机代码,然而,检查该位置的内存并没有显示我放在那里的0xFF值。
图片: http://i.stack.imgur.com/KoIYG.png
答案 0 :(得分:11)
我觉得它工作得很好!您的“for”循环将每八个字节设置为0xff
,如果仔细查看显示和计数,您会看到每隔八个字节 0xff
。其中还有一些其他随机值,因为Unsafe. allocateMemory()
不会返回归零内存;它返回未初始化的内存,就像C的malloc()
。
如果您将“i + = 8”更改为“i ++”,那么每个字节将为0xff
;值得做那个实验来向自己证明它正在发挥作用。