从JNI中退出的本机代码杀死Java应用程序



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

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

任何帮助都会感谢。

jni本机代码和JVM在同一过程中运行。由于exit关闭了该过程,因此它也将结束JVM。

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

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

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

我所做的就是在需要时从主线程中运行加密代码,并用terminateThread()终止新创建的线程,但问题是terminateThread()未及时发布资源(文件处理等),也无法在线程关闭后立即从Java删除文件。

相关内容

最新更新