线程" main"中的例外情况java.lang.IllegalStateException:必须初始化数组字段

时间:2017-03-25 15:41:31

标签: java arrays jna

我需要在程序中使用带有结构的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)

1 个答案:

答案 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会自动为您完成此操作。