Надежно выгрузить dll в java - PullRequest
3 голосов
/ 30 ноября 2010

Я пытаюсь разгрузить DLL в Java. Я прочитал это и это , но кажется, что вы не можете гарантировать, что DLL будет действительно выгружен в определенное время. Это потому, что System.gc () просто «просит» запустить сборщик мусора.

Итак, вот ситуация. У меня есть DLL, которая обеспечивает некоторые функции через JNI. Позволяет называть это DLL MainDll. MainDll загружается из вызова System.load («MainDll»). Мне нужно иметь возможность выгрузить и загрузить эту DLL на лету.

Можно ли создать еще одну DLL, единственная цель которой - загрузить и выгрузить MainDll. Позволяет называть это DLL LoaderDll. Затем я мог бы просто вызвать System.load («LoaderDll») и получить некоторые встроенные функции для загрузки и выгрузки MainDll. Причина для этого, у меня есть доступ к функциям на родной системе, которые могут загружать и выгружать DLL на лету. Сложность в том, что я по-прежнему смогу получить доступ к собственным функциям, которые я написал в MainDll, если он загружен из LoaderDll.

Извините, если это запутанный вопрос. Кажется, это немного сложно объяснить.

Спасибо

Ответы [ 5 ]

2 голосов
/ 30 ноября 2010

Создать DLL-оболочку, которая выполняет загрузку / выгрузку. Также в DLL есть методы-оболочки, которые поворачиваются и делегируют вызовы загруженной DLL MainDll. Таким образом, ваш код Java JNI знает только об одной DLL. Он все еще может запросить unload [LoaderDll :: unload ()], который внутренне выгружает MainDll.

Это должно работать до тех пор, пока методы / функции в LoaderDll могут инициировать загрузку MainDll, когда они вызываются, когда MainDll в данный момент не загружен, предполагая, что это желаемое поведение вместо выдачи исключения / ошибки.

Одной из проблем этого является то, что LoaderDll всегда будет загружаться.

1 голос
/ 30 ноября 2010

Добавьте уровень косвенности.

Сделайте ваши собственные методы переадресации вызовов в LoaderDLL.Процедуры пересылки могут использовать средства C для переадресации вызовов на код в mainDLL.

0 голосов
/ 17 сентября 2013

Я еще не сталкивался с ситуацией, когда System.gc () не запускал сборщик мусора, хотя это всего лишь подсказка.Этот урок фактически помог мне выполнить мою работу: Выгрузить Java JNI DLL

0 голосов
/ 30 ноября 2010

Исходя из ваших уточняющих комментариев, я думаю, что самым простым подходом было бы создание новой JVM, единственной ответственностью которой является управление вашей DLL.Вероятно, предоставляя интерфейсу RMI доступ к этим классам (хотя простого потока может быть достаточно).

0 голосов
/ 30 ноября 2010

Если вам нужно динамически загружать и выгружать код, рассматривали ли вы OSGi. Это работает в Феликсе по крайней мере.

В Oracle / Sun JDK System.gc () будет запускать полный gc (если он не был отключен в командной строке). Это может быть просто подсказка для других JVM.

...