首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JNA Structure StackOverflowError on create

JNA Structure StackOverflowError on create
EN

Stack Overflow用户
提问于 2017-06-14 17:57:53
回答 3查看 696关注 0票数 0

嗨,我有一个结构形式的c项目,我需要包括在java中。

代码语言:javascript
运行
复制
struct usb_relay_device_info {
    unsigned char *serial_number;
    char *device_path;
    usb_relay_device_type type;
    usb_relay_device_info* next;};

我创建了一个Java类

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

EN

回答 3

Stack Overflow用户

发布于 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结构。(编辑:我看到您已经澄清了,这是一个映射到intenum。)

票数 1
EN

Stack Overflow用户

发布于 2017-06-15 17:10:20

找到我的答案了。不知道它是如何工作的,但它正在工作

代码语言:javascript
运行
复制
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");
}}

这就是接力赛的工作原理。感谢所有试图帮助我的人:)

票数 0
EN

Stack Overflow用户

发布于 2017-10-20 15:12:36

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44541434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档