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 ()). Так

  1. пустая ссылка, возвращаемая Native.loadLibrary () и
  2. вызовите NativeLibrary.dispose()

У меня была та же проблема, но использование Native.dispose() не помогло. Решением моей проблемы был этот вопрос и ответ. Он в основном устанавливает значение NULL для собственной библиотеки и вызывает сборщик мусора.

Вы можете создать временный загрузчик классов, использовать встроенные функции, обнулить ссылку на загрузчик классов, и он будет иметь право на GC вместе с загруженными классами / библиотеками.

Другие вопросы по тегам