私のプログラムに構造体を持つC++ DLLを使用する必要があります。このために、私はJNAを使用しますが、私は内部の別のSTRUCが含まれている構造体を呼び出すしようとすると、例外がスレッド "main"の例外java.lang.IllegalStateException:配列フィールドを初期化する必要があります
後、構造体のコードですが起こる:
public class SSP_PACKET extends Structure {
public short packetTime;
public char PacketLength;
public char[] packetData;
@Override
protected List<String> getFieldOrder() {
return Arrays.asList(new String[]{"packetTime",
"PacketLength",
"packetData"});
}
}
public class SSP_COMMAND_INFO extends Structure {
public byte CommandName;
public byte LogFileName;
public byte Encrypted;
public SSP_PACKET Transmit = new SSP_PACKET();
public SSP_PACKET Receive = new SSP_PACKET();
public SSP_PACKET PreEncryptTransmit = new SSP_PACKET();
public SSP_PACKET PreEncryptReceive = new SSP_PACKET();
@Override
protected List<String> getFieldOrder() {
return Arrays.asList(new String[]{"CommandName",
"LogFileName",
"Encrypted",
"Transmit",
"Receive",
"PreEncryptTransmit",
"PreEncryptReceive"});
}
}
と例外:
スレッド内例外 "メイン" java.lang.IllegalStateException:配列 フィールドは com.sun.jna.Structure.calculateSizeで com.sun.jna.Structure.deriveLayout(Structure.java:1228)で初期化する必要があります(Structure.java:1097)a t com.sun.jna.Structure.allocateMemory(Structure.java:390)at com.sun.jna.Structure.ensureAllocated(Structure.java:366)at com.sun.jna.Structure.ensureAllocated(構造。 java:356)at com.sun.jna.Structure.size(Structure.java:423)at com.sun.jna.Structure.size(Structure.java:1075)at com.sun.jna.Native。 getNativeSize(Native.java:1271)at com.sun.jna.Structure.getNativeSize(Structure.java:2125)at com.sun.jna.Structure.getNativeSize(Structure.java:2115)at com.sun。 ja.Structure.validateField(Structure.java:1149)at com.sun.jna.Structure.validateFields(Structure.java:1162)at com.sun.jna.Structure(Structure.java:189)at(Struct.java:161)、 com.sun.jna.Structure(Structure.java:169)、 にあります。com.sun.jna.Structure(Structure.java:161) SSP_COMMAND_INFO。(SSP_COMMAND_INFO.java:5) バリ。(Validator.java:28)test.mainで(test.java:10)
Danielさん、私はJavaとJNIの初心者ですから、このアプリケーションの開発にはいくつかの問題がありました。あなたが説明した方法で私はそれを動作させました。 –