简体   繁体   中英

Jna, Unload Dll from java class dynamically

I have googled bit , but dint find way to unload dll using JNA ,from java Class. And as i am using dll to transfer data from usb device using this dll, i have to unload my dll from java class in order to re-use my usb device with same class without closing my whole program. here is how i load my dll using 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);
}

and by

 UsbSensor sdll = UsbSensor.INSTANCE; 

Dll is loded. And here how i use my function

sdll.SearchDevices();
sdll.Startacquisition();

And now after using these function I must have to unload my dll in again load dll using above code. order reuse these function.

So how to unload dll dynamically Using JNA?

NativeLibrary.dispose() should do what you are looking for. NativeLibrary is a 1:1 representation of the native library you are using (and is used internally by Native.loadLibrary() anyway). So

  1. null the reference returned by Native.loadLibrary() and
  2. call NativeLibrary.dispose()

I had the same issue but using Native.dispose() did not help. The solution to my problem was this question and answer . It basically sets instance of the native library to null and calls the garbage collector.

你可以创建一个临时的类加载器,使用本机函数,null对类加载器的引用,它将与它加载的类/ dll一起符合GC的条件

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM