1

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)
4

1 に答える 1

2

バイトを割り当てtSecData.SECItemLen-1ていますが、バイトのコピーを要求していtSecDec.SECItemLenます。エラー メッセージが示すように、要求されたコピーの境界は、使用可能な (割り当てられた) スペースを超えています。

A) フルサイズを割り当てます。1 ずつ減らさないでください。

B)Native.toString(byte[])バイト配列を Java に変換するために使用しますString

編集

の最初の引数Pointer.read()はオフセットです。割り当てたメモリについては、それがゼロ以外の場合、長さ と組み合わせると、tSecDec.SECItemLen割り当てられたメモリの境界を超えます (長さ で割り当てられたためtSecDec.SECItemLen)。

とにかく、そのコードは偽物です-新しく割り当てられたメモリから文字列を読み取っていますが、せいぜい空の文字列が得られます(メモリがゼロの場合)。

于 2013-08-06T17:48:12.870 に答える