2016-09-21 3 views
0

мне нужна помощь в определении JA ЮНА эквивалент структуры C, где каждая структура содержит другую структуру переменнойЮНА: Java эквивалент структуры C, структура, содержащая другую структуру переменной

код

typedef struct algorithm_list { 

    unsigned char num_of_alg; 
    unsigned short *algorithm_guid[]; 

} algorithm_list_t; 

typedef struct key_data { 

    unsigned char *key; 

    unsigned short key_length; 

    algorithm_list_t *algorithms; 

} key_data_t; 


    typedef struct key_array { 

    unsigned char read_byte; 

    unsigned char number_of_keys; 

    key_data_t *keys[]; 

} key_array_t; 

Я не могу для правильного определения эквивалента JAVA JNA этой структуры, поскольку то, что я реализовал, дает мне ошибку Недопустимый доступ к памяти.

ответ

0

Ничего из них не имеет поля 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(); 
}