Jna, выгрузить Dll из Java-класса динамически
Я немного погуглил, но я не могу найти способ выгрузить dll, используя JNA, из класса Java. И так как я использую dll для передачи данных с usb-устройства, используя эту dll, я должен выгрузить свою dll из класса java, чтобы повторно использовать мое usb-устройство с тем же классом, не закрывая всю мою программу. вот как я загружаю свою DLL, используя JNA
public interface UsbSensor extends Library {
UsbSensor INSTANCE = (UsbSensor) Native.loadLibrary(
(Platform.isWindows() ? "D:\\UsbDevice.dll" : "D:\\UsbDevice.dll"), UsbSensor.class);
int SearchDevices();
Pointer Startacquisition(String type);
}
и по
UsbSensor sdll = UsbSensor.INSTANCE;
Dll загружен. А вот как я использую свою функцию
sdll.SearchDevices();
sdll.Startacquisition();
И теперь, после использования этих функций, я должен выгрузить мою DLL снова загрузить DLL, используя приведенный выше код. Порядок повторного использования этих функций.
Так как же динамически выгружать dll с помощью JNA?
3 ответа
NativeLibrary.dispose() должен делать то, что вы ищете. NativeLibrary - это представление 1:1 нативной библиотеки, которую вы используете (и она все равно используется внутри Native.loadLibrary ()). Так
- пустая ссылка, возвращаемая Native.loadLibrary () и
- вызовите NativeLibrary.dispose()
У меня была та же проблема, но использование Native.dispose() не помогло. Решением моей проблемы был этот вопрос и ответ. Он в основном устанавливает значение NULL для собственной библиотеки и вызывает сборщик мусора.
Вы можете создать временный загрузчик классов, использовать встроенные функции, обнулить ссылку на загрузчик классов, и он будет иметь право на GC вместе с загруженными классами / библиотеками.