我正在使用jni專有的dll,無論如何,我需要在關閉時手動釋放資源。 我試過使用shutdownhooks,但如果我不打電話給我的方法來釋放這些資源,這些資源通過netbeans或每個taskmanager來殺死java,那麼java.exe將保持活着狀態。 我甚至不能用taskmanager殺死它(訪問被拒絕)。 是否有另一種安全的方法來確保在processkill或其他不安全退出之後調用免費資源方法?無法關閉java.exe,JNI調用
編輯:
感謝您的第一個答案,但它並沒有解決我的問題。如果我在睡眠呼叫期間殺死程序,它不會正常關機。但是,如果我等待這5秒鐘,它正在關閉。
我認爲調用「AdsCallDllFunction.adsPortOpen()」正在註冊一些用於清理的內容,並且如果進程被終止,java.exe會保留大約5到10分鐘直到jvm死亡。
import de.beckhoff.jni.tcads.AdsCallDllFunction;
import de.beckhoff.jni.tcads.AdsVersion;
/**
*
* @author Christian
*/
public class KillTest {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
long port = 0;
if (port == 0) {
AdsVersion lAdsVersion = null;
port = AdsCallDllFunction.adsPortOpen();
}
System.out.println("runs through this");
/**
* If i call the following function, it can exit.
**/
//AdsCallDllFunction.adsPortClose();
try {
/**
* If i kill the program during this sleep call, it wont exit for a timespan of 5-10 minutes
*/
Thread.sleep(5000);
} catch (InterruptedException ex) {
}
System.exit(0);
}
}
編輯2:
http://i.stack.imgur.com/4Vh71.png
對於自己的研究,你可以在http://www.beckhoff.com/下載的TwinCAT 3。 DLL和jar文件在C:\ TwinCAT \ AdsApi \ AdsToJava中提供。
我認爲dll會嘗試與twincat 3安裝程序上安裝的twincat 3驅動程序進行通信。 但是,如果你試圖通過taskmanager在5秒鐘的睡眠時間內殺死java,程序就會卡住。
不清楚你在問什麼(對我來說)。如果*你*啓動Java程序,*你*應該被允許通過任務管理器殺死它。爲什麼你會得到「拒絕訪問」?這些*資源是什麼*你想*免費*。當一個Windows進程最終結束時,與它關聯的所有系統資源應該被自動釋放。 – manuell
正如我打電話adsPortOpen,我不能殺死虛擬機。我不知道爲什麼我會「拒絕訪問」。提供的DLL原樣,沒有開源。那麼我認爲通過調用adsPortOpen來分配資源。我不知道它需要什麼資源。我以管理員身份登錄。通常你可以殺死大部分程序。但是,因爲我使用dll函數,我不允許殺死進程。 – user3306660
您應該在http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx上使用Process Explorer。該DLL可能會對其加載過程進行一些更改,並且您可能會看到使用PE。 – manuell