[英]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.