2014-02-13 12 views
1

我正在使用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,程序就會卡住。

+0

不清楚你在問什麼(對我來說)。如果*你*啓動Java程序,*你*應該被允許通過任務管理器殺死它。爲什麼你會得到「拒絕訪問」?這些*資源是什麼*你想*免費*。當一個Windows進程最終結束時,與它關聯的所有系統資源應該被自動釋放。 – manuell

+0

正如我打電話adsPortOpen,我不能殺死虛擬機。我不知道爲什麼我會「拒絕訪問」。提供的DLL原樣,沒有開源。那麼我認爲通過調用adsPortOpen來分配資源。我不知道它需要什麼資源。我以管理員身份登錄。通常你可以殺死大部分程序。但是,因爲我使用dll函數,我不允許殺死進程。 – user3306660

+0

您應該在http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx上使用Process Explorer。該DLL可能會對其加載過程進行一些更改,並且您可能會看到使用PE。 – manuell

回答