java—jna结构中的结构数组

63lcw9qa  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(578)

我的母语是

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 它不起作用。它甚至没有显示任何错误,只是什么都没有。

5anewei6

5anewei61#

你的 getFieldOrder() 数组不包含最后一个元素( channel )你的结构。我在您的评论中看到,您试图这样做,但收到了一个错误,因为您没有声明它 public . 结构的所有元素都必须列在 FieldOrder 并宣布 public 所以可以通过反射找到它们。
另外,对于jna 5.x(您应该使用它)来说 @FieldOrder 首选注解。
您尚未确定的Map ChannelConfig ,但您的问题标题和与您的结构匹配的此api链接表明它是嵌套结构数组。结构数组必须使用连续内存进行分配,或者直接分配本机内存( new Memory() )这需要知道结构的大小,或者使用 Structure.toArray() . 在一个循环中进行分配,最终将在本机内存中可能/可能不连续的位置为每个新结构分配内存。假设您声明它似乎对某些值有效,您可能会幸运地获得连续分配,但您的行为肯定是未定义的。
因此,您的结构Map应该是:

@FieldOrder ({"dllVersion", "channelCount", "reserved", "channel"})
public class DriverConfig extends Structure {
    public int dllVersion;
    public int channelCount;
    public int[] reserved= new int[10];
    public ChannelConfig[] channel = (ChannelConfig[]) new ChannelConfig().toArray(64);
}

相关问题