JNA參數傳遞問題,Java數組


本文主要講述使用JNA模擬結構體並將結構體數組作為參數傳遞給對應的方法。

C語言結構體定義如下:

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. typedef struct Rect  
  2. {  
  3.     int top;  
  4.     int bottom;  
  5.     int left;  
  6.     int right;  
  7. } RECT;  

 

 

JNA模擬該結構體:

需要引入:

import com.sun.jna.*;
import com.sun.jna.ptr.*;

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. //Rect結構體  
  2. public static class Rect extends Structure {  
  3.     //Structure子類中的公共字段的順序,必須與C語言中的結構的順序一致,否則會報錯!  
  4.     public int top;  
  5.     public int bottom;  
  6.     public int left;  
  7.     public int right;  
  8.   
  9.     public static class ByReference extends Rect implements Structure.ByReference {}  
  10.     public static class ByValue extends Rect implements Structure.ByValue {}  
  11.   
  12.     @Override  
  13.     protected List getFieldOrder() {  
  14.         return Arrays.asList(new String[]{"top", "bottom", "left", "right"});  
  15.     }  
  16. }  
現在要給方法傳遞一個結構體數組對象,如何做呢?

 

 

C語言函數:

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. //rects:結構體數組,len:數組長度  
  2. void function(RECT* rects, int len);  

JNA模擬如下:

 

 

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. void function(Rect[] rects,int len);  

創建數組及調用方法如下:

 

 

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. int len = 5;  
  2. //定義數組  
  3. Rect[] array = (Rect[])new Rect().toArray(len);  
  4. function(array, len);  

 

 

注意,這里創建數組使用了JNA的toArray()方法,而不是Java常規創建數組的方法,是因為內存空間在java中是不連續的,jna定義數組是需要使用toArray方法,這樣實例化出來的數組內存空間是連續的。

其實這里主要是創建結構體數組的地方要注意,如果使用下面的方式創建,那就會產生一個空的數組,申請不到空間:

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. int len = 5;  
  2. Rect[] array = new Rect[len];  
這個代碼執行后,array=null,也就是創建數組失敗了!

原因:內存空間在java中是不連續的,jna定義數組是需要使用toArray方法,這樣實例化出來的數組內存空間是連續的,否則數據第一條是正確的,其他是錯位的。

詳見另一篇文章:http://tcspecial.iteye.com/blog/1665583

 
 
http://blog.csdn.net/zht666/article/details/38658985  //原文地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM