これらのどれも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();
}