2016-09-21 2 views
0

Ich brauche Hilfe bei der Definition von JAVA JNA Äquivalent von C-Strukturen enthalten, wobei jede Struktur eine andere Struktur variableJNA: Java-Äquivalent von C Strukturen, Struktur eine andere Struktur Variable

-Code

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; 

enthält Ich bin nicht in der Lage JAVA JNA Äquivalent dieser Struktur richtig zu definieren, was ich implementiert habe, gibt mir einen ungültigen Speicherzugriffsfehler.

Antwort

0

Keine von diesen hat ein struct Feld. Wenn man bedenkt, dass [] fester bindet (höhere Priorität) als *, haben Sie jeweils ein Array von Pointer auf Short, einen Zeiger auf struct (oder einen Zeiger auf ein zusammenhängendes Array von struct, wahrscheinlicher) und ein Array von Zeiger auf struct.

Die einfachste Zuordnung für einen Zeigertyp ist Pointer. Sobald dies funktioniert, können Sie es zu einem spezifischeren Typ verfeinern.

struct* sollte Structure.ByReference als Feldtyp verwenden, und ein Array davon wäre Structure.ByReference[].

Wie in der JNA FAQ beschrieben (getFieldOrder() und Konstrukteuren der Kürze halber weggelassen):

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(); 
} 
Verwandte Themen