簡體   English   中英

在java中可靠地卸載dll

[英]Reliabily unload dll in java

我想在java中卸載一個DLL。 我已經讀過這個這個,但似乎你不能保證dll實際上會在某個時間卸載。 這是因為System.gc()只是“請求”垃圾收集器運行。

所以這是對局勢的打破。 我有一個通過JNI提供一些功能的DLL。 讓我們稱之為dll MainDll。 MainDll從調用System.load(“MainDll”)加載。 我需要能夠在運行中卸載並加載此dll。

是否可以創建另一個dll,其唯一目的是加載和卸載MainDll。 讓我們稱之為dll LoaderDll。 然后我可以簡單地調用System.load(“LoaderDll”)並使用一些本機函數來加載和卸載MainDll。 這樣做的原因是,我可以訪問本機系統上可以動態加載和卸載dll的函數。 這個棘手的部分是,如果從LoaderDll內部加載,我是否仍然可以訪問我在MainDll中編寫的本機函數。

對不起,如果這是一個令人困惑的問題。 似乎有點難以解釋。

謝謝

創建一個執行加載/卸載的包裝器DLL。 DLL中還有包裝器方法,可以轉向並將調用委托給加載的MainDll DLL。 這樣,您的Java JNI代碼只知道單個DLL。 它仍然可以請求卸載[LoaderDll :: unload()],它在內部卸載MainDll。

只要當MainDll當前未加載時調用它們時,LoaderDll中的方法/函數可以觸發MainDll的加載,這應該有效,假設這是所需的行為,而不是拋出異常/錯誤。

這樣做的一個問題是LoaderDll將始終被加載。

添加間接級別。

在LoaderDLL中使您的本機方法調用轉發例程。 轉發例程可以使用C工具將調用轉發到mainDLL中的代碼。

我還沒有遇到過System.gc()沒有觸發垃圾收集器的情況,盡管它只是一個提示。 本教程實際上幫助我完成了我的工作: 卸載Java JNI DLL

如果您需要動態加載和卸載代碼,請考慮OSGi。 這至少在felix中起作用。

在Oracle / Sun的JDK中,System.gc()將觸發一個完整的gc(除非它已在命令行中關閉)。 它可能只是對其他JVM的暗示。

根據您的澄清評論,我認為最簡單的方法是生成一個新的JVM,它的唯一責任是管理您的DLL。 可能會暴露RMI接口來訪問這些類(盡管簡單的流可能就足夠了)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM