簡體   English   中英

JNA和結構數組作為參數

[英]JNA and array of Structure as parameter

我正在使用JNA訪問SocketCAN。 但是我對setsockopt函數有問題。

函數的聲明:

int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

SocketCAN使用以下結構:

struct can_filter {
            canid_t can_id;
            canid_t can_mask;
    };

可以使用一個can_filter結構作為參數設置一個過濾器,或者使用can_filter結構的數組設置多個過濾器。

SocketCAN文檔的示例:

    struct can_filter rfilter[2];

    rfilter[0].can_id   = 0x123;
    rfilter[0].can_mask = CAN_SFF_MASK;
    rfilter[1].can_id   = 0x200;
    rfilter[1].can_mask = 0x700;

    setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));

如果我將一種結構的功能定義為JNA中的參數,則它可以正常運行:

private static native int setsockopt(int sockfd, int level, int option_name, CanFilterStruct filter, int len);

如果我為結構數組定義函數,則在初始化時會收到錯誤消息:

private static native int setsockopt(int sockfd, int level, int option_name, CanFilterStruct[] filters, int len);

發生的錯誤:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at de.comp.test.App.main(App.java:42)
Caused by: java.lang.IllegalArgumentException: class [Lde.comp.jsocketcan.CanFilterStruct; is not a supported argument type (in method setsockopt in class de.comp.jsocketcan.SocketCan)
    at com.sun.jna.Native.register(Native.java:1463)
    at com.sun.jna.Native.register(Native.java:1396)
    at com.sun.jna.Native.register(Native.java:1156)
    at de.comp.jsocketcan.SocketCan.<clinit>(SocketCan.java:70)

這里是JNA中結構的定義:

public class CanFilterStruct extends Structure implements Structure.ByReference
{
    public int can_id;
    public int can_mask;

    public CanFilterStruct()
    {
        super();
    }

    @Override
    protected List getFieldOrder() 
    {
        return Arrays.asList("can_id", "can_mask");
    }
}

有人能幫我嗎?

最好的祝福

使用Structure.toArray()獲得一個連續分配的結構塊,然后傳入第一個元素。

編輯

您的參數類型仍然是CanFilterStruct

明確:

CanFilterStruct s = new CanFilterStruct();
CanFilterStruct[] array = (CanFilterStruct[])s.toArray(length);

lib.setsockopt(sock, SOL_CAN_RAW, CAN_RAW_FILTER, array[0], array.length * array[0].size());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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