Как правильно инициализировать поля массива в "Структуре" в JNA?

У меня есть структура в C, я хочу представить в Java с JNA:

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 ответ

Решение

При определении Structure поля, по умолчанию JNA семантика значения, так что вы можете просто использовать Structure,

Вы можете инициализировать любые поля массива в вашем StructureТак как у JNA нет возможности узнать, насколько велик ты хочешь, чтобы они были.

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

Обратите внимание, что содержимое этих массивов не будет синхронизироваться с собственной памятью, пока вы не вызовете Structure.read() или же Structure.write() (эти вызовы выполняются автоматически JNA при вызове нативного метода, который использует Structure аргумент).

Другие вопросы по тегам