【发布时间】:2020-10-10 08:53:52
【问题描述】:
我需要从 Java 应用程序访问本机 C++ 代码 .dll。本机 int 函数效果很好,但是对于 Linkedlist Struct 我在 Internet 上找不到任何关于如何声明 java 接口的参考
这个 C++ 代码
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部分
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++ 中的链表)
【问题讨论】:
-
为什么结构中有四个元素,而你的映射中只有三个?你漏掉了
next。char *serial_number和其他 args 也意味着指向本机映射内存区域的指针,而不是固定宽度的字节数组。 1024 是从哪里来的? -
是的还是不见了,因为c++中下一个变量是linkedlist,Java中如何声明呢?我从其他网站读到参考资料,c++ 中的 unsigned char 是 Java 中的字节数组。好的,serial_number 应该更改为 String 更好吗? 1024只是随机猜测哈哈。
-
随机猜测在编程中很少有帮助。 :)。找出 API 是如何描述该字段的,
char *很可能是一个以 null 结尾的字符串,因此在 Java 中是一个String。 -
对于 Next 字段,
Pointer将始终有效,但需要手动处理指针以迭代链表。usb_relay_device_info.ByReference会是更好的选择。
标签: java c++ struct linked-list jna