4 ms·
This wouldn't work on Windows, because you can't delete a DLL while it's in use
by sedro 2y ago
This wouldn't work on Windows, because you can't delete a DLL while it's in use
- BenjiWiebe 2y agoCouldn't you: Extract DLL Load DLL Unload DLL Delete DLL ? Though in the example given, I do see your point now. You'd have to make sure the DLL was unloaded before the delete-on-exit happened.
- tadfisher 2y agoYou can install a shutdown hook to do cleanup like this. Runtime.getRuntime().addShutdownHook(...)
- sedro 2y agoThat's how java.io.File#deleteOnExit works under the hood. The DLL is still loaded at that point and can't be deleted.
- tadfisher 2y agoAh, looking through the docs [1]; you have to use your own ClassLoader (so it can be garbage-collected), and statically-link with a JNI library which is unloaded when the ClassLoader is garbage-collected. 1: https://docs.oracle.com/en/java/javase/22/docs/specs/jni/invocation.html#library-and-version-management https://docs.oracle.com/en/java/javase/22/docs/specs/jni/inv...
- sedro 2y agoAccording to JNA it's not safe to unload the DLL: https://github.com/java-native-access/jna/blob/40f0a1249b5ad03020b5a2b66f42b9546e6d4edf/src/com/sun/jna/Native.java#L283-L293 https://github.com/java-native-access/jna/blob/40f0a1249b5ad... Do NOT force the class loader to unload the native library, since that introduces issues with cleaning up any extant JNA bits (e.g. Memory) which may still need use of the library before shutdown. Following the blame back to 2011, they did unload DLLs before https://github.com/java-native-access/jna/commit/71de662675bdfb9a3072be910ac052f9c262bab6 https://github.com/java-native-access/jna/commit/71de662675b... Remove any automatically unpacked native library. Forcing the class loader to unload it first is only required on Windows, since the temporary native library is still "in use" and can't be deleted until the native library is removed from its class loader. Any deferred execution we might install at this point would prevent the Native class and its class loader from being GC'd, so we instead force the native library unload just a little bit prematurely. Users reported occasional access violation errors during shutdown.
- electrum 2y agoYou might be able to use FILE_FLAG_DELETE_ON_CLOSE, but this would likely require calling the Windows API functions directly.
- zten 2y agoHmm, interesting. They do have DLLs in the JAR...