2012-02-17 55 views
4

我想使用sun.misc.Unsafe.allocateMemory()分配内存并在本地代码中访问它。在本地代码中使用由sun.misc.Unsafe.allocateMemory()分配的内存

但是,似乎allocateMemory返回的长整型值在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

enter image description here

+0

不工作*如何*?你也需要显示本地代码。 – 2012-02-17 05:37:31

+1

好吧,我已经解释了'如何',甚至现在附上图像 – pdeva 2012-02-17 05:44:48

回答

10

我觉得它工作得很好!您的“for”循环将每八个字节设置为0xff,如果仔细观察显示和计数,您会看到每八个字节0xff。那里有一些其他的随机值,因为Unsafe. allocateMemory()不返回归零内存;它会返回未初始化的内存,就像C的malloc()一样。

如果您将“i + = 8”更改为“i ++”,则字节将为0xff;这是值得做这个实验,以证明它的工作。

+2

你是正确的。谢谢!我忽略了这样一个事实,即内存分配需要一个“字节”参数,并且基本上都搞糟了。如果我们见面,提醒我给你买啤酒:) – pdeva 2012-02-17 05:55:20

+1

+1:AFAIK,allocateMemory只是调用malloc()。 – 2012-02-17 08:31:59