我的母语是
typedef struct driver_config {
unsigned int dllVersion;
unsigned int channelCount;
unsigned int reserved[10];
ChannelConfig channel[64];
} DriverConfig;
在java中,我的类是这样的
public class DriverConfig extends Structure {
public int dllVersion;
public int channelCount;
public int[] reserved= new int[10];
ChannelConfig[] channel = new ChannelConfig[64];
public DriverConfig() {
super();
init();
}
private void init() {
for (int i = 0; i < channel.length; i++) {
channel[i]= new ChannelConfig();
}
}
@Override
protected List<String> getFieldOrder() {
return Arrays.asList(new String[] { "dllVersion", "channelCount", "reserved" });
}
//toString()...
}
方法声明是
int getDriverConfig(DriverConfig driverConfig);
我试着像这样访问这个方法
DriverConfig driverConfig = new DriverConfig();
status = dll.INSTANCE.getDriverConfig(driverConfig);
System.out.println("DriverConfig Status: " + status);
System.out.println(driverConfig.toString());
如果 channel.length
替换为小于50数组初始化正确,但 channel.length
它不起作用。它甚至没有显示任何错误,只是什么都没有。
1条答案
按热度按时间5anewei61#
你的
getFieldOrder()
数组不包含最后一个元素(channel
)你的结构。我在您的评论中看到,您试图这样做,但收到了一个错误,因为您没有声明它public
. 结构的所有元素都必须列在FieldOrder
并宣布public
所以可以通过反射找到它们。另外,对于jna 5.x(您应该使用它)来说
@FieldOrder
首选注解。您尚未确定的Map
ChannelConfig
,但您的问题标题和与您的结构匹配的此api链接表明它是嵌套结构数组。结构数组必须使用连续内存进行分配,或者直接分配本机内存(new Memory()
)这需要知道结构的大小,或者使用Structure.toArray()
. 在一个循环中进行分配,最终将在本机内存中可能/可能不连续的位置为每个新结构分配内存。假设您声明它似乎对某些值有效,您可能会幸运地获得连续分配,但您的行为肯定是未定义的。因此,您的结构Map应该是: