2016-08-04 192 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; 
};