结构中的JNA和布尔数组

时间:2014-01-13 16:11:54

标签: java c arrays struct jna

我想在java和用C编写的dll之间的结构中传输一个布尔数组。 C中的结构如下所示:

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/上找到了一个字符串数组和一个双数组的例子,但我不知道如何翻译他们,所以他们会为一系列布尔人工作。

有人可以给出一个关于如何在结构中访问布尔数组的小例子吗?

非常感谢, 弗兰克

2 个答案:

答案 0 :(得分: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);

谢谢, 弗兰克

答案 1 :(得分: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_)返回什么?