我想在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/上找到了一个字符串数组和一个双数组的例子,但我不知道如何翻译他们,所以他们会为一系列布尔人工作。
有人可以给出一个关于如何在结构中访问布尔数组的小例子吗?
非常感谢, 弗兰克
答案 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_)
返回什么?