创建时的JNA结构StackOverflowError

时间:2017-06-14 09:57:53

标签: structure jna

您好我有一个结构形式的c项目我需要包含在java中。

struct usb_relay_device_info {
    unsigned char *serial_number;
    char *device_path;
    usb_relay_device_type type;
    usb_relay_device_info* next;};

我创建了一个Java类

public class RelayInfo extends Structure {

public String device_path;
public RelayInfo next;
public byte[] serial_number;
public RelayType type;

@Override
protected List getFieldOrder() {
    return Arrays.asList("device_path", "next", "serial_number", "type");
}}

当我尝试运行我的项目时,我得到一个stackOverwlowError

Exception in thread "main" java.lang.StackOverflowError
at java.util.Hashtable.get(Hashtable.java:363)
at java.util.Properties.getProperty(Properties.java:969)
at java.util.Properties.getProperty(Properties.java:988)
at java.lang.System.getProperty(System.java:756)
at com.sun.jna.Native.getDefaultStringEncoding(Native.java:669)
at com.sun.jna.Native.getStringEncoding(Native.java:662)
at com.sun.jna.Structure.<init>(Structure.java:177)
at com.sun.jna.Structure.<init>(Structure.java:172)
at com.sun.jna.Structure.<init>(Structure.java:159)
at com.sun.jna.Structure.<init>(Structure.java:151)
at relay.RelayInfo.<init>(RelayInfo.java:11)
at sun.reflect.GeneratedConstructorAccessor1.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at com.sun.jna.Structure.newInstance(Structure.java:1773)
at com.sun.jna.Structure.newInstance(Structure.java:1759)
at com.sun.jna.Structure.size(Structure.java:1030)
at com.sun.jna.Native.getNativeSize(Native.java:1172)
at com.sun.jna.Structure.getNativeSize(Structure.java:2072)
at com.sun.jna.Structure.getNativeSize(Structure.java:2062)
at com.sun.jna.Structure.validateField(Structure.java:1105)
at com.sun.jna.Structure.validateFields(Structure.java:1119)
at com.sun.jna.Structure.<init>(Structure.java:179)
at com.sun.jna.Structure.<init>(Structure.java:172)
at com.sun.jna.Structure.<init>(Structure.java:159)
at com.sun.jna.Structure.<init>(Structure.java:151)
at relay.RelayInfo.<init>(RelayInfo.java:11)
at sun.reflect.GeneratedConstructorAccessor1.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

当我调试它时,方法threw'java.lang.StrackOverflowError'异常。无法评估relay.RelayInfo.toString()

但是使用JNA我不需要toString覆盖或?

有什么不对?有人有想法吗? 谢谢vor helbing

3 个答案:

答案 0 :(得分:1)

这里涉及两个问题:类型映射和参数的顺序。

您的Java结构必须与C结构中变量的顺序完全匹配,因为JNA将按偏移量映射变量。我从评论中了解到,您已经解决了这个问题。

其次,您需要小心type mappings。虽然char *可以是一个字符串,但也可能是ByteByReference,因此您需要查看C结构的上下文来确定它是什么。我相信您已为String正确映射device_path,但我强烈怀疑serial_numberByteByReference而不是byte[]您是RelayType已经定义了(无论如何你需要初始化;因为你没有长度以至于不知道它是不对的)。最后,您已经定义了usb_relay_device_type类型的变量,但还没有编写映射到相应C enum的JNA结构。 (编辑:我看到你已经澄清了int:它映射到{{1}}。)

答案 1 :(得分:0)

找到我的答案。 不知道它是如何工作的

public class RelayInfo extends Structure {

/*
struct RelayInfo {
    unsigned char *serial_number;
    char *device_path;
    usb_relay_device_type type;
    usb_relay_device_info* next;
};
*/

public ByteByReference serial_number;
public String device_path;
public int type;
public String next;

@Override
protected List getFieldOrder() {
    return Arrays.asList("serial_number", "device_path", "type", "next");
}}

这是如何为继电器工作的。 感谢大家如何帮助我:)

答案 2 :(得分:0)

它的节点结构如that 因此,请尝试在 PointerByReference 中使用 RelayInfo 。并将字段 next 保留为RelayInfo.ByReference

相关问题