有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个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


共 (1) 个答案

  1. # 1 楼答案

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

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

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

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