[英]Java JNA Linkedlist declaration
我需要從 Java 應用程序訪問本機 C++ 代碼。dll。 native int function 效果很好,但是對於 Linkedlist Struct 我在互聯網上找不到任何參考如何聲明 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 結構)中創建了結構。 因此,當我調用 function 時,值沒有顯示出來,因為它應該是一個列表(C++ 中的鏈表)
您說“我在互聯網上找不到任何關於如何聲明 java 接口的參考資料”,但是有很多參考資料,包括 JNA 的概述,鏈接到主項目頁面。
在那里你會發現char *
是一個 C String 並且應該映射到 Java 的String
。
usb_relay_device_type
映射必須在您正在映射的 API 中引用。 在這種情況下,它是一個enum
類型,即 integer,因此這里可能適合使用int
。 (在某些情況下,它可以是較小的 integer 值,例如short
或byte
,但這種情況很少見。)
至於指向下一個設備的指針,在struct*
下的概述頁面上也有引用。 鏈接(或顯式)鏈接到Structure.ByReference
。 這可能不是很明顯,但是JNA 常見問題解答(也鏈接在 JNA 項目主頁面上)可以放大。 如果還不清楚,這里有一個總結:
usb_relay_device_info.ByReference
。 (您還需要更改結構聲明以實現 ByReference - 上面鏈接的 JNA 概述有一個示例。)usb_relay_device_open()
,則相反:“By Reference”是默認值,如果相關,您只需明確指定“By Value”。 在這種情況下,它不是 - 本機聲明包含指針:( usb_relay_device_info*
)所以您需要 ByReference 行為。 您可以將usb_relay_device_info device_info
放在那里,ByReference 將是隱式的。 或者,如果您願意(不需要),您可以執行usb_relay_device_info.ByReference device_info
,這只是多余的。因此,總而言之,您的結構映射應該是:
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,最好使用注釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.