您好我有一个结构形式的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
答案 0 :(得分:1)
这里涉及两个问题:类型映射和参数的顺序。
您的Java结构必须与C结构中变量的顺序完全匹配,因为JNA将按偏移量映射变量。我从评论中了解到,您已经解决了这个问题。
其次,您需要小心type mappings。虽然char *
可以是一个字符串,但也可能是ByteByReference
,因此您需要查看C结构的上下文来确定它是什么。我相信您已为String
正确映射device_path
,但我强烈怀疑serial_number
是ByteByReference
而不是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