2012-12-26 44 views
2

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

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

任何帮助将不胜感激。

+0

你是什么意思的“本机代码停止”? – Henry

回答

6

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

杀死一个在本地代码中执行的线程可能会泄漏资源,因此不受支持。查看here了解更多详情。

1

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

//sample thread code 
void thread(){ 
    while (1) { 
    //do something 
    if (done) return; 
    } 
} 

如果您在本机函数中并且想返回到Java,则返回。

如果你已经做出了功能调用和循环的纠结迷宫;所有这些都需要退出,然后抛出一个本地异常,在最后的本地级别捕获并返回。 这是不推荐它应该不推荐,但有时你可能会陷入这种混乱。

​​3210
+0

不知道是否每个android stdC++的实现都实现了异常mecanism ... – Geoffroy

+0

@Geoffroy问题被标记为windows不是android –

+0

ouch对不起:)用来查看与android相关的jni;) – Geoffroy

0

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

相关问题