2014-01-13 69 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_)返回什么?