Java 数组中的JNA结构内存分配不正确

Java 数组中的JNA结构内存分配不正确,java,jna,allocation,Java,Jna,Allocation,我的问题是内存分配不正确。我这样认为是因为位在属性之间发生了移位 这是本机代码: typedef结构s\u xl\u通道配置{ 字符名[32]; 无符号字符类型; 无符号字符索引; 无符号信道; 无符号短收发器类型; 无符号短收发器; 无符号短错误; 无符号字符索引; 无符号int64信道掩码; 无符号整数信道能力; 无符号int-channelbus能力; 无符号字符isOnBus; unsigned int connectedBusType; XLbusParams-busParams; 无

我的问题是内存分配不正确。我这样认为是因为位在属性之间发生了移位

这是本机代码:

typedef结构s\u xl\u通道配置{
字符名[32];
无符号字符类型;
无符号字符索引;
无符号信道;
无符号短收发器类型;
无符号短收发器;
无符号短错误;
无符号字符索引;
无符号int64信道掩码;
无符号整数信道能力;
无符号int-channelbus能力;
无符号字符isOnBus;
unsigned int connectedBusType;
XLbusParams-busParams;
无符号整数不使用;
无符号整数驱动版本;
无符号整数外翻;
无符号整数原始数据[10];
无符号整数序列号;
无符号整数;
字符收发器名称[32];
无符号int-specialCabFlags;
无符号整型超时;
无符号字符显性隐性延迟;
无符号字符隐性显性延迟;
无符号字符连接信息;
无符号字符currentlyAvailableTimestamps;
无符号短电源电压;
无符号短路最大电源电压;
无符号整数最大基数;
无符号字符fpgacore功能;
未签名字符specialDeviceStatus;
无符号短通道功能;
无符号短波偏移;
无符号短分隔符ROFFSET;
无符号整数保留[3];
}XL_信道_配置;
我的java代码如下:

@FieldOrder({“name”、“hwType”、“hwIndex”、“hwChannel”、“transceiverType”,
“收发器状态”、“配置错误”、“信道索引”、“信道掩码”,
“channelCapabilities”、“channelBusCapabilities”、“isOnBus”、“connectedBusType”,
“总线参数”、“不使用”、“驱动服务器版本”、“接口版本”、“原始数据”,
“序列号”、“文章号”、“收发机名”、“特殊标签”,
“显性超时”、“显性隐性延迟”、“隐性显性延迟”,
“连接信息”、“当前可用时间戳”、“最小电源电压”,
“最大电源电压”、“最大预算”、“FPGACORE能力”,
“specialDeviceStatus”、“channelBusActiveCapabilities”、“breakOffset”,
“delimiterOffset”、“reserved”})
公共类XLchannelConfig扩展了结构{
公共字节[]名称=新字节[32];
公共字节类型;
公共字节索引;
公共信道;
公共短收发器;
公共短收发器;
公共短消息错误;
公共字节索引;
公共广播频道;
公共能力;
公共能力;
公共字节isOnBus;
公共int-connectedBusType;
public XLbusParams busParams=新的XLbusParams();
公共国际不使用;
公共交通;
公共外翻;
公共整数[]原始数据=新整数[(10)];
公共整数序列号;
公众号;
公共字节[]收发器名称=新字节[32];
公共int专用标签;
公共int主导超时;
公共字节显性隐性语;
公共字节隐性显性延迟;
公共字节连接信息;
公共字节currentlyAvailableTimestamps;
公共短电源电压;
公共短路最大电源电压;
公共int最大预算;
公共字节功能;
公营部门;
公共短波通信能力;
公众短期对冲;
公共短期融资;
公共整数[]保留=新整数[3];
公共XLchannelConfig(){
超级();
}
XLchannelConfig类位于我用
.toArray()
初始化的数组中。 当我输出属性时,我看到​​是移位的。看起来位从一个属性移位到了下一个属性。我怀疑这是由于错误的数据类型造成的,但我无法确定它是哪一个

toString打印出以下内容:

XLchannelConfig [name=Virtual Channel 1               , hwType=1, hwIndex=0, hwChannel=0, transceiverType=0, transceiverState=0, channelIndex=1, channelMask=0, channelCapabilities=458752, channelBusCapabilities=106496, isOnBus=1, connectedBusType=16777216, driverVersion=67830784, interfaceVersion=0, raw_data=[0, 0, 0, 65536, 0, 0, 0, 0, 0, 0], serialNumber=0, articleNumber=536870912, transceiverName=Virtual CAN                    , specialCabFlags=0, dominantTimeout=0, reserved=[0, 0, 1442840576], busParams=XLbusParams [busType=536870912]]

XLchannelConfig [name=irtual Channel 2               , hwType=0, hwIndex=1, hwChannel=22, transceiverType=0, transceiverState=0, channelIndex=0, channelMask=0, channelCapabilities=1792, channelBusCapabilities=16777632, isOnBus=0, connectedBusType=65536, driverVersion=264964, interfaceVersion=0, raw_data=[0, 0, 0, 256, 0, 0, 0, 0, 0, 0], serialNumber=0, articleNumber=1444937728, transceiverName=irtual CAN                    , specialCabFlags=0, dominantTimeout=0, reserved=[0, 0, 0], busParams=XLbusParams [busType=-1591738368]]


症状显示映射中有一个额外的单字节。
reserved
字段的最后一个元素包括字节
0x56
,该字节对应于第二个元素中缺少的字母“V”。因此,我们需要查找该额外字节

头文件总线类型最多只能为
0x100
。您的输出的总线类型为
0x20000000
,这表明错误发生在
XLbusParams
联合之前。它肯定发生在
transcieername
之前,后者显示一个额外的非空字节作为最后一个字符。除了
channelMas之外k
(见下文,将是4字节偏移量)映射看起来正确

一个可能解释一个字节的错配可以是结构域的对齐。这个名称需要32个字节,然后有三个1字节的字段,后面是三个2字节的字段。这将有一个<代码>简短<代码>字段,跨越4字节或8字节的边界。ts,例如:

public-XLchannelConfig(){
苏佩