I need to call a function with a signature like this:
size_t findDevices(devStruct_t **devs[]);
Some example C code uses the function like this:
devStruct_t **arrOfPointers;
size_t size;
size = findDevices(&arrOfPointers);
for(size_t i = 0; i < size; i++) {
printf("devId:%d\n", arrOfPointers[i]->id);
}
How would I replicate the above code in Java using JNA?
I think the JNA function signature should look like this:
NativeLong findDevices(PointerByReference devs);
I can run this without crashing:
NativeLong size;
PointerByReference stdevs = new PointerByReference();
size = libstlink.stlink_probe_usb(stdevs);
But, I don't know how to access the structures.
You have the address of the start of the array in your "returned" pointer (stdevs.getValue()
). Use that to extract the array of pointers, then initialize your structures from that.
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();
}
}