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