2016-02-10 51 views
0

我有在C结构,我想在Java中表示与JNA:如何正确初始化JNA中`Structure`的数组字段?

typedef struct SmallStrcut { 
    unit32_t a[128]; 
} 

typedef struct BigStruct { 
    SmallStruct b; 
    SmallStruct c; 
} 

而下面的功能:

void getBigStruct(BigStruct bigStruct); 

我在Java中,以下的Structs:
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

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

由于JNA无法知道您希望他们有多大,所以您需要初始化Structure中的任何阵列字段。

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

注意,这些阵列的内容,直到你调用不会与本机内存同步的Structure.read()Structure.write()(这些电话由JNA当你调用它采用了Structure参数一个本地方法自动执行)。