线程"main"中的异常java.lang.IllegalStateException:数组字段必须初始化 [英] Exception in thread "main" java.lang.IllegalStateException: Array fields must be initialized

查看:264
本文介绍了线程"main"中的异常java.lang.IllegalStateException:数组字段必须初始化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I need to use a c ++ DLL with structs in my program. For this, I use JNA but, when I try to call the struct that contains another struc inside, the exception happens

以下是结构代码:

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

Exception in thread "main" java.lang.IllegalStateException: Array fields must be initialized at 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.(Validator.java:28) at test.main(test.java:10)

推荐答案

该错误是不言自明的,指向行号,给您带来了问题. SSP_COMMAND_INFO类的第5行尝试实例化SSP_PACKET对象,但是由于未初始化数组而使该步骤失败. JNA(以及C)不知道数组的大小或要保留多少内存.

The error is rather self explanatory and points to the line number giving you a problem. Line 5 of your SSP_COMMAND_INFO class tries to instantiate an SSP_PACKET object, but is failing that step because you haven't initialized the array. JNA (and thus C) doesn't know the size of the array or how much memory to reserve.

您的public char[] packetData;需要初始化为新的数组长度,例如

Your public char[] packetData; needs to be initialized to a new array length, e.g.,

public char[] packetData = new char[255];

(显然不是255,而是需要查询API才能看到实际的数组大小.)

(Obviously rather than 255 you need to consult your API to see what the actual array size is.)

另一个重要的注意事项是,您在这里想要的Java char类型是不太可能的.如果要使用char映射C头文件,则要在此处将其替换为byte.我猜你真的想要:

Another important note is that it is very unlikely that Java's char type is what you want here. If you're mapping a C header file with char you want to replace it here with byte. I'm guessing you really want:

public byte PacketLength;
public byte[] packetData = new byte[255];

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

As a final note, it is unnecessary to initialize the nested structures within your SSP_COMMAND_INFO structure as you have with new SSP_PACKET(). JNA does this for you automatically.

这篇关于线程"main"中的异常java.lang.IllegalStateException:数组字段必须初始化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆