无法关闭java.exe,JNI调用

时间:2014-02-13 15:29:23

标签: java java-native-interface kill denied

我使用jni使用专有的dll,无论如何我需要在关机时手动释放资源。 我尝试使用shutdownhooks,但如果我不调用我的方法来释放这些资源,这些资源通过netbeans或每个taskmanager杀死java时发生,java.exe仍然存活。 我甚至无法用taskmanager杀死它(访问被拒绝)。 是否有另一种安全方法可以确保在processkill或其他不安全退出后调用免费资源方法?

编辑:

感谢您的第一个答案,但它并没有解决我的问题。如果我在睡眠呼叫期间杀死程序,它将无法正常关闭。但如果我等了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驱动程序进行通信。 但是如果你试图通过任务管理器在5秒休眠时间内杀死java,程序就会卡住。

1 个答案:

答案 0 :(得分:0)

从Java 7开始,您可以使用try-with-resources语句,以确保在语句结束时关闭需要最终关闭的每个已使用(已打开)资源。有关更多信息,请查看此处: http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html