Как правильно инициализировать поля массива в "Структуре" в 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
аргумент).