【问题标题】:Exception in thread "main" java.lang.IllegalStateException: Array fields must be initialized线程“main”java.lang.IllegalStateException 中的异常:必须初始化数组字段
【发布时间】:2017-03-28 00:45:43
【问题描述】:

我需要在我的程序中使用带有结构的 c++ DLL。为此,我使用 JNA,但是当我尝试调用内部包含另一个结构的结构时,会发生异常

以下是结构的代码:

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"});
    }
}

还有例外:

线程“main”中的异常 java.lang.IllegalStateException: Array 字段必须初始化为 com.sun.jna.Structure.deriveLayout(Structure.java:1228) 在 com.sun.jna.Structure.calculateSize(Structure.java:1097) 在 com.sun.jna.Structure.allocateMemory(Structure.java:390) 在 com.sun.jna.Structure.ensureAllocated(Structure.java:366) 在 com.sun.jna.Structure.ensureAllocated(Structure.java:356) 在 com.sun.jna.Structure.size(Structure.java:423) 在 com.sun.jna.Structure.size(Structure.java:1075) 在 com.sun.jna.Native.getNativeSize(Native.java:1271) 在 com.sun.jna.Structure.getNativeSize(Structure.java:2125) 在 com.sun.jna.Structure.getNativeSize(Structure.java:2115) 在 com.sun.jna.Structure.validateField(Structure.java:1149) 在 com.sun.jna.Structure.validateFields(Structure.java:1162) 在 com.sun.jna.Structure.(Structure.java:189) 在 com.sun.jna.Structure.(Structure.java:182) 在 com.sun.jna.Structure.(Structure.java:169) 在 com.sun.jna.Structure.(Structure.java:161) 在 SSP_COMMAND_INFO.(SSP_COMMAND_INFO.java:5) 在 Validator.(Validator.java:28) at test.main(test.java:10)

【问题讨论】:

    标签: java arrays jna


    【解决方案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];
    

    最后一点,没有必要像 new SSP_PACKET() 那样初始化 SSP_COMMAND_INFO 结构中的嵌套结构。 JNA 会自动为您执行此操作。

    【讨论】:

      猜你喜欢
      • 2020-10-07
      • 2019-09-25
      • 1970-01-01
      • 2020-09-13
      • 2021-02-10
      • 2010-10-09
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多