停止调用JNI函数的Java线程

时间:2013-02-07 09:24:36

标签: java android multithreading java-native-interface native

这里我想停止我的线程或者杀死在Java层上创建的线程,这个线程正在调用JNI函数。有时根据我的应用程序要求,我必须在某些条件下停止此 JNI函数执行,否则不会。

new Thread(new Runnable() {
    @Override
    public void run() {
         // My jni function call, It calls my JNI layer C function.
         }
   }

现在当这个线程执行开始并且它在JNI级别上工作时我不担心,但是在某些情况下从其他类或方法我想停止这个JNI工作,所以如何阻止这个线程。

注意:这里我的线程也没有while循环所以我也无法检查一些全局标志变量。

所以有人知道如何在没有while循环的情况下调用任何JNI函数时杀死一个线程。

3 个答案:

答案 0 :(得分:11)

如果线程正在执行本机代码,则无法安全中断线程。即使您的线程有一个事件循环,您也需要等到它完成本机调用。什么都不知道你的代码,我猜你有一个长期运行的本机调用,你不希望它阻塞主线程,所以你为该调用创建了一个单独的线程。您无法安全中断单个本机通话。这里没有银弹。无论如何,您需要更改代码,我的建议是:

  • 将您的单个长本机调用分解为一系列短调用并在Java端运行事件循环
  • 在本机端内部分解本机调用,并在本机端运行事件循环。您的本机界面将需要另一种方法来设置中断标志。

Thread.interrupt()不会帮助你,因为"调用原生函数"不属于Javadoc中指定的任何可中断操作。 Java线程将继续运行,只有中断状态才会被设置

答案 1 :(得分:2)

最好不要突然杀死一个线程。可能无法释放C函数分配的资源。

如果C函数正在等待某事,您可以触发条件返回并检查错误代码。

答案 2 :(得分:-3)

本机代码“通过JNI调用”或纯Java没有什么特别之处,所有IO代码都使用JNI代码,您可以使用普通的Java Thread方法停止它。

只需使用Thread.Stop() or Thread.Inturrupt()