2016-03-31 8 views
1

zugeordnet werden kann Ich habe eine Struktur, die ein Array von anderen Struktur-Zeigern enthält, zusammen mit einem Feld für die Array-Länge. Diese Struktur wird über einen "out" -Parameter durch eine native Methode zurückgegeben.Wie Arrays variabler Länge in einer strukturierten Rückkehr von einer nativen Methode mit JNA

Die ursprüngliche "C" -Struktur:

typedef struct MMAL_COMPONENT_T 
{ 
    uint32_t input_num; /**< Number of input ports */ 
    MMAL_PORT_T **input;  /**< Array of input ports */ 
} MMAL_COMPONENT_T; 

Die entsprechende Java-Klasse, die durch JNAerator:

public class MMAL_COMPONENT_T extends Structure { 
    public int input_num; 
    public MMAL_PORT_T.ByReference[] input; 
} 

Die "C" Methodensignatur:

MMAL_STATUS_T mmal_component_create(const char *name, MMAL_COMPONENT_T **component); 

Java Nutzung:

PointerByReference ref = new PointerByReference(); 
status = mmal.mmal_component_create("<component-name>", ref); 
MMAL_COMPONENT_T component = new MMAL_COMPONENT_T(ref.getValue()); 

Das generiert eine JNA-Fehlermeldung, die besagt, dass "Array Felder initialisiert werden müssen".

Derzeit bin ich mit Pointer anstelle der Anordnung und den Aufbau von Hand das Array von ihm:

public class MMAL_COMPONENT_T extends Structure { 
    public int input_num; 
    public Pointer input; 
} 

Mit Nutzung:

Pointer[] array = component.input.getPointerArray(0, component.input_num); 
MMAL_PORT_T port = new MMAL_PORT_T(array[0]); 
port.read(); 

Aber dieser Ansatz scheint unbefriedigend wegen seiner Ausführlichkeit und weil Zeiger wird anstelle des eigentlichen Strukturtyps verwendet.

Also, was ist der kanonische Weg, dies mit JNA zu behandeln?

Antwort

1

Angenommen, input zeigt auf ein Array von Zeigern, kapseln Sie die Pointer Manipulation in einer Elementfunktion, z.

public MMAL_PORT_T[] getPorts() { 
    Pointer[] array = input.getPointerArray(0, input_num); 
    MMAL_PORT_T[] ports = new MMAL_PORT_T[array.length]; 
    for (int i=0;i < ports.length;i++) { 
     ports[i] = new MMAL_PORT_T(array[i]); 
    } 
    return ports; 
}