如何在JNA中的`Structure`中正确初始化数组字段?

时间:2016-02-10 11:34:29

标签: java c jna

我在C中有一个Struct我希望用JNA代表java:

typedef struct SmallStrcut {
     unit32_t a[128];
}

typedef struct BigStruct {
     SmallStruct b;
     SmallStruct c;
}

以下功能:

void getBigStruct(BigStruct bigStruct);

我在Java中有以下结构:
SmallStruct:

public class SmallStruct extends Structure {
      public static ByValue extends SmallStruct implements Structure.ByValue {
           public int a[];
           public ByValue() {}
      }
}

BigStruct:

public class BigStruct extends Structure {
        public static ByValue extends BigStruct implements Structure.ByValue {
               public SmallStruct b;
               public SmallStruct c;
               public ByValue() {}
          }

这是我的主要内容:

BigStruct.ByValue big = new BigStruct.ByValue();
SmallStruct.ByValue x1 = new SmallStruct.ByValue();
x1.a = new int[128];
x1.a[0] = 123;
SmallStruct.ByValue x2 = new SmallStruct.ByValue();
x2.a = new int[128];
x2.a[0] = 456;

big.b = x1;
big.c = x2;

当我调试这段代码时,我只看了BigStruct对象 b成员已初始化。 c数组全为零。
它就像第一个SmallStruct一样,是第二个SmallStruct内存区域。

如何传输两个SmallStruct以正确构建BigStruct?

1 个答案:

答案 0 :(得分:1)

定义Structure字段时,JNA默认按值语义,因此您只能使用Structure

由您来初始化Structure中的任何数组字段,因为JNA无法知道您希望它们有多大。

public class SmallStruct extends Structure {
   public int a[] = new int[128];
}

请注意,在调用Structure.read()Structure.write()之前,这些数组的内容不会与本机内存同步(当您调用使用{{Structure的本机方法时,这些调用由JNA自动执行。 1}}参数)。