嗨,我有一个结构形式的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)当我调试时,它说方法抛出了“java.lang.StrackOverflowError”异常。无法计算relay.RelayInfo.toString()
但是使用JNA我不需要toString重写,还是?
怎么啦?有谁有主意吗?感谢vor helbing
发布于 2017-06-14 22:32:26
这里涉及到两个问题:类型映射和参数的顺序。
您的Java结构必须与C结构中变量的顺序完全匹配,因为JNA将按偏移量映射变量。我从评论中了解到你已经解决了这个问题。
其次,您需要小心使用type mappings。虽然char *可以是字符串,但也可以是ByteByReference,所以您需要查看C结构的上下文来决定它是哪一个。我相信您已经正确地为device_path映射了String,但我强烈怀疑serial_number是一个ByteByReference,而不是您定义的byte[] (无论如何,您都需要初始化它;因为您没有长度,这是一个线索,这是不正确的)。最后,您已经定义了一个RelayType类型的变量,但是还没有编写映射到相应C usb_relay_device_type的JNA结构。(编辑:我看到您已经澄清了,这是一个映射到int的enum。)
发布于 2017-06-15 17:10:20
找到我的答案了。不知道它是如何工作的,但它正在工作
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");
}}这就是接力赛的工作原理。感谢所有试图帮助我的人:)
发布于 2017-10-20 15:12:36
它的节点结构类似于that,因此请尝试使用包装在PointerByReference.中的RelayInfo并将字段next保留为RelayInfo.ByReference
https://stackoverflow.com/questions/44541434
复制相似问题