diff --git a/libusbdll/.cdtproject b/libusbdll/.cdtproject
index 60a6b94..384716e 100644
--- a/libusbdll/.cdtproject
+++ b/libusbdll/.cdtproject
@@ -53,23 +53,8 @@
-
-
-
-make
-
-cleanDll
-false
-true
-
-
-make
-
-testExe
-false
-true
-
make
diff --git a/libusbdll/LibusbWin.cpp b/libusbdll/LibusbWin.cpp
index f54e968..596d793 100644
--- a/libusbdll/LibusbWin.cpp
+++ b/libusbdll/LibusbWin.cpp
@@ -1,3 +1,11 @@
+/*
+ * 2005/2006
+ * Interstate University of Applied Sciences of Technology Buchs NTB
+ * Computer Science Laboratory, inf.ntb.ch
+ * Andreas Schläpfer, aschlaepfer@ntb.ch
+ *
+ */
+
#include
#include
#include
@@ -9,10 +17,54 @@
// global bus (updated when usb_get_busses() is called)
struct usb_bus *busses;
-// device class
-jclass usb_devClazz;
-// usb_device.devnum
-jfieldID usb_devFID_devnum;
+
+// global flag for loading all class, method and field ID references
+int java_references_loaded = 0;
+
+// class references
+jclass usb_busClazz, usb_devClazz, usb_devDescClazz, usb_confDescClazz, \
+ usb_intClazz, usb_intDescClazz, usb_epDescClazz;
+
+// method ID references
+jmethodID usb_busMid, usb_devMid, usb_devDescMid, usb_confDescMid, \
+ usb_intMid, usb_intDescMid, usb_epDescMid;
+
+// field ID references
+// usb_bus
+jfieldID usb_busFID_next, usb_busFID_prev, usb_busFID_dirname, \
+ usb_busFID_devices, usb_busFID_location, usb_busFID_root_dev;
+// usb_device
+jfieldID usb_devFID_next, usb_devFID_prev, usb_devFID_filename, \
+ usb_devFID_bus, usb_devFID_descriptor, usb_devFID_config, \
+ usb_devFID_devnum, usb_devFID_num_children, usb_devFID_children;
+// usb_deviceDescriptor
+jfieldID usb_devDescFID_bLength, usb_devDescFID_bDescriptorType, \
+ usb_devDescFID_bcdUSB, usb_devDescFID_bDeviceClass, \
+ usb_devDescFID_bDeviceSubClass, usb_devDescFID_bDeviceProtocol, \
+ usb_devDescFID_bMaxPacketSize0, usb_devDescFID_idVendor, \
+ usb_devDescFID_idProduct, usb_devDescFID_bcdDevice, \
+ usb_devDescFID_iManufacturer, usb_devDescFID_iProduct, \
+ usb_devDescFID_iSerialNumber, usb_devDescFID_bNumConfigurations;
+// usb_configurationDescriptor
+jfieldID usb_confDescFID_bLength, usb_confDescFID_bDescriptorType, usb_confDescFID_wTotalLength, \
+ usb_confDescFID_bNumInterfaces, usb_confDescFID_bConfigurationValue, \
+ usb_confDescFID_iConfiguration, usb_confDescFID_bmAttributes, usb_confDescFID_MaxPower, \
+ usb_confDescFID_interface_, usb_confDescFID_extra, usb_confDescFID_extralen;
+// usb_interface
+jfieldID usb_intFID_altsetting, usb_intFID_num_altsetting;
+// usb_intDesc
+jfieldID usb_intDescFID_bLength, usb_intDescFID_bDescriptorType, \
+ usb_intDescFID_bInterfaceNumber, usb_intDescFID_bAlternateSetting, \
+ usb_intDescFID_bNumEndpoints, usb_intDescFID_bInterfaceClass, \
+ usb_intDescFID_bInterfaceSubClass, usb_intDescFID_bInterfaceProtocol, \
+ usb_intDescFID_iInterface, usb_intDescFID_endpoint, usb_intDescFID_extra, \
+ usb_intDescFID_extralen;
+// usb_endpointDescriptor
+jfieldID usb_epDescFID_bLength, usb_epDescFID_bDescriptorType, \
+ usb_epDescFID_bEndpointAddress, usb_epDescFID_bmAttributes, \
+ usb_epDescFID_wMaxPacketSize, usb_epDescFID_bInterval, \
+ usb_epDescFID_bRefresh, usb_epDescFID_bSynchAddress, usb_epDescFID_extra, \
+ usb_epDescFID_extralen;
/*
* Class: ch_ntb_usb_LibusbWin
@@ -55,174 +107,133 @@ JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbWin_usb_1find_1devices
JNIEXPORT jobject JNICALL Java_ch_ntb_usb_LibusbWin_usb_1get_1busses
(JNIEnv *env, jobject obj)
{
- // classes
- jclass usb_busClazz, /*usb_devClazz,*/ usb_devDescClazz, usb_confDescClazz, \
- usb_intClazz, usb_intDescClazz, usb_epDescClazz;
- // method IDs
- jmethodID usb_busMid, usb_devMid, usb_devDescMid, usb_confDescMid, \
- usb_intMid, usb_intDescMid, usb_epDescMid;
- // usb_bus
- jfieldID usb_busFID_next, usb_busFID_prev, usb_busFID_dirname, \
- usb_busFID_devices, usb_busFID_location, usb_busFID_root_dev;
- // usb_device
- jfieldID usb_devFID_next, usb_devFID_prev, usb_devFID_filename, \
- usb_devFID_bus, usb_devFID_descriptor, usb_devFID_config, \
- /*usb_devFID_devnum,*/ usb_devFID_num_children, usb_devFID_children;
- // usb_deviceDescriptor
- jfieldID usb_devDescFID_bLength, usb_devDescFID_bDescriptorType, \
- usb_devDescFID_bcdUSB, usb_devDescFID_bDeviceClass, \
- usb_devDescFID_bDeviceSubClass, usb_devDescFID_bDeviceProtocol, \
- usb_devDescFID_bMaxPacketSize0, usb_devDescFID_idVendor, \
- usb_devDescFID_idProduct, usb_devDescFID_bcdDevice, \
- usb_devDescFID_iManufacturer, usb_devDescFID_iProduct, \
- usb_devDescFID_iSerialNumber, usb_devDescFID_bNumConfigurations;
- // usb_configurationDescriptor
- jfieldID usb_confDescFID_bLength, usb_confDescFID_bDescriptorType, usb_confDescFID_wTotalLength, \
- usb_confDescFID_bNumInterfaces, usb_confDescFID_bConfigurationValue, \
- usb_confDescFID_iConfiguration, usb_confDescFID_bmAttributes, usb_confDescFID_MaxPower, \
- usb_confDescFID_interface_, usb_confDescFID_extra, usb_confDescFID_extralen;
- // usb_interface
- jfieldID usb_intFID_altsetting, usb_intFID_num_altsetting;
- // usb_intDesc
- jfieldID usb_intDescFID_bLength, usb_intDescFID_bDescriptorType, \
- usb_intDescFID_bInterfaceNumber, usb_intDescFID_bAlternateSetting, \
- usb_intDescFID_bNumEndpoints, usb_intDescFID_bInterfaceClass, \
- usb_intDescFID_bInterfaceSubClass, usb_intDescFID_bInterfaceProtocol, \
- usb_intDescFID_iInterface, usb_intDescFID_endpoint, usb_intDescFID_extra, \
- usb_intDescFID_extralen;
- // usb_endpointDescriptor
- jfieldID usb_epDescFID_bLength, usb_epDescFID_bDescriptorType, \
- usb_epDescFID_bEndpointAddress, usb_epDescFID_bmAttributes, \
- usb_epDescFID_wMaxPacketSize, usb_epDescFID_bInterval, \
- usb_epDescFID_bRefresh, usb_epDescFID_bSynchAddress, usb_epDescFID_extra, \
- usb_epDescFID_extralen;
-
- // find classes and field ids
- // usb_bus
- usb_busClazz = env->FindClass("ch/ntb/usb/Usb_Bus");
- if (usb_busClazz == NULL) { return NULL; /* exception thrown */ }
- usb_busMid = env->GetMethodID(usb_busClazz, "","()V");
- if (usb_busMid == NULL) { return NULL; }
+
+ // only load class, method and field ID references once
+ if (!java_references_loaded) {
+ // find classes and field ids
+ // usb_bus
+ usb_busClazz = env->FindClass("ch/ntb/usb/Usb_Bus");
+ if (usb_busClazz == NULL) { return NULL; /* exception thrown */ }
+ usb_busMid = env->GetMethodID(usb_busClazz, "","()V");
+ if (usb_busMid == NULL) { return NULL; }
- usb_busFID_next = env->GetFieldID(usb_busClazz, "next", "Lch/ntb/usb/Usb_Bus;");
- usb_busFID_prev = env->GetFieldID(usb_busClazz, "prev", "Lch/ntb/usb/Usb_Bus;");
- usb_busFID_dirname = env->GetFieldID(usb_busClazz, "dirname", "Ljava/lang/String;");
- usb_busFID_devices = env->GetFieldID(usb_busClazz, "devices", "Lch/ntb/usb/Usb_Device;");
- usb_busFID_location = env->GetFieldID(usb_busClazz, "location", "J");
- usb_busFID_root_dev = env->GetFieldID(usb_busClazz, "root_dev", "Lch/ntb/usb/Usb_Device;");
+ usb_busFID_next = env->GetFieldID(usb_busClazz, "next", "Lch/ntb/usb/Usb_Bus;");
+ usb_busFID_prev = env->GetFieldID(usb_busClazz, "prev", "Lch/ntb/usb/Usb_Bus;");
+ usb_busFID_dirname = env->GetFieldID(usb_busClazz, "dirname", "Ljava/lang/String;");
+ usb_busFID_devices = env->GetFieldID(usb_busClazz, "devices", "Lch/ntb/usb/Usb_Device;");
+ usb_busFID_location = env->GetFieldID(usb_busClazz, "location", "J");
+ usb_busFID_root_dev = env->GetFieldID(usb_busClazz, "root_dev", "Lch/ntb/usb/Usb_Device;");
+
+ // usb_device
+ usb_devClazz = env->FindClass("ch/ntb/usb/Usb_Device");
+ if (usb_devClazz == NULL) { return NULL; /* exception thrown */ }
+ usb_devMid = env->GetMethodID(usb_devClazz, "","()V");
+ if (usb_devMid == NULL) { return NULL; }
+
+ usb_devFID_next = env->GetFieldID(usb_devClazz, "next", "Lch/ntb/usb/Usb_Device;");
+ usb_devFID_prev = env->GetFieldID(usb_devClazz, "prev", "Lch/ntb/usb/Usb_Device;");
+ usb_devFID_filename = env->GetFieldID(usb_devClazz, "filename", "Ljava/lang/String;");
+ usb_devFID_bus = env->GetFieldID(usb_devClazz, "bus", "Lch/ntb/usb/Usb_Bus;");
+ usb_devFID_descriptor = env->GetFieldID(usb_devClazz, "descriptor", "Lch/ntb/usb/Usb_Device_Descriptor;");
+ usb_devFID_config = env->GetFieldID(usb_devClazz, "config", "[Lch/ntb/usb/Usb_Config_Descriptor;");
+ usb_devFID_devnum = env->GetFieldID(usb_devClazz, "devnum", "B");
+ usb_devFID_num_children = env->GetFieldID(usb_devClazz, "num_children", "B");
+ usb_devFID_children = env->GetFieldID(usb_devClazz, "children", "Lch/ntb/usb/Usb_Device;");
- // usb_device
- usb_devClazz = env->FindClass("ch/ntb/usb/Usb_Device");
- if (usb_devClazz == NULL) { return NULL; /* exception thrown */ }
- usb_devMid = env->GetMethodID(usb_devClazz, "","()V");
- if (usb_devMid == NULL) { return NULL; }
+ // usb_device_descriptor
+ usb_devDescClazz = env->FindClass("ch/ntb/usb/Usb_Device_Descriptor");
+ if (usb_devDescClazz == NULL) { return NULL; /* exception thrown */ }
+ usb_devDescMid = env->GetMethodID(usb_devDescClazz, "","()V");
+ if (usb_devDescMid == NULL) { return NULL; }
- usb_devFID_next = env->GetFieldID(usb_devClazz, "next", "Lch/ntb/usb/Usb_Device;");
- usb_devFID_prev = env->GetFieldID(usb_devClazz, "prev", "Lch/ntb/usb/Usb_Device;");
- usb_devFID_filename = env->GetFieldID(usb_devClazz, "filename", "Ljava/lang/String;");
- usb_devFID_bus = env->GetFieldID(usb_devClazz, "bus", "Lch/ntb/usb/Usb_Bus;");
- usb_devFID_descriptor = env->GetFieldID(usb_devClazz, "descriptor", "Lch/ntb/usb/Usb_Device_Descriptor;");
- usb_devFID_config = env->GetFieldID(usb_devClazz, "config", "[Lch/ntb/usb/Usb_Config_Descriptor;");
- usb_devFID_devnum = env->GetFieldID(usb_devClazz, "devnum", "B");
- usb_devFID_num_children = env->GetFieldID(usb_devClazz, "num_children", "B");
- usb_devFID_children = env->GetFieldID(usb_devClazz, "children", "Lch/ntb/usb/Usb_Device;");
+ usb_devDescFID_bLength = env->GetFieldID(usb_devDescClazz, "bLength", "B");
+ usb_devDescFID_bDescriptorType = env->GetFieldID(usb_devDescClazz, "bDescriptorType", "B");
+ usb_devDescFID_bcdUSB = env->GetFieldID(usb_devDescClazz, "bcdUSB", "S");
+ usb_devDescFID_bDeviceClass = env->GetFieldID(usb_devDescClazz, "bDeviceClass", "B");
+ usb_devDescFID_bDeviceSubClass = env->GetFieldID(usb_devDescClazz, "bDeviceSubClass", "B");
+ usb_devDescFID_bDeviceProtocol = env->GetFieldID(usb_devDescClazz, "bDeviceProtocol", "B");
+ usb_devDescFID_bMaxPacketSize0 = env->GetFieldID(usb_devDescClazz, "bMaxPacketSize0", "B");
+ usb_devDescFID_idVendor = env->GetFieldID(usb_devDescClazz, "idVendor", "S");
+ usb_devDescFID_idProduct = env->GetFieldID(usb_devDescClazz, "idProduct", "S");
+ usb_devDescFID_bcdDevice = env->GetFieldID(usb_devDescClazz, "bcdDevice", "S");
+ usb_devDescFID_iManufacturer = env->GetFieldID(usb_devDescClazz, "iManufacturer", "B");
+ usb_devDescFID_iProduct = env->GetFieldID(usb_devDescClazz, "iProduct", "B");
+ usb_devDescFID_iSerialNumber = env->GetFieldID(usb_devDescClazz, "iSerialNumber", "B");
+ usb_devDescFID_bNumConfigurations = env->GetFieldID(usb_devDescClazz, "bNumConfigurations", "B");
+ // usb_configuration_descriptor
+ usb_confDescClazz = env->FindClass("ch/ntb/usb/Usb_Config_Descriptor");
+ if (usb_confDescClazz == NULL) { return NULL; /* exception thrown */ }
+ usb_confDescMid = env->GetMethodID(usb_confDescClazz, "","()V");
+ if (usb_confDescMid == NULL) { return NULL; }
- // usb_device_descriptor
- usb_devDescClazz = env->FindClass("ch/ntb/usb/Usb_Device_Descriptor");
- if (usb_devDescClazz == NULL) { return NULL; /* exception thrown */ }
- usb_devDescMid = env->GetMethodID(usb_devDescClazz, "","()V");
- if (usb_devDescMid == NULL) { return NULL; }
+ usb_confDescFID_bLength = env->GetFieldID(usb_confDescClazz, "bLength", "B");
+ usb_confDescFID_bDescriptorType = env->GetFieldID(usb_confDescClazz, "bDescriptorType", "B");
+ usb_confDescFID_wTotalLength = env->GetFieldID(usb_confDescClazz, "wTotalLength", "S");
+ usb_confDescFID_bNumInterfaces = env->GetFieldID(usb_confDescClazz, "bNumInterfaces", "B");
+ usb_confDescFID_bConfigurationValue = env->GetFieldID(usb_confDescClazz, "bConfigurationValue", "B");
+ usb_confDescFID_iConfiguration = env->GetFieldID(usb_confDescClazz, "iConfiguration", "B");
+ usb_confDescFID_bmAttributes = env->GetFieldID(usb_confDescClazz, "bmAttributes", "B");
+ usb_confDescFID_MaxPower = env->GetFieldID(usb_confDescClazz, "MaxPower", "B");
+ usb_confDescFID_interface_ = env->GetFieldID(usb_confDescClazz, "interface_", "[Lch/ntb/usb/Usb_Interface;");
+ usb_confDescFID_extra = env->GetFieldID(usb_confDescClazz, "extra", "Lch/ntb/usb/Usb_Config_Descriptor;");
+ usb_confDescFID_extralen = env->GetFieldID(usb_confDescClazz, "extralen", "I");
- usb_devDescFID_bLength = env->GetFieldID(usb_devDescClazz, "bLength", "B");
- usb_devDescFID_bDescriptorType = env->GetFieldID(usb_devDescClazz, "bDescriptorType", "B");
- usb_devDescFID_bcdUSB = env->GetFieldID(usb_devDescClazz, "bcdUSB", "S");
- usb_devDescFID_bDeviceClass = env->GetFieldID(usb_devDescClazz, "bDeviceClass", "B");
- usb_devDescFID_bDeviceSubClass = env->GetFieldID(usb_devDescClazz, "bDeviceSubClass", "B");
- usb_devDescFID_bDeviceProtocol = env->GetFieldID(usb_devDescClazz, "bDeviceProtocol", "B");
- usb_devDescFID_bMaxPacketSize0 = env->GetFieldID(usb_devDescClazz, "bMaxPacketSize0", "B");
- usb_devDescFID_idVendor = env->GetFieldID(usb_devDescClazz, "idVendor", "S");
- usb_devDescFID_idProduct = env->GetFieldID(usb_devDescClazz, "idProduct", "S");
- usb_devDescFID_bcdDevice = env->GetFieldID(usb_devDescClazz, "bcdDevice", "S");
- usb_devDescFID_iManufacturer = env->GetFieldID(usb_devDescClazz, "iManufacturer", "B");
- usb_devDescFID_iProduct = env->GetFieldID(usb_devDescClazz, "iProduct", "B");
- usb_devDescFID_iSerialNumber = env->GetFieldID(usb_devDescClazz, "iSerialNumber", "B");
- usb_devDescFID_bNumConfigurations = env->GetFieldID(usb_devDescClazz, "bNumConfigurations", "B");
+ // usb_interface
+ usb_intClazz = env->FindClass("ch/ntb/usb/Usb_Interface");
+ if (usb_intClazz == NULL) { return NULL; /* exception thrown */ }
+ usb_intMid = env->GetMethodID(usb_intClazz, "","()V");
+ if (usb_intMid == NULL) { return NULL; }
+ usb_intFID_altsetting = env->GetFieldID(usb_intClazz, "altsetting", "[Lch/ntb/usb/Usb_Interface_Descriptor;");
+ usb_intFID_num_altsetting = env->GetFieldID(usb_intClazz, "num_altsetting", "I");
- // usb_configuration_descriptor
- usb_confDescClazz = env->FindClass("ch/ntb/usb/Usb_Config_Descriptor");
- if (usb_confDescClazz == NULL) { return NULL; /* exception thrown */ }
- usb_confDescMid = env->GetMethodID(usb_confDescClazz, "","()V");
- if (usb_confDescMid == NULL) { return NULL; }
+ // usb_interface_descriptor
+ usb_intDescClazz = env->FindClass("ch/ntb/usb/Usb_Interface_Descriptor");
+ if (usb_intDescClazz == NULL) { return NULL; /* exception thrown */ }
+ usb_intDescMid = env->GetMethodID(usb_intDescClazz, "","()V");
+ if (usb_intDescMid == NULL) { return NULL; }
- usb_confDescFID_bLength = env->GetFieldID(usb_confDescClazz, "bLength", "B");
- usb_confDescFID_bDescriptorType = env->GetFieldID(usb_confDescClazz, "bDescriptorType", "B");
- usb_confDescFID_wTotalLength = env->GetFieldID(usb_confDescClazz, "wTotalLength", "S");
- usb_confDescFID_bNumInterfaces = env->GetFieldID(usb_confDescClazz, "bNumInterfaces", "B");
- usb_confDescFID_bConfigurationValue = env->GetFieldID(usb_confDescClazz, "bConfigurationValue", "B");
- usb_confDescFID_iConfiguration = env->GetFieldID(usb_confDescClazz, "iConfiguration", "B");
- usb_confDescFID_bmAttributes = env->GetFieldID(usb_confDescClazz, "bmAttributes", "B");
- usb_confDescFID_MaxPower = env->GetFieldID(usb_confDescClazz, "MaxPower", "B");
- usb_confDescFID_interface_ = env->GetFieldID(usb_confDescClazz, "interface_", "[Lch/ntb/usb/Usb_Interface;");
- usb_confDescFID_extra = env->GetFieldID(usb_confDescClazz, "extra", "Lch/ntb/usb/Usb_Config_Descriptor;");
- usb_confDescFID_extralen = env->GetFieldID(usb_confDescClazz, "extralen", "I");
+ usb_intDescFID_bLength = env->GetFieldID(usb_intDescClazz, "bLength", "B");
+ usb_intDescFID_bDescriptorType = env->GetFieldID(usb_intDescClazz, "bDescriptorType", "B");
+ usb_intDescFID_bInterfaceNumber = env->GetFieldID(usb_intDescClazz, "bInterfaceNumber", "B");
+ usb_intDescFID_bAlternateSetting = env->GetFieldID(usb_intDescClazz, "bAlternateSetting", "B");
+ usb_intDescFID_bNumEndpoints = env->GetFieldID(usb_intDescClazz, "bNumEndpoints", "B");
+ usb_intDescFID_bInterfaceClass = env->GetFieldID(usb_intDescClazz, "bInterfaceClass", "B");
+ usb_intDescFID_bInterfaceSubClass = env->GetFieldID(usb_intDescClazz, "bInterfaceSubClass", "B");
+ usb_intDescFID_bInterfaceProtocol = env->GetFieldID(usb_intDescClazz, "bInterfaceProtocol", "B");
+ usb_intDescFID_iInterface = env->GetFieldID(usb_intDescClazz, "iInterface", "B");
+ usb_intDescFID_endpoint = env->GetFieldID(usb_intDescClazz, "endpoint", "[Lch/ntb/usb/Usb_Endpoint_Descriptor;");
+ usb_intDescFID_extra = env->GetFieldID(usb_intDescClazz, "extra", "Lch/ntb/usb/Usb_Interface_Descriptor;");
+ usb_intDescFID_extralen = env->GetFieldID(usb_intDescClazz, "extralen", "I");
- // usb_interface
- usb_intClazz = env->FindClass("ch/ntb/usb/Usb_Interface");
- if (usb_intClazz == NULL) { return NULL; /* exception thrown */ }
- usb_intMid = env->GetMethodID(usb_intClazz, "","()V");
- if (usb_intMid == NULL) { return NULL; }
+ // usb_endpoint_descriptor
+ usb_epDescClazz = env->FindClass("ch/ntb/usb/Usb_Endpoint_Descriptor");
+ if (usb_epDescClazz == NULL) { return NULL; /* exception thrown */ }
+ usb_epDescMid = env->GetMethodID(usb_epDescClazz, "","()V");
+ if (usb_epDescMid == NULL) { return NULL; }
- usb_intFID_altsetting = env->GetFieldID(usb_intClazz, "altsetting", "[Lch/ntb/usb/Usb_Interface_Descriptor;");
- usb_intFID_num_altsetting = env->GetFieldID(usb_intClazz, "num_altsetting", "I");
-
- // usb_interface_descriptor
- usb_intDescClazz = env->FindClass("ch/ntb/usb/Usb_Interface_Descriptor");
- if (usb_intDescClazz == NULL) { return NULL; /* exception thrown */ }
- usb_intDescMid = env->GetMethodID(usb_intDescClazz, "","()V");
- if (usb_intDescMid == NULL) { return NULL; }
-
- usb_intDescFID_bLength = env->GetFieldID(usb_intDescClazz, "bLength", "B");
- usb_intDescFID_bDescriptorType = env->GetFieldID(usb_intDescClazz, "bDescriptorType", "B");
- usb_intDescFID_bInterfaceNumber = env->GetFieldID(usb_intDescClazz, "bInterfaceNumber", "B");
- usb_intDescFID_bAlternateSetting = env->GetFieldID(usb_intDescClazz, "bAlternateSetting", "B");
- usb_intDescFID_bNumEndpoints = env->GetFieldID(usb_intDescClazz, "bNumEndpoints", "B");
- usb_intDescFID_bInterfaceClass = env->GetFieldID(usb_intDescClazz, "bInterfaceClass", "B");
- usb_intDescFID_bInterfaceSubClass = env->GetFieldID(usb_intDescClazz, "bInterfaceSubClass", "B");
- usb_intDescFID_bInterfaceProtocol = env->GetFieldID(usb_intDescClazz, "bInterfaceProtocol", "B");
- usb_intDescFID_iInterface = env->GetFieldID(usb_intDescClazz, "iInterface", "B");
- usb_intDescFID_endpoint = env->GetFieldID(usb_intDescClazz, "endpoint", "[Lch/ntb/usb/Usb_Endpoint_Descriptor;");
- usb_intDescFID_extra = env->GetFieldID(usb_intDescClazz, "extra", "Lch/ntb/usb/Usb_Interface_Descriptor;");
- usb_intDescFID_extralen = env->GetFieldID(usb_intDescClazz, "extralen", "I");
-
- // usb_endpoint_descriptor
- usb_epDescClazz = env->FindClass("ch/ntb/usb/Usb_Endpoint_Descriptor");
- if (usb_epDescClazz == NULL) { return NULL; /* exception thrown */ }
- usb_epDescMid = env->GetMethodID(usb_epDescClazz, "","()V");
- if (usb_epDescMid == NULL) { return NULL; }
-
- usb_epDescFID_bLength = env->GetFieldID(usb_epDescClazz, "bLength", "B");
- usb_epDescFID_bDescriptorType = env->GetFieldID(usb_epDescClazz, "bDescriptorType", "B");
- usb_epDescFID_bEndpointAddress = env->GetFieldID(usb_epDescClazz, "bEndpointAddress", "B");
- usb_epDescFID_bmAttributes = env->GetFieldID(usb_epDescClazz, "bmAttributes", "B");
- usb_epDescFID_wMaxPacketSize = env->GetFieldID(usb_epDescClazz, "wMaxPacketSize", "S");
- usb_epDescFID_bInterval = env->GetFieldID(usb_epDescClazz, "bInterval", "B");
- usb_epDescFID_bRefresh = env->GetFieldID(usb_epDescClazz, "bRefresh", "B");
- usb_epDescFID_bSynchAddress = env->GetFieldID(usb_epDescClazz, "bSynchAddress", "B");
- usb_epDescFID_extra = env->GetFieldID(usb_epDescClazz, "extra", "Lch/ntb/usb/Usb_Endpoint_Descriptor;");
- usb_epDescFID_extralen = env->GetFieldID(usb_epDescClazz, "extralen", "I");
+ usb_epDescFID_bLength = env->GetFieldID(usb_epDescClazz, "bLength", "B");
+ usb_epDescFID_bDescriptorType = env->GetFieldID(usb_epDescClazz, "bDescriptorType", "B");
+ usb_epDescFID_bEndpointAddress = env->GetFieldID(usb_epDescClazz, "bEndpointAddress", "B");
+ usb_epDescFID_bmAttributes = env->GetFieldID(usb_epDescClazz, "bmAttributes", "B");
+ usb_epDescFID_wMaxPacketSize = env->GetFieldID(usb_epDescClazz, "wMaxPacketSize", "S");
+ usb_epDescFID_bInterval = env->GetFieldID(usb_epDescClazz, "bInterval", "B");
+ usb_epDescFID_bRefresh = env->GetFieldID(usb_epDescClazz, "bRefresh", "B");
+ usb_epDescFID_bSynchAddress = env->GetFieldID(usb_epDescClazz, "bSynchAddress", "B");
+ usb_epDescFID_extra = env->GetFieldID(usb_epDescClazz, "extra", "Lch/ntb/usb/Usb_Endpoint_Descriptor;");
+ usb_epDescFID_extralen = env->GetFieldID(usb_epDescClazz, "extralen", "I");
+#ifdef DEBUGON
+ printf("usb_get_busses: Field initialization done (1)\n");
+#endif
+ }
//************************************************************************//
-#ifdef DEBUGON
- printf("usb_get_busses: Field initialization done (1)\n");
-#endif
-
struct usb_device *dev;
struct usb_bus *bus;
-
+
busses = usb_get_busses();
bus = busses;
if (!bus){
@@ -247,13 +258,13 @@ JNIEXPORT jobject JNICALL Java_ch_ntb_usb_LibusbWin_usb_1get_1busses
while (bus){
#ifdef DEBUGON
- printf("\tusb_get_busses: bus %x (2)\n", bus);
+ printf("\tusb_get_busses: bus %x (3)\n", bus);
#endif
// create a new object for every bus
if (!usb_busObj) {
usb_busObj = env->NewObject(usb_busClazz, usb_busMid);
- if (!usb_busObj) { printf("Error NewObject 1\n"); return NULL; }
+ if (!usb_busObj) { printf("Error NewObject (usb_busObj)\n"); return NULL; }
main_usb_busObj = usb_busObj;
}
@@ -261,7 +272,7 @@ JNIEXPORT jobject JNICALL Java_ch_ntb_usb_LibusbWin_usb_1get_1busses
usb_busObj_next = NULL;
if (bus->next){
usb_busObj_next = env->NewObject(usb_busClazz, usb_busMid);
- if (!usb_busObj_next) { printf("Error NewObject 2\n"); return NULL; }
+ if (!usb_busObj_next) { printf("Error NewObject (usb_busObj_next)\n"); return NULL; }
}
env->SetObjectField(usb_busObj, usb_busFID_next, usb_busObj_next);
env->SetObjectField(usb_busObj, usb_busFID_prev, usb_busObj_prev);
@@ -275,19 +286,19 @@ JNIEXPORT jobject JNICALL Java_ch_ntb_usb_LibusbWin_usb_1get_1busses
while (dev){
#ifdef DEBUGON
- printf("\tusb_get_busses: dev %x (3)\n", dev);
+ printf("\tusb_get_busses: dev %x (4)\n", dev);
#endif
// create a new object for every device
if (!usb_devObj){
usb_devObj = env->NewObject(usb_devClazz, usb_devMid);
- if (!usb_devObj) { printf("Error NewObject 3\n"); return NULL; }
+ if (!usb_devObj) { printf("Error NewObject (usb_devObj)\n"); return NULL; }
main_usb_devObj = usb_devObj;
}
// fill the fields of the object
usb_devObj_next = NULL;
if (dev->next){
usb_devObj_next = env->NewObject(usb_devClazz, usb_devMid);
- if (!usb_devObj_next) { printf("Error NewObject 4\n"); return NULL; }
+ if (!usb_devObj_next) { printf("Error NewObject (usb_devObj_next)\n"); return NULL; }
}
env->SetObjectField(usb_devObj, usb_devFID_next, usb_devObj_next);
env->SetObjectField(usb_devObj, usb_devFID_prev, usb_devObj_prev);
@@ -298,7 +309,7 @@ JNIEXPORT jobject JNICALL Java_ch_ntb_usb_LibusbWin_usb_1get_1busses
// device descriptor
usb_devDescObj = env->NewObject(usb_devDescClazz, usb_devDescMid);
- if (!usb_devDescObj) { printf("Error NewObject 5\n"); return NULL; }
+ if (!usb_devDescObj) { printf("Error NewObject (usb_devDescObj)\n"); return NULL; }
env->SetByteField(usb_devDescObj, usb_devDescFID_bLength, dev->descriptor.bLength);
env->SetByteField(usb_devDescObj, usb_devDescFID_bDescriptorType, dev->descriptor.bDescriptorType);
env->SetShortField(usb_devDescObj, usb_devDescFID_bcdUSB, dev->descriptor.bcdUSB);
@@ -321,15 +332,16 @@ JNIEXPORT jobject JNICALL Java_ch_ntb_usb_LibusbWin_usb_1get_1busses
if (!usb_confDescObjArray) { printf("Error NewObject 6\n"); return NULL; }
for (int c = 0; c < dev->descriptor.bNumConfigurations; c++){
#ifdef DEBUGON
- printf("\t\tusb_get_busses: configuration %x (4)\n", c);
+ printf("\t\tusb_get_busses: configuration %x (5)\n", c);
#endif
if (dev->config == NULL) {
+ // this shouldn't happen, but it did occasionally (maybe this is (or probably was) a libusb bug)
printf("dev->config == NULL\n");
return main_usb_busObj;
}
usb_confDescObj = env->NewObject(usb_confDescClazz, usb_confDescMid);
- if (!usb_confDescObj) { printf("Error NewObject 7\n"); return NULL; }
+ if (!usb_confDescObj) { printf("Error NewObject (usb_confDescObj)\n"); return NULL; }
env->SetObjectArrayElement(usb_confDescObjArray, c, usb_confDescObj);
env->SetByteField(usb_confDescObj, usb_confDescFID_bLength, dev->config[c].bLength);
env->SetByteField(usb_confDescObj, usb_confDescFID_bDescriptorType, dev->config[c].bDescriptorType);
@@ -348,34 +360,36 @@ JNIEXPORT jobject JNICALL Java_ch_ntb_usb_LibusbWin_usb_1get_1busses
}
// interface
usb_intObjArray = env->NewObjectArray(dev->config[c].bNumInterfaces, usb_intClazz, NULL);
- if (!usb_intObjArray) { printf("Error NewObject 8\n"); return NULL; }
+ if (!usb_intObjArray) { printf("Error NewObject (usb_intObjArray)\n"); return NULL; }
for (int i = 0; i < dev->config[c].bNumInterfaces; i++){
#ifdef DEBUGON
- printf("\t\t\tusb_get_busses: interface %x (5)\n", i);
+ printf("\t\t\tusb_get_busses: interface %x (6)\n", i);
#endif
if (dev->config[c].interface == NULL) {
+ // this shouldn't happen
printf("dev->config[c].interface == NULL\n");
return main_usb_busObj;
}
usb_intObj = env->NewObject(usb_intClazz, usb_intMid);
- if (!usb_intObj) { printf("Error NewObject 9\n"); return NULL; }
+ if (!usb_intObj) { printf("Error NewObject (usb_intObj)\n"); return NULL; }
env->SetObjectArrayElement(usb_intObjArray, i, usb_intObj);
env->SetIntField(usb_intObj, usb_intFID_num_altsetting, dev->config[c].interface[i].num_altsetting);
// interface descriptor
usb_intDescObjArray = env->NewObjectArray(dev->config[c].interface[i].num_altsetting, usb_intDescClazz, NULL);
- if (!usb_intDescObjArray) { printf("Error NewObject 10\n"); return NULL; }
+ if (!usb_intDescObjArray) { printf("Error NewObject (usb_intDescObjArray)\n"); return NULL; }
for (int a = 0; a < dev->config[c].interface[i].num_altsetting; a++){
#ifdef DEBUGON
- printf("\t\t\t\tusb_get_busses: interface descriptor %x (6)\n", a);
+ printf("\t\t\t\tusb_get_busses: interface descriptor %x (7)\n", a);
#endif
if (dev->config[c].interface[i].altsetting == NULL) {
+ // this shouldn't happen
printf("dev->config[c].interface[i].altsetting == NULL\n");
return main_usb_busObj;
}
usb_intDescObj = env->NewObject(usb_intDescClazz, usb_intDescMid);
- if (!usb_intDescObj) { printf("Error NewObject 11\n"); return NULL; }
+ if (!usb_intDescObj) { printf("Error NewObject (usb_intDescObj)\n"); return NULL; }
env->SetObjectArrayElement(usb_intDescObjArray, a, usb_intDescObj);
env->SetByteField(usb_intDescObj, usb_intDescFID_bLength, dev->config[c].interface[i].altsetting[a].bLength);
env->SetByteField(usb_intDescObj, usb_intDescFID_bDescriptorType, dev->config[c].interface[i].altsetting[a].bDescriptorType);
@@ -395,10 +409,10 @@ JNIEXPORT jobject JNICALL Java_ch_ntb_usb_LibusbWin_usb_1get_1busses
env->SetObjectField(usb_intDescObj, usb_intDescFID_extra, NULL);
// endpoint descriptor
usb_epDescObjArray = env->NewObjectArray(dev->config[c].interface[i].altsetting[a].bNumEndpoints, usb_epDescClazz, NULL);
- if (!usb_epDescObjArray) { printf("Error NewObject 12\n"); return NULL; }
+ if (!usb_epDescObjArray) { printf("Error NewObject (usb_epDescObjArray)\n"); return NULL; }
for (int e = 0; e < dev->config[c].interface[i].altsetting[a].bNumEndpoints; e++){
#ifdef DEBUGON
- printf("\t\t\t\t\tusb_get_busses: endpoint descriptor %x (7)\n", e);
+ printf("\t\t\t\t\tusb_get_busses: endpoint descriptor %x (8)\n", e);
#endif
if (dev->config[c].interface[i].altsetting[a].endpoint == NULL) {
printf("dev->config[c].interface[i].altsetting[a].endpoint == NULL\n");
@@ -406,7 +420,7 @@ JNIEXPORT jobject JNICALL Java_ch_ntb_usb_LibusbWin_usb_1get_1busses
}
usb_epDescObj = env->NewObject(usb_epDescClazz, usb_epDescMid);
- if (!usb_epDescObj) { printf("Error NewObject 13\n"); return NULL; }
+ if (!usb_epDescObj) { printf("Error NewObject (usb_epDescObj)\n"); return NULL; }
env->SetObjectArrayElement(usb_epDescObjArray, e, usb_epDescObj);
env->SetByteField(usb_epDescObj, usb_epDescFID_bLength, dev->config[c].interface[i].altsetting[a].endpoint[e].bLength);
env->SetByteField(usb_epDescObj, usb_epDescFID_bDescriptorType, dev->config[c].interface[i].altsetting[a].endpoint[e].bDescriptorType);
@@ -639,10 +653,9 @@ JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbWin_usb_1bulk_1write
JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbWin_usb_1bulk_1read
(JNIEnv *env, jobject obj, jint dev_handle, jint ep, jbyteArray jbytes, jint size, jint timeout)
{
- char *bytes = (char *) malloc(size*sizeof(char));
+ char *bytes = (char *) malloc(size * sizeof(char));
int retVal = usb_bulk_read((usb_dev_handle *) dev_handle, ep, bytes, size, timeout);
if (!bytes) { return retVal; }
- // jbytes = env->NewByteArray(size);
env->SetByteArrayRegion(jbytes, 0, size, (jbyte *) bytes);
free(bytes);
return retVal;
@@ -668,11 +681,11 @@ JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbWin_usb_1interrupt_1write
JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbWin_usb_1interrupt_1read
(JNIEnv *env, jobject obj, jint dev_handle, jint ep, jbyteArray jbytes, jint size, jint timeout)
{
- jbyte *bytes;
- int retVal = usb_interrupt_write((usb_dev_handle *) dev_handle, ep, (char *) bytes, size, timeout);
- if (bytes) { return retVal; }
- jbytes = env->NewByteArray(size);
- env->SetByteArrayRegion(jbytes, 0, size, bytes);
+ char *bytes = (char *) malloc(size * sizeof(char));
+ int retVal = usb_interrupt_write((usb_dev_handle *) dev_handle, ep, bytes, size, timeout);
+ if (!bytes) { return retVal; }
+ env->SetByteArrayRegion(jbytes, 0, size, (jbyte *) bytes);
+ free(bytes);
return retVal;
}
diff --git a/libusbdll/LibusbWin.dll b/libusbdll/LibusbWin.dll
index 102cc87..bff7e5f 100644
Binary files a/libusbdll/LibusbWin.dll and b/libusbdll/LibusbWin.dll differ