我需要在程序中使用带有结构的c ++ DLL。为此,我使用JNA但是,当我尝试调用内部包含另一个struc的结构时,异常发生
以下是结构的代码:
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"});
}
}
例外:
线程中的异常&#34; main&#34; java.lang.IllegalStateException:Array 字段必须初始化为 com.sun.jna.Structure.deriveLayout(Structure.java:1228)at com.sun.jna.Structure.calculateSize(Structure.java:1097)at com.sun.jna.Structure.allocateMemory(Structure.java:390)at com.sun.jna.Structure.ensureAllocated(Structure.java:366)at com.sun.jna.Structure.ensureAllocated(Structure.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.jna.Structure.validateField(Structure.java:1149)at com.sun.jna.Structure.validateFields(Structure.java:1162)at com.sun.jna.Structure。(Structure.java:189)at com.sun.jna.Structure。(Structure.java:182)at com.sun.jna.Structure。(Structure.java:169)at com.sun.jna.Structure。(Structure.java:161)at SSP_COMMAND_INFO。(SSP_COMMAND_INFO.java:5)at 验证者。(Validator.java:28)在test.main(test.java:10)
答案 0 :(得分:1)
错误是相当自我解释的,并指向给您一个问题的行号。 SSP_COMMAND_INFO
类的第5行尝试实例化SSP_PACKET
对象,但由于尚未初始化数组,因此该步骤失败。 JNA(以及C)不知道数组的大小或要保留多少内存。
您的public char[] packetData;
需要初始化为新的数组长度,例如,
public char[] packetData = new char[255];
(显然,而不是255,你需要咨询你的API,看看实际的数组大小是多少。)
另一个重要的注意事项是,Java char
类型不太可能是您想要的。如果您使用char
映射C头文件,则需要将其替换为byte
。我猜你真的想要:
public byte PacketLength;
public byte[] packetData = new byte[255];
最后一点,没有必要像SSP_COMMAND_INFO
一样初始化new SSP_PACKET()
结构中的嵌套结构。 JNA会自动为您完成此操作。