版權聲明:本文為博主原創文章,未經博主允許不得轉載。
本文主要講述使用JNA模擬結構體並將結構體數組作為參數傳遞給對應的方法。
C語言結構體定義如下:
- typedef struct Rect
- {
- int top;
- int bottom;
- int left;
- int right;
- } RECT;
JNA模擬該結構體:
需要引入:
import com.sun.jna.*;
import com.sun.jna.ptr.*;
- //Rect結構體
- public static class Rect extends Structure {
- //Structure子類中的公共字段的順序,必須與C語言中的結構的順序一致,否則會報錯!
- public int top;
- public int bottom;
- public int left;
- public int right;
- public static class ByReference extends Rect implements Structure.ByReference {}
- public static class ByValue extends Rect implements Structure.ByValue {}
- @Override
- protected List getFieldOrder() {
- return Arrays.asList(new String[]{"top", "bottom", "left", "right"});
- }
- }
C語言函數:
- //rects:結構體數組,len:數組長度
- void function(RECT* rects, int len);
JNA模擬如下:
- void function(Rect[] rects,int len);
創建數組及調用方法如下:
- int len = 5;
- //定義數組
- Rect[] array = (Rect[])new Rect().toArray(len);
- function(array, len);
注意,這里創建數組使用了JNA的toArray()方法,而不是Java常規創建數組的方法,是因為內存空間在java中是不連續的,jna定義數組是需要使用toArray方法,這樣實例化出來的數組內存空間是連續的。
其實這里主要是創建結構體數組的地方要注意,如果使用下面的方式創建,那就會產生一個空的數組,申請不到空間:
- int len = 5;
- Rect[] array = new Rect[len];
原因:內存空間在java中是不連續的,jna定義數組是需要使用toArray方法,這樣實例化出來的數組內存空間是連續的,否則數據第一條是正確的,其他是錯位的。
http://blog.csdn.net/zht666/article/details/38658985 //原文地址