Java JNA Linkedlist声明 我需要访问java应用程序的C++代码。本机int函数运行良好,但对于Linkedlist结构,我在Internet上找不到任何关于如何声明java接口的参考 此C++代码< /P> struct usb_relay_device_info { unsigned char *serial_number; char *device_path; usb_relay_device_type type; usb_relay_device_info* next; }; int EXPORT_API usb_relay_init(void); struct usb_relay_device_info EXPORT_API * usb_relay_device_enumerate(void); int EXPORT_API usb_relay_device_open(struct usb_relay_device_info* device_info);

Java JNA Linkedlist声明 我需要访问java应用程序的C++代码。本机int函数运行良好,但对于Linkedlist结构,我在Internet上找不到任何关于如何声明java接口的参考 此C++代码< /P> struct usb_relay_device_info { unsigned char *serial_number; char *device_path; usb_relay_device_type type; usb_relay_device_info* next; }; int EXPORT_API usb_relay_init(void); struct usb_relay_device_info EXPORT_API * usb_relay_device_enumerate(void); int EXPORT_API usb_relay_device_open(struct usb_relay_device_info* device_info);,java,c++,struct,linked-list,jna,Java,C++,Struct,Linked List,Jna,这是java部分 public interface JNI extends Library { JNI INSTANCE = (JNI) Native.loadLibrary("usb", JNI.class); public static class usb_relay_device_info extends Structure { public static class DeviceInfo extends usb_relay_device_info implements Stru

这是java部分

public interface JNI extends Library {
JNI INSTANCE = (JNI) Native.loadLibrary("usb", JNI.class);

public static class usb_relay_device_info extends Structure {
    public static class DeviceInfo extends usb_relay_device_info implements Structure.ByValue {
    }

    public byte[] serial_number = new byte[1024];
    public String device_path;
    public int type;
}


int usb_relay_init();
usb_relay_device_info.DeviceInfo usb_relay_device_enumerate();
int usb_relay_device_open(usb_relay_device_info.DeviceInfo deviceInfo);
}


我已经在java代码中创建了结构,而不是Linkedlist结构。因此,当我调用函数时,值没有显示出来,因为它应该是C++中的一个列表linkedlist

你说我在Internet上找不到任何关于如何声明java接口的参考,但是有很多参考,包括JNA,链接到主项目页面

在这里,您会发现char*是一个C字符串,应该映射到Java的字符串

usb_中继_设备_类型映射必须在映射的API中引用。在本例中,它是一个枚举类型,是一个整数,因此int在这里可能是合适的。在某些情况下,它可以是一个较小的整数值,如short或byte,但这种情况很少见

至于指向下一个设备的指针,在struct*下的概览页面上也会引用该指针。链接或显式链接到Structure.ByReference。这可能并不明显,但同样链接在JNA项目主页上的。如果还不清楚,这里有一个总结:

默认情况下,结构中列为字段的结构按值处理,也就是说,完整结构及其字段插入行中。要获得此行为,只需声明结构名称。 如果希望通过引用实现相反的行为,那么必须显式地声明,JNA将把指针映射到其他地方的结构。这就是您的情况,正确的结构映射是usb_relay_device_info.ByReference。您还需要更改结构声明以实现ByReference—上面链接的JNA概述中有一个这样的示例。 当在函数参数中使用时,如usb_relay_device_open,则情况正好相反:By引用是默认值,如果相关,则只需明确指定By值。在本例中,它不是-本机声明包含指针:usb\u relay\u device\u info*,因此您需要ByReference行为。您可以将usb_中继_设备_信息设备_信息放在那里,ByReference将是隐式的。或者,如果你不喜欢它,你可以做usb中继设备信息。通过参考设备信息,它只是多余的。 总之,您的结构映射应该是:

class usb_relay_device_info extends Structure {
    public static class ByReference extends usb_relay_device_info implements Structure.ByReference { }

    public String serial_number;
    public String device_path;
    public int type;
    public usb_relay_device_info.ByReference next;
};

您需要添加FieldOrder,最好使用注释。

为什么结构中有四个元素,而映射中只有三个?你漏掉了下一个。此外,char*serial_编号和其他参数表示指向本机映射内存区域的指针,而不是固定宽度的字节数组。这1024个是从哪里来的?是的,它仍然是缺少的,因为下一个变量是C++中的链接表,如何在java中声明它?我从其他站点读取了引用,C++中的无符号字符是java中的字节数组。好的,那么序列号最好改成字符串?1024只是随机猜测哈哈。随机猜测在编程中很少有用。查找API如何描述该字段,char*很可能是以null结尾的字符串,因此在Java中是字符串。对于下一个字段,指针将始终工作,但需要手动处理指针以迭代链表。usb中继设备信息。参考是更好的选择。