Перезагрузка библиотеки 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 ответ

Решение

Это похоже на ошибку, я не нашел решения, кроме как просто перезапустить сервис. В любом случае, лучше всего перезапустить обновление библиотеки.

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