Java 如何正确初始化JNA中“Structure”中的数组字段?

Java 如何正确初始化JNA中“Structure”中的数组字段?,java,c,jna,Java,C,Jna,我有一个C结构,我想用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 ex

我有一个C结构,我想用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?

在定义
结构
字段时,JNA默认为按值语义,因此您可以只使用
结构

初始化
结构中的任何数组字段取决于您,因为JNA无法知道您希望它们有多大

public class SmallStruct extends Structure {
   public int a[] = new int[128];
}
请注意,在调用
Structure.read()
Structure.write()
(当您调用使用
Structure
参数的本机方法时,JNA会自动执行这些调用)之前,这些数组的内容不会与本机内存同步