如何从指向该数组的指针(在JNA中)中提取`struct *`数组?

时间:2016-08-04 08:06:30

标签: java c 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);
}

我如何使用JNA在Java中复制上述代码?

我认为JNA函数签名应如下所示:

NativeLong findDevices(PointerByReference devs);

我可以在不崩溃的情况下运行它:

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

但是,我不知道如何访问这些结构。

2 个答案:

答案 0 :(得分: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;
};

答案 1 :(得分:0)

您在&#34;返回&#34;中有数组开头的地址。指针(rails s)。用它来提取指针数组,然后从中初始化你的结构。

stdevs.getValue()