2016-08-04 6 views
0

мне нужно вызвать функцию с подписью, как это:Как извлечь массив `struct *` из указателя на этот массив (в JNA)?

size_t findDevices(devStruct_t **devs[]); 

Некоторые примеры кода C использует функцию следующим образом:

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

Как бы я повторить приведенный выше код в Java с помощью ЮНА?

Я думаю, что функция подписи ЮНА должна выглядеть следующим образом:

NativeLong findDevices(PointerByReference devs); 

Я могу запустить это без сбоев:

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

Но, я не знаю, как получить доступ к структурам.

+0

Тогда вопрос должен быть «как разыменовать PointerByReference» или что-то подобное, я думаю. – Fildor

+0

Возможно, это может помочь: http://www.eshayne.com/jnaex/index.html?example=7 – Fildor

ответ

0

У вас есть адрес начала массива в ваш «возвращается» указатель (stdevs.getValue()). Используйте это, чтобы извлечь массив указателей, а затем инициализируйте свои структуры.

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

определение функции, как вы можете видеть in source code является

size_t stlink_probe_usb(stlink_t **stdevs[]); 

Этот тип определен в 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; 
}; 

 Смежные вопросы

  • Нет связанных вопросов^_^