Marshal.Copy在Java中

时间:2013-08-06 07:07:13

标签: c# java jna

我正在尝试使用JNA将一些C#代码转换为java,我仍然坚持使用最后一个函数。

在C#中,它被称为

Marshal.Copy

这是我到目前为止所尝试的

byte[] string = new byte[tSecDec.SECItemLen];
Pointer ptr = new Memory(string.length);
ptr.read(tSecDec.SECItemData, string, 0, tSecDec.SECItemLen);
System.out.println(Native.toString(string));

但它没有用,因为我收到了这个错误

Exception in thread "main" java.lang.IndexOutOfBoundsException: Bounds exceeds available space : size=7, offset=419439024
at com.sun.jna.Memory.boundsCheck(Memory.java:186)
at com.sun.jna.Memory.read(Memory.java:203)

1 个答案:

答案 0 :(得分:2)

您正在分配tSecData.SECItemLen-1个字节,但您要求复制tSecDec.SECItemLen个字节。如错误消息所示,请求的副本范围超出可用(已分配)空间。

A)分配全尺寸,不要减少一个。

B)使用Native.toString(byte[])将字节数组转换为Java String

修改

Pointer.read()的第一个参数是偏移量。对于您分配的内存,如果它不是零,加上tSecDec.SECItemLen的长度,您将超出分配的内存边界(因为它的长度为tSecDec.SECItemLen)。

无论如何,那段代码都是假的 - 你正在从新分配的内存中读取一个字符串,这最多会给你一个空字符串(如果内存为零)。