我在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删除文件。