napperley
08/27/2019, 9:30 AMlibusb_get_device_list
function takes a list (parameter) however the list is a container for libusb_device
, which is a opaque pointer. Is there a way to allocate a opaque pointer? Below is the function's mapping:
public fun libusb_get_device_list(ctx: kotlinx.cinterop.CValuesRef<cnames.structs.libusb_context>?, list: kotlinx.cinterop.CValuesRef<kotlinx.cinterop.CPointerVar<kotlinx.cinterop.CPointerVar<cnames.structs.libusb_device> /* = kotlinx.cinterop.CPointerVarOf<kotlinx.cinterop.CPointer<cnames.structs.libusb_device>> */> /* = kotlinx.cinterop.CPointerVarOf<kotlinx.cinterop.CPointer<kotlinx.cinterop.CPointerVarOf<kotlinx.cinterop.CPointer<cnames.structs.libusb_device>>>> */>?): platform.posix.ssize_t /* = kotlin.Long */ { /* compiled code */ }
napperley
08/27/2019, 9:34 AM// discover devices
libusb_device **list;
libusb_device *found = NULL;
ssize_t cnt = libusb_get_device_list(NULL, &list);
ssize_t i = 0;
int err = 0;
if (cnt < 0)
error();
for (i = 0; i < cnt; i++) {
libusb_device *device = list[i];
if (is_interesting(device)) {
found = device;
break;
}
}
if (found) {
libusb_device_handle *handle;
err = libusb_open(found, &handle);
if (err)
error();
// etc
}
libusb_free_device_list(list, 1);
svyatoslav.scherbina
08/27/2019, 12:46 PMAlexander
08/27/2019, 1:00 PMlibusb
wrapper for K/N. I'm not an expert in system programming. The following code works for me:
val devs = memScope.alloc<CPointerVar<CPointerVar<libusb_device>>>()
val count = libusb_get_device_list(null, devs.ptr)
napperley
08/27/2019, 9:34 PMpackage = usb
headers = libusb.h
linkerOpts = -L/usr/lib/x86_64-linux-gnu -lusb-1.0
compilerOpts = -I/usr/include/libusb-1.0
Does my def file look ok?napperley
08/27/2019, 9:37 PMlibusb_device
struct is seen as a unresolved reference by the Kotlin Native compiler.napperley
08/27/2019, 10:39 PM---
struct libusb_device;
Did another compile and the crazy trick worked 😁 .Alexander
08/28/2019, 7:34 AMheaders = libusb.h
headerFilter = libusb.h
linkerOpts.linux = -L/usr/lib -l:libusb-1.0.so
And `build.gradle.kts`:
compilations["main"].cinterops {
val libusb by creating {
includeDirs.headerFilterOnly("/usr/include/libusb-1.0")
}
}
napperley
08/28/2019, 10:30 PMnapperley
08/28/2019, 10:32 PMval devList = allocArray<CPointerVar<CPointerVar<libusb_device>>>(1)