2016-08-04 49 views
0

我需要调用一个函数,像这样的签名:如何从指向该数组的指针(在JNA中)提取`struct *`数组?

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); 

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

+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; 
};