Ничего из них не имеет поля struct
. Имея в виду, что []
связывается более тесно (более высокий приоритет), чем *
, у вас есть, соответственно, массив указателя на короткий, указатель на struct
(или более указательный указатель на смежный массив struct
) и массив указатель на struct
.
Простейшее отображение для типа указателя - Pointer
. Как только вы получите эту работу, вы можете уточнить ее до более конкретного типа.
struct*
должен использовать Structure.ByReference
как тип поля, и массив из них будет Structure.ByReference[]
.
Как описано в JNA FAQ (опуская getFieldOrder()
и конструкторы для краткости):
public class algorithm_list extends Structure {
public static class ByReference extends algorithm_list implements Structure.ByReference { }
public byte num_of_alg;
public Pointer[] algorithm_guid = new Pointer[1];
public algorithm_list(Pointer p) {
super(p);
int count = (int)readField("num_of_alg") & 0xFF;
algorithm_guid = new Pointer[count];
super.read();
}
public class key_data extends Structure {
public static class ByReference extends key_data implements Structure.ByReference { }
public Pointer key;
public short key_length;
public algorithm_list.ByReference algorithms;
public key_data(Pointer p) {
super(p);
super.read();
// NOTE: if algorithms points to a contiguous block of struct,
// you can use "algorithms.toArray(count)" to get that array
}
}
public class key_array {
public byte read_byte;
public byte number_of_keys;
public key_data.ByReference[] keys = new key_data.ByReference[1];
public key_array(Pointer p) {
super(p);
int count = (int)readField("number_of_keys") & 0xFF;
keys = new key_data.ByReference[count];
super.read();
}