2014-01-13 108 views
0

布爾的陣列我想與在struct java和寫入C. 一個DLL之間傳送布爾值的陣列C中的結構是這樣的:JNA和在結構

struct Parameters_VE3_RSG_v19b_Protect_ { 
    real_T Constant_Value;    

    boolean_T Memory_X0;    
    boolean_T Logic_table[16];   

}; 

在java中我定義下面的類訪問它:

public class VehicleModel { 
     public interface CLibrary extends Library { 
       public static class Parameters_VE3_RSG_v19b_Protect_ extends Structure { 
         public static class ByReference extends Parameters_VE3_RSG_v19b_Protect_ implements Structure.ByReference {} 

          public double Constant_Value ; 
          public boolean Memory_X0 ;   
          public Pointer Logic_table ;   
         } 
      } 
} 

主其中我想給一個值到布爾數組的這一部分:

public class SpecificVehicle { 
     public static void main(String[] args) { 

       Vehicle vh = new Vehicle(); 
       vh. parameters .Constant_Value = -1.000000; 
       vh. parameters .Memory_X0 = false; 

       CLibrary.Parameters_VE3_RSG_v19b_Protect_.ByReference ltref = new CLibrary.Parameters_VE3_RSG_v19b_Protect_.ByReference(); 
       ltref.Logic_table = new Memory(16*Native.getNativeSize(?????????) )); //??? 
     } 
} 

問題是我不知道如何填充(和讀取)布爾數組,我在http://www.eshayne.com/jnaex/上找到了一個字符串數組和雙精度數組的例子,但是我不知道如何翻譯它們,所以它們會爲一系列布爾值工作。

有人可以給一個小例子如何訪問一個布爾數組布爾值?

非常感謝, 弗蘭克

+0

'boolean_T'有多大?選擇一個相同大小的Java類型,並在你的'Structure'中創建一個這種類型的基本數組。 *不要爲邏輯表分配單獨的內存,除非你的本地結構完全相同。 – technomage

+0

boolean_T是C中的一個字節,所以我在java中使用了bety,並且工作正常。你是什​​麼意思:不要爲邏輯表分配單獨的內存,除非你的本地結構是一樣的。 – fengels

+0

您的本機和Java結構不匹配。您的本地定義將字節數組放在與'struct'相同的內存塊中,而您的Java'Structure'指向一個單獨的內存塊。 – technomage

回答

0

我解決它通過以下方式:

static Pointer setbooleanArray(boolean [] input) { 
    Pointer output = new Memory(input.length*Native.getNativeSize(Byte.TYPE)); 
    for (int i=0;i<input.length;i++){ 
     output.setByte(i, (byte) (input[i] ? 1:0)); 
    }; 
    return output; 
}; 

...

在這裏,我填的是邏輯表:

boolean[] Logic_tableSet = new boolean[] { false, true, false, false, true, true, false, false, true, false, true, true, false, false, false, false }; 
vh.parameters.Logic_table = setbooleanArray( Logic_tableSet); 

謝謝, Frank

0

爲原生結構適當的映射

struct Parameters_VE3_RSG_v19b_Protect_ { 
    real_T Constant_Value;    

    boolean_T Memory_X0;    
    boolean_T Logic_table[16];   
}; 

public class Parameters_VE3_RSG_v19b_Protect extends Structure { 
    public double Constant_Value; 
    public byte Memory_X0; 
    public byte[] Logic_table = new byte[16]; 
} 

你暗示,而不是你的原生結構被定義如下:

struct Parameters_VE3_RSG_v19b_Protect_ { 
    real_T Constant_Value;    

    boolean_T Memory_X0;    
    boolean_T* Logic_table; 
}; 

這代表了與你在問題中提出的內存佈局明顯不同,即:

   with array   with pointer 
       +----------------+ +----------------+ 
Constant_Value | 0x0000-0x0007 | | 0x0000-0x0007 | 
       |    | |    | 
       |    | |    | 
       |    | |    | 
       |    | |    | 
       |    | |    | 
       |    | |    | 
       |    | |    | 
       +----------------+ +----------------+ 
Memory_X0  | 0x0008   | | 0x0008   | 
       +----------------+ +----------------+ 
Logic_table | 0x0009-0x0018 | | 3 or 7 bytes | 
(array)  |    | | padding  | 
       |    | |    | 
       |    | +----------------+ 
       |    | | 0x000C-0x000F | logic_table (pointer) 
       |    | | or    | 
       |    | | 0x0010-0x0018 | 
       |    | |    | 
       |    | +----------------+ 
       |    | 
       |    | 
       |    | 
       |    | 
       |    | 
       |    | 
       |    | 
       |    | 
       +----------------+ 

右側的長度差異在於指針的大小是32位還是64位。根據您的編譯器和設置,左側可能在字節數組之前或之後可能沒有填充。

sizeof(Parameters_VE3_RSG_v19b_Protect_)返回什麼?