Skip to content

Commit b885b59

Browse files
committed
JDK20 and high-throughput streams
2 parents 7dfc416 + 9019cd7 commit b885b59

File tree

227 files changed

+13344
-5172
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

227 files changed

+13344
-5172
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
java-does-usb/sample.bin
2+
13
# Maven
24
target/
35
*.ser

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Java Does USB: USB Library for Java
22

3+
> **Development branch for JDK 20**
4+
35
[![javadoc](https://javadoc.io/badge2/net.codecrete.usb/java-does-usb/javadoc.svg)](https://javadoc.io/doc/net.codecrete.usb/java-does-usb)
46

57
*Java Does USB* is a library for working with USB devices. It allows to query information about all conntected USB devices and to communicate with USB devices using custom / vendor specific protocols. (It is not intended for communication with standard types of USB devices such as mass storage devices, keyboards etc.)
@@ -80,7 +82,7 @@ public class EnumerateDevices {
8082

8183
## Prerequisite
8284

83-
- Java 19, preview features enabled (available at https://www.azul.com/downloads/?package=jdk)
85+
- Java 20, preview features enabled (available at https://www.azul.com/downloads/?package=jdk)
8486
- Windows (x86 64-bit), macOS (x86 64-bit, ARM 64-bit) or Linux 64 bit (x86 64-bit, ARM 64-bit)
8587

8688
For a version compatible with JDK 20, see the branch `jdk20`.
@@ -119,8 +121,6 @@ USB devices can implement certain control requests to instruct Windows to automa
119121

120122
The test devices implement the required control requests. So the driver is installed automatically.
121123

122-
This library does not yet run reliably on Windows as the Java VM sometimes overwrites the last error code, which is needed for proper function, not just in error cases. It works incorrectly when run in the debugger and sometimes even without the debugger. A future version of the Foreign Function & Memory API will hopefully provide a way to save the last error code. The developers are aware of the issue.
123-
124124
The library has not been tested on Windows for ARM64. It might or might not work.
125125

126126

java-does-usb/jextract/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ The known limitations are:
9292

9393
*jextract* generates a comprehensive set of methods for each function, struct, struct member etc. Most of it will not be used as a typical application just uses a subset of struct members, might only read or write them etc. So a considerable amount of code is generated. For some types, it's a bit excessive.
9494

95-
The worst example is [`IOUSBInterfaceStruct942`](https://github.com/manuelbl/JavaDoesUSB/blob/main/java-does-usb/src/main/java/net/codecrete/usb/macos/gen/iokit/IOUSBDeviceStruct942.java) (macOS). This is a `struct` consisting of about 75 member functions. It's bascially a vtable of a C++ class. *jextract* generates the same number of classes plus a huge class for the struct itself. The total code size (compiled) for this single `struct` is over 300 kByte.
95+
The worst example is [`IOUSBInterfaceStruct100`](https://github.com/manuelbl/JavaDoesUSB/blob/main/java-does-usb/src/main/java/net/codecrete/usb/macos/gen/iokit/IOUSBDeviceStruct100.java) (macOS). This is a `struct` consisting of about 75 member functions. It's bascially a vtable of a C++ class. *jextract* generates the same number of classes plus a huge class for the struct itself. The total code size (compiled) for this single `struct` is over 300 kByte.
9696

9797
The table below shows statictics for version 0.2.0 of the library:
9898

java-does-usb/jextract/linux/gen_linux.sh

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/bin/sh
22

3-
JEXTRACT=../../../../jextract-19/bin/jextract
3+
JEXTRACT=../../../../jextract/build/jextract/bin/jextract
44

55
# sd-device.h (install libsystemd-dev if file is missing)
66
# Error: /usr/include/inttypes.h:290:8: error: unknown type name 'intmax_t'
@@ -14,9 +14,10 @@ JEXTRACT=../../../../jextract-19/bin/jextract
1414
$JEXTRACT --source --output ../../src/main/java \
1515
--header-class-name errno \
1616
--target-package net.codecrete.usb.linux.gen.errno \
17-
--include-function __errno_location \
18-
--include-macro ETIMEDOUT \
19-
--include-macro EPIPE \
17+
--include-constant ETIMEDOUT \
18+
--include-constant EPIPE \
19+
--include-constant EBADF \
20+
--include-constant EAGAIN \
2021
/usr/include/errno.h
2122

2223
# string.h
@@ -26,20 +27,12 @@ $JEXTRACT --source --output ../../src/main/java \
2627
--include-function strerror \
2728
/usr/include/string.h
2829

29-
# ioctl.h
30-
$JEXTRACT --source --output ../../src/main/java \
31-
--header-class-name ioctl \
32-
--target-package net.codecrete.usb.linux.gen.ioctl \
33-
--include-function ioctl \
34-
/usr/include/x86_64-linux-gnu/sys/ioctl.h
35-
3630
# fcntl.h
3731
$JEXTRACT --source --output ../../src/main/java \
3832
--header-class-name fcntl \
3933
--target-package net.codecrete.usb.linux.gen.fcntl \
40-
--include-function open \
41-
--include-macro O_CLOEXEC \
42-
--include-macro O_RDWR \
34+
--include-constant O_CLOEXEC \
35+
--include-constant O_RDWR \
4336
/usr/include/fcntl.h
4437

4538
# unistd.h
@@ -57,12 +50,20 @@ $JEXTRACT --source --output ../../src/main/java \
5750
--include-struct usbdevfs_bulktransfer \
5851
--include-struct usbdevfs_ctrltransfer \
5952
--include-struct usbdevfs_setinterface \
60-
--include-macro USBDEVFS_CONTROL \
61-
--include-macro USBDEVFS_BULK \
62-
--include-macro USBDEVFS_CLAIMINTERFACE \
63-
--include-macro USBDEVFS_RELEASEINTERFACE \
64-
--include-macro USBDEVFS_SETINTERFACE \
65-
--include-macro USBDEVFS_CLEAR_HALT \
53+
--include-struct usbdevfs_urb \
54+
--include-constant USBDEVFS_CONTROL \
55+
--include-constant USBDEVFS_BULK \
56+
--include-constant USBDEVFS_CLAIMINTERFACE \
57+
--include-constant USBDEVFS_RELEASEINTERFACE \
58+
--include-constant USBDEVFS_SETINTERFACE \
59+
--include-constant USBDEVFS_CLEAR_HALT \
60+
--include-constant USBDEVFS_SUBMITURB \
61+
--include-constant USBDEVFS_DISCARDURB \
62+
--include-constant USBDEVFS_REAPURB \
63+
--include-constant USBDEVFS_URB_TYPE_INTERRUPT \
64+
--include-constant USBDEVFS_URB_TYPE_CONTROL \
65+
--include-constant USBDEVFS_URB_TYPE_BULK \
66+
--include-constant USBDEVFS_URB_TYPE_ISO \
6667
/usr/include/linux/usbdevice_fs.h
6768

6869
# libudev.h
@@ -98,6 +99,8 @@ $JEXTRACT --source --output ../../src/main/java \
9899
--target-package net.codecrete.usb.linux.gen.poll \
99100
--include-function poll \
100101
--include-struct pollfd \
101-
--include-macro POLLIN \
102+
--include-constant POLLIN \
103+
--include-constant POLLOUT \
104+
--include-constant POLLERR \
102105
/usr/include/poll.h
103106

java-does-usb/jextract/macos/gen_macos.sh

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/bin/sh
22

3-
JEXTRACT=../../../../jextract-19/bin/jextract
3+
JEXTRACT=../../../../jextract/build/jextract/bin/jextract
44
# If SDK_DIR is changed, it needs to be changed in compile_flags.txt as well.
55
SDK_DIR=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
66

@@ -23,9 +23,10 @@ $JEXTRACT --source --output ../../src/main/java \
2323
--include-function CFNumberGetValue \
2424
--include-function CFRunLoopGetCurrent \
2525
--include-function CFRunLoopAddSource \
26+
--include-function CFRunLoopRemoveSource \
2627
--include-function CFRunLoopRun \
2728
--include-function CFUUIDGetUUIDBytes \
28-
--include-macro kCFNumberSInt32Type \
29+
--include-constant kCFNumberSInt32Type \
2930
cf_helper.h
3031

3132
# IOKit
@@ -35,9 +36,9 @@ $JEXTRACT --source --output ../../src/main/java \
3536
--header-class-name IOKit \
3637
--target-package net.codecrete.usb.macos.gen.iokit \
3738
--include-var kIOMasterPortDefault \
38-
--include-macro kIOUSBDeviceClassName \
39-
--include-macro kIOFirstMatchNotification \
40-
--include-macro kIOTerminatedNotification \
39+
--include-constant kIOUSBDeviceClassName \
40+
--include-constant kIOFirstMatchNotification \
41+
--include-constant kIOTerminatedNotification \
4142
--include-var kCFRunLoopDefaultMode \
4243
--include-struct IOCFPlugInInterfaceStruct \
4344
--include-typedef IOCFPlugInInterface \
@@ -52,14 +53,14 @@ $JEXTRACT --source --output ../../src/main/java \
5253
--include-function IOServiceMatching \
5354
--include-struct IOUSBDeviceStruct100 \
5455
--include-typedef IOUSBDeviceInterface100 \
55-
--include-macro kIOUSBFindInterfaceDontCare \
56+
--include-constant kIOUSBFindInterfaceDontCare \
5657
--include-typedef IOUSBFindInterfaceRequest \
5758
--include-typedef IOUSBDevRequest \
5859
--include-struct IOUSBInterfaceStruct190 \
5960
--include-typedef IOUSBInterfaceInterface190 \
60-
--include-macro kIOUSBTransactionTimeout \
61-
--include-macro kIOReturnAborted \
62-
--include-macro kIOUSBPipeStalled \
61+
--include-constant kIOUSBTransactionTimeout \
62+
--include-constant kIOReturnAborted \
63+
--include-constant kIOUSBPipeStalled \
6364
iokit_helper.h
6465

6566
# mach.h
Lines changed: 51 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
set JEXTRACT=..\..\..\..\jextract-19\bin\jextract.bat
1+
set JEXTRACT=..\..\..\..\jextract\build\jextract\bin\jextract.bat
22
set SDK_DIR=C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0
33

44
call %JEXTRACT% --source --output ../../src/main/java ^
@@ -8,32 +8,33 @@ call %JEXTRACT% --source --output ../../src/main/java ^
88
-l Kernel32 ^
99
--header-class-name Kernel32 ^
1010
--target-package net.codecrete.usb.windows.gen.kernel32 ^
11-
--include-function CreateFileW ^
1211
--include-function CloseHandle ^
13-
--include-function DeviceIoControl ^
14-
--include-function GetLastError ^
1512
--include-function GetModuleHandleW ^
1613
--include-function FormatMessageW ^
1714
--include-function LocalFree ^
18-
--include-macro ERROR_SUCCESS ^
19-
--include-macro ERROR_NO_MORE_ITEMS ^
20-
--include-macro ERROR_MORE_DATA ^
21-
--include-macro ERROR_INSUFFICIENT_BUFFER ^
22-
--include-macro ERROR_FILE_NOT_FOUND ^
23-
--include-macro ERROR_SEM_TIMEOUT ^
24-
--include-macro ERROR_GEN_FAILURE ^
25-
--include-macro GENERIC_READ ^
26-
--include-macro GENERIC_WRITE ^
27-
--include-macro FILE_SHARE_READ ^
28-
--include-macro FILE_SHARE_WRITE ^
29-
--include-macro FILE_ATTRIBUTE_NORMAL ^
30-
--include-macro FILE_FLAG_OVERLAPPED ^
31-
--include-macro OPEN_EXISTING ^
32-
--include-macro FORMAT_MESSAGE_ALLOCATE_BUFFER ^
33-
--include-macro FORMAT_MESSAGE_FROM_SYSTEM ^
34-
--include-macro FORMAT_MESSAGE_IGNORE_INSERTS ^
15+
--include-constant ERROR_NO_MORE_ITEMS ^
16+
--include-constant ERROR_MORE_DATA ^
17+
--include-constant ERROR_INSUFFICIENT_BUFFER ^
18+
--include-constant ERROR_FILE_NOT_FOUND ^
19+
--include-constant ERROR_GEN_FAILURE ^
20+
--include-constant ERROR_NOT_FOUND ^
21+
--include-constant ERROR_IO_PENDING ^
22+
--include-constant GENERIC_READ ^
23+
--include-constant GENERIC_WRITE ^
24+
--include-constant FILE_SHARE_READ ^
25+
--include-constant FILE_SHARE_WRITE ^
26+
--include-constant FILE_ATTRIBUTE_NORMAL ^
27+
--include-constant FILE_FLAG_OVERLAPPED ^
28+
--include-constant OPEN_EXISTING ^
29+
--include-constant FORMAT_MESSAGE_ALLOCATE_BUFFER ^
30+
--include-constant FORMAT_MESSAGE_FROM_SYSTEM ^
31+
--include-constant FORMAT_MESSAGE_IGNORE_INSERTS ^
32+
--include-constant FORMAT_MESSAGE_FROM_HMODULE ^
33+
--include-constant INFINITE ^
3534
--include-struct _GUID ^
3635
--include-typedef GUID ^
36+
--include-struct _OVERLAPPED ^
37+
--include-typedef OVERLAPPED ^
3738
windows_headers.h
3839

3940
call %JEXTRACT% --source --output ../../src/main/java ^
@@ -43,39 +44,23 @@ call %JEXTRACT% --source --output ../../src/main/java ^
4344
-l SetupAPI ^
4445
--header-class-name SetupAPI ^
4546
--target-package net.codecrete.usb.windows.gen.setupapi ^
46-
--include-function SetupDiGetClassDevsW ^
4747
--include-function SetupDiDestroyDeviceInfoList ^
48-
--include-function SetupDiEnumDeviceInfo ^
49-
--include-function SetupDiEnumDeviceInterfaces ^
50-
--include-function SetupDiGetDeviceInterfaceDetailW ^
51-
--include-function SetupDiGetDeviceRegistryPropertyW ^
52-
--include-function SetupDiGetDevicePropertyW ^
53-
--include-function SetupDiOpenDeviceInterfaceW ^
54-
--include-function SetupDiCreateDeviceInfoList ^
55-
--include-function SetupDiOpenDeviceInfoW ^
56-
--include-function SetupDiOpenDevRegKey ^
5748
--include-function SetupDiDeleteDeviceInterfaceData ^
5849
--include-struct _SP_DEVINFO_DATA ^
5950
--include-typedef SP_DEVINFO_DATA ^
6051
--include-struct _SP_DEVICE_INTERFACE_DATA ^
6152
--include-typedef SP_DEVICE_INTERFACE_DATA ^
6253
--include-struct _SP_DEVICE_INTERFACE_DETAIL_DATA_W ^
6354
--include-typedef SP_DEVICE_INTERFACE_DETAIL_DATA_W ^
64-
--include-macro DIGCF_PRESENT ^
65-
--include-macro DIGCF_DEVICEINTERFACE ^
66-
--include-macro SPDRP_ADDRESS ^
67-
--include-macro DEVPROP_TYPE_UINT32 ^
68-
--include-macro DEVPROP_TYPE_STRING ^
69-
--include-macro DEVPROP_TYPEMOD_LIST ^
70-
--include-macro DICS_FLAG_GLOBAL ^
71-
--include-macro DIREG_DEV ^
72-
windows_headers.h
73-
74-
call %JEXTRACT% --source --output ../../src/main/java ^
75-
-D _AMD64_ -D _M_AMD64=100 -D UNICODE -D _UNICODE ^
76-
--header-class-name StdLib ^
77-
--target-package net.codecrete.usb.windows.gen.stdlib ^
78-
--include-function wcslen ^
55+
--include-struct _DEVPROPKEY ^
56+
--include-typedef DEVPROPKEY ^
57+
--include-constant DIGCF_PRESENT ^
58+
--include-constant DIGCF_DEVICEINTERFACE ^
59+
--include-constant DEVPROP_TYPE_UINT32 ^
60+
--include-constant DEVPROP_TYPE_STRING ^
61+
--include-constant DEVPROP_TYPEMOD_LIST ^
62+
--include-constant DICS_FLAG_GLOBAL ^
63+
--include-constant DIREG_DEV ^
7964
windows_headers.h
8065

8166
call %JEXTRACT% --source --output ../../src/main/java ^
@@ -84,8 +69,8 @@ call %JEXTRACT% --source --output ../../src/main/java ^
8469
-I "%SDK_DIR%\shared" ^
8570
--header-class-name USBIoctl ^
8671
--target-package net.codecrete.usb.windows.gen.usbioctl ^
87-
--include-macro IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX ^
88-
--include-macro IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION ^
72+
--include-constant IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX ^
73+
--include-constant IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION ^
8974
windows_headers.h
9075

9176
call %JEXTRACT% --source --output ../../src/main/java ^
@@ -95,17 +80,13 @@ call %JEXTRACT% --source --output ../../src/main/java ^
9580
-l User32 ^
9681
--header-class-name User32 ^
9782
--target-package net.codecrete.usb.windows.gen.user32 ^
98-
--include-function RegisterClassExW ^
99-
--include-function CreateWindowExW ^
100-
--include-function RegisterDeviceNotificationW ^
101-
--include-function GetMessageW ^
10283
--include-function DefWindowProcW ^
103-
--include-macro DEVICE_NOTIFY_WINDOW_HANDLE ^
104-
--include-macro HWND_MESSAGE ^
105-
--include-macro WM_DEVICECHANGE ^
106-
--include-macro DBT_DEVICEARRIVAL ^
107-
--include-macro DBT_DEVICEREMOVECOMPLETE ^
108-
--include-macro DBT_DEVTYP_DEVICEINTERFACE ^
84+
--include-constant DEVICE_NOTIFY_WINDOW_HANDLE ^
85+
--include-constant HWND_MESSAGE ^
86+
--include-constant WM_DEVICECHANGE ^
87+
--include-constant DBT_DEVICEARRIVAL ^
88+
--include-constant DBT_DEVICEREMOVECOMPLETE ^
89+
--include-constant DBT_DEVTYP_DEVICEINTERFACE ^
10990
--include-struct tagMSG ^
11091
--include-typedef MSG ^
11192
--include-struct tagWNDCLASSEXW ^
@@ -123,17 +104,9 @@ call %JEXTRACT% --source --output ../../src/main/java ^
123104
-l Winusb ^
124105
--header-class-name WinUSB ^
125106
--target-package net.codecrete.usb.windows.gen.winusb ^
126-
--include-function WinUsb_Initialize ^
127107
--include-function WinUsb_Free ^
128-
--include-function WinUsb_GetDescriptor ^
129-
--include-function WinUsb_ControlTransfer ^
130-
--include-function WinUsb_WritePipe ^
131-
--include-function WinUsb_ReadPipe ^
132-
--include-function WinUsb_GetAssociatedInterface ^
133-
--include-function WinUsb_SetPipePolicy ^
134-
--include-function WinUsb_SetCurrentAlternateSetting ^
135-
--include-function WinUsb_ResetPipe ^
136-
--include-macro PIPE_TRANSFER_TIMEOUT ^
108+
--include-constant PIPE_TRANSFER_TIMEOUT ^
109+
--include-constant RAW_IO ^
137110
windows_headers.h
138111

139112
call %JEXTRACT% --source --output ../../src/main/java ^
@@ -145,8 +118,7 @@ call %JEXTRACT% --source --output ../../src/main/java ^
145118
--target-package net.codecrete.usb.windows.gen.advapi32 ^
146119
--include-function RegQueryValueExW ^
147120
--include-function RegCloseKey ^
148-
--include-macro REG_MULTI_SZ ^
149-
--include-macro KEY_READ ^
121+
--include-constant KEY_READ ^
150122
windows_headers.h
151123

152124
call %JEXTRACT% --source --output ../../src/main/java ^
@@ -158,3 +130,12 @@ call %JEXTRACT% --source --output ../../src/main/java ^
158130
--target-package net.codecrete.usb.windows.gen.ole32 ^
159131
--include-function CLSIDFromString ^
160132
windows_headers.h
133+
134+
call %JEXTRACT% --source --output ../../src/main/java ^
135+
-D _AMD64_ -D _M_AMD64=100 -D UNICODE -D _UNICODE ^
136+
-I "%SDK_DIR%\um" ^
137+
-I "%SDK_DIR%\shared" ^
138+
--header-class-name NtDll ^
139+
--target-package net.codecrete.usb.windows.gen.ntdll ^
140+
--include-constant STATUS_UNSUCCESSFUL ^
141+
windows_headers.h
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include <windows.h>
22
#include <setupapi.h>
3-
#include <string.h>
43
#include <usbioctl.h>
54
#include <winusb.h>
65
#include <dbt.h>
6+
#include <ntstatus.h>

0 commit comments

Comments
 (0)