簡體   English   中英

Java JNA鏈表聲明

[英]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 值,例如shortbyte ,但這種情況很少見。)

至於指向下一個設備的指針,在struct*下的概述頁面上也有引用。 鏈接(或顯式)鏈接到Structure.ByReference 這可能不是很明顯,但是JNA 常見問題解答(也鏈接在 JNA 項目主頁面上)可以放大。 如果還不清楚,這里有一個總結:

  • 默認情況下,作為結構內字段列出的結構被視為“按值”,即完整結構及其字段插入行中。 要獲得這種行為,您可以簡單地聲明結構名稱。
  • 如果您想要相反的行為(通過引用),那么您必須明確 state ,並且 JNA 將 map 指向其他地方的結構的指針。 您就是這種情況,正確的結構映射是usb_relay_device_info.ByReference (您還需要更改結構聲明以實現 ByReference - 上面鏈接的 JNA 概述有一個示例。)
  • 在 function arguments 中使用時,例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM