【问题标题】:Exiting from Native code in JNI kills Java application在 JNI 中退出本机代码会杀死 Java 应用程序
【发布时间】:2012-12-26 09:30:49
【问题描述】:

我正在从 JNI 调用我的本机 dll 的方法。它工作正常,但在我的本机代码的一个地方,我正在调用 exit(1) 以便本机代码停止工作,但发生的情况是它也会导致退出我的 java 应用程序。我错过了什么吗? JNI中有什么方法可以让我只能杀死本机代码而不是整个java应用程序?

编辑:基本上我是在用本机代码加密文件。当有人从java中取消操作时,我希望它停止加密。

任何帮助将不胜感激。

【问题讨论】:

  • “本地代码停止”是什么意思?

标签: java windows dll java-native-interface native


【解决方案1】:

JNI 本机代码和 JVM 在同一个进程中运行。由于exit关闭了进程,它也会结束JVM。

杀死在本机代码中执行的线程可能会泄漏资源,因此不受支持。更多详情请关注here

【讨论】:

    【解决方案2】:

    如果在本机代码中的单独线程中,请停止。

    //sample thread code
    void thread(){
      while (1) {
        //do something
        if ( done ) return;
      }
    }
    

    如果您在本机函数中并且想要返回到 Java,只需返回即可。

    如果你做了一个错综复杂的函数调用和循环迷宫;都一样,需要出去, 然后抛出一个原生异常,在最后一个原生级别捕获它并返回。 不建议这样做,不建议这样做,但有时您可能会陷入这种混乱。

    // Do not write code like this
    // A kitten and a puppy die every time you call it
    void foo(){
      while (1){
         bar();
      }
    }
    
    void bar(){
      for( i=0; i < 100; i++){
        baz();
        quux();
      }
    }
    
    void baz(){
     // something
    }
    
    void quux(){
     // something
     if( want_to_exit) throw new GetOut();
    }
    
    void JNI_Method(.....){
       try {
         if (x) foo();
       } catch ( GetOut g){
          return;
       }
    }
    

    【讨论】:

    • 不确定stdc++的每个android实现是否都实现了异常机制...
    • @Geoffroy 问题被标记为 windows 而不是 android
    • 哎呀抱歉 :) 以前看到 jni 与 android 相关联 ;)
    【解决方案3】:

    我所做的是在单独的线程中运行加密代码,并在需要时从主线程使用 terminatethread() 终止新创建的线程,但问题是 terminatethread() 不会释放资源(文件句柄等)及时,我无法在线程关闭后立即从 java 中删除文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      相关资源
      最近更新 更多