3

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

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

任何帮助将不胜感激。

4

3 回答 3

8

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

杀死以本机代码执行的线程可能会泄漏资源,因此不受支持。在这里查看更多详细信息。

于 2012-12-26T09:40:29.640 回答
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;
   }
}
于 2012-12-26T09:44:55.313 回答
0

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

于 2012-12-27T04:45:09.583 回答