2016-08-04 19 views
0

Ich brauche eine Funktion mit einer Signatur wie folgt zu nennen:Wie extrahiere ich ein Array von `struct *` von einem Zeiger auf dieses Array (in JNA)?

size_t findDevices(devStruct_t **devs[]); 

Einige C Codebeispiel wird die Funktion wie folgt verwendet:

devStruct_t **arrOfPointers; 
size_t size; 
size = findDevices(&arrOfPointers); 
for(size_t i = 0; i < size; i++) { 
    printf("devId:%d\n", arrOfPointers[i]->id); 
} 

Wie würde ich den obigen Code in Java unter Verwendung von JNA replizieren?

Ich denke, die JNA Funktion Signatur sollte wie folgt aussehen:

NativeLong findDevices(PointerByReference devs); 

Ich kann laufen ohne Absturz:

NativeLong size; 
PointerByReference stdevs = new PointerByReference(); 
size = libstlink.stlink_probe_usb(stdevs); 

Aber ich weiß nicht, wie die Strukturen zugreifen.

+0

Dann Frage sollte "wie ZeigerByReference dereference" oder etwas ähnliches, ich denke. – Fildor

+0

Vielleicht kann dies helfen: http://www.eshayne.com/jnaex/index.html?example=7 – Fildor

Antwort

0

Sie haben in Ihrem „zurückgegeben“ Zeiger die Adresse des Beginns des Arrays definiert sehen (stdevs.getValue()). Verwenden Sie das, um das Array von Zeigern zu extrahieren, und initialisieren Sie dann Ihre Strukturen.

Pointer[] ptrs = stdevs.getValue().getPointerArray(0, size.intValue()); 
DevStruct[] array = new DevStruct[size.intValue()]; 
for (int i=0;i < array.length;i++) { 
    array[i] = new DevStruct(ptrs[i]); 
} 

public class DevStruct extends Structure { 
    public DevStruct(Pointer p) { 
     super(p); 
     read(); 
    } 
} 
0

Funktionsdefinition, wie Sie in source code ist

size_t stlink_probe_usb(stlink_t **stdevs[]); 

Diese Art in this source code

struct _stlink { 
    struct _stlink_backend *backend; 
    void *backend_data; 

    // Room for the command header 
    unsigned char c_buf[C_BUF_LEN]; 
    // Data transferred from or to device 
    unsigned char q_buf[Q_BUF_LEN]; 
    int q_len; 

    // transport layer verboseness: 0 for no debug info, 10 for lots 
    int verbose; 
    uint32_t core_id; 
    uint32_t chip_id; 
    int core_stat; 

    char serial[16]; 
    int serial_size; 

    enum stlink_flash_type flash_type; 
    stm32_addr_t flash_base; 
    size_t flash_size; 
    size_t flash_pgsz; 

    /* sram settings */ 
    stm32_addr_t sram_base; 
    size_t sram_size; 

    // bootloader 
    stm32_addr_t sys_base; 
    size_t sys_size; 

    struct stlink_version_ version; 
};