Перезагрузка библиотеки JNA под Win32
У меня есть интересная проблема JNA здесь.
В JRE 1.6 и 1.7 x64 я могу загрузить и выгрузить библиотеку, например:
this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);
this.Lib.Initialize();
this.Lib = null;
Runtime.getRuntime().gc();
this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);
this.Lib.Initialize();
Это загрузит его, запустит процедуру инициализации, установит для класса значение null и заставит GC очистить его, что выгрузит библиотеку (к моему недоразумению, если я делаю это неправильно, исправьте меня!), А также перезагрузите и повторно инициализируйте Это. Отлично работает на x64.
Однако на x86 этот код не сможет загрузить второй Initialize() (который в этом примере действительно просто возвращает библиотеку C), он просто зависнет, ничего не делая, я могу делать с этими библиотеками все остальное, кроме перезагрузки.
Я что-то упустил или наткнулся на то, о чем нужно сообщить команде разработчиков JNA?
Редактировать:
У меня есть способ справиться с этим (в основном перезапустить Java-приложение при замене библиотеки, что не имеет большого значения), но я все еще хочу знать, является ли это ошибкой или нет.
Изменить 2:
Написал контрольный пример на случай, если я должен был представить это:
public class EntryPoint {
public static void main(String[] args) {
String path = new File("").getAbsolutePath();
System.out.println("Path: " + path);
ITest it = (ITest)Native.loadLibrary(path + "\\jnaFailureC_x86.dll", ITest.class);
System.out.println("Expecting 'Test', result: '" + it.myMethod().getString(0) + "'");
WeakReference<ITest> itRef = new WeakReference<ITest>(it);
it = null;
Runtime.getRuntime().gc();
if(itRef.get() != null){
System.out.println("Not collected.");
}else{
System.out.println("Collected");
}
it = (ITest)Native.loadLibrary(path + "\\jnaFailureC_x86.dll", ITest.class);
System.out.println("Expecting 'Test', result: '" + it.myMethod().getString(0) + "'");
}
}
Path: G:\Source\jnaFailure
Expecting 'Test', result: 'Test'
Collected
Expecting 'Test', result: 'Test'
Работает нормально, блин, я предполагаю, что, может быть, что-то еще ссылалось на это в моем производственном коде, и оно на самом деле не выпускалось, всегда проверяйте слабые ссылки!
1 ответ
Это похоже на ошибку, я не нашел решения, кроме как просто перезапустить сервис. В любом случае, лучше всего перезапустить обновление библиотеки.