退出JNI中的本机代码会导致Java应用程序死亡

时间:2012-12-26 09:30:49

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

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

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

任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

//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;
   }
}

答案 2 :(得分:0)

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