diff --git a/src/main/c/src/LibUsb.c b/src/main/c/src/LibUsb.c index 92a407e..db00c84 100644 --- a/src/main/c/src/LibUsb.c +++ b/src/main/c/src/LibUsb.c @@ -25,6 +25,8 @@ static JavaVM *jvm; +static int defaultContextInitialized = 0; + /** * Version getVersion() */ @@ -46,7 +48,13 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, init) { if (!context) { - return libusb_init(NULL); + if (defaultContextInitialized) + { + return illegalState(env, "Default context already initialized"); + } + int result = libusb_init(NULL); + if (!result) defaultContextInitialized = 1; + return result; } else { @@ -67,8 +75,17 @@ JNIEXPORT void JNICALL METHOD_NAME(LibUsb, exit) { struct libusb_context *ctx = unwrapContext(env, context); if (!ctx && context) return; + + if (!context && !defaultContextInitialized) + { + illegalState(env, "Default context not initialized"); + return; + } libusb_exit(ctx); - resetContext(env, context); + if (context) + resetContext(env, context); + else + defaultContextInitialized = 0; } /** diff --git a/src/main/resources/de/ailis/usb4java/libusb/linux-x86_64/libusb4java.so b/src/main/resources/de/ailis/usb4java/libusb/linux-x86_64/libusb4java.so index 8f60525..d059aab 100644 Binary files a/src/main/resources/de/ailis/usb4java/libusb/linux-x86_64/libusb4java.so and b/src/main/resources/de/ailis/usb4java/libusb/linux-x86_64/libusb4java.so differ diff --git a/src/test/java/de/ailis/usb4java/libusb/LibUSBTest.java b/src/test/java/de/ailis/usb4java/libusb/LibUSBTest.java index 2a12b33..a19053c 100644 --- a/src/test/java/de/ailis/usb4java/libusb/LibUSBTest.java +++ b/src/test/java/de/ailis/usb4java/libusb/LibUSBTest.java @@ -176,8 +176,16 @@ public class LibUSBTest assertEquals(LibUsb.SUCCESS, LibUsb.init(null)); LibUsb.exit(null); - // Double-exit without a context should work - LibUsb.exit(null); + try + { + // Double-exit should throw exception + LibUsb.exit(null); + fail("Double-exit should throw IllegalStateException"); + } + catch (IllegalStateException e) + { + // Expected behavior + } } /**