我正在从 JNI 调用我的本机 dll 的方法。它工作正常,但在我的本机代码的一个地方,我正在调用 exit(1) 以便本机代码停止工作,但发生的情况是它也会导致退出我的 java 应用程序。我错过了什么吗?JNI 中有什么方法可以让我只能杀死本机代码而不是整个 Java 应用程序?
编辑:基本上我正在用本机代码加密文件。当有人从java中取消操作时,我希望它停止加密。
任何帮助将不胜感激。
我正在从 JNI 调用我的本机 dll 的方法。它工作正常,但在我的本机代码的一个地方,我正在调用 exit(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 中删除文件。