如何从指向该数组(在 JNA 中)的指针中提取一个 `struct*` 数组?
How do I extract an array of `struct*` from a pointer to that array (in 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);
但是,我不知道如何访问这些结构。
函数定义,可以看到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;
};
您的 "returned" 指针 (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();
}
}
我需要用这样的签名调用一个函数:
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);
但是,我不知道如何访问这些结构。
函数定义,可以看到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;
};
您的 "returned" 指针 (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();
}
}