如何在 JNA 的“结构”中正确初始化数组字段?

How do I properly initialize array fields within a `Structure` in 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 extends Structure {
      public static ByValue extends SmallStruct implements Structure.ByValue {
           public int a[];
           public ByValue() {}
      }
}

大结构:

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?

定义Structure字段时,JNA默认是按值语义,所以你可以直接使用Structure

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

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

请注意,在您调用 Structure.read()Structure.write() 之前,这些数组的内容不会与本机内存同步(当您调用使用Structure 参数)。