Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
停止调用JNI函数的Java线程_Java_Android_Multithreading_Java Native Interface_Native - Fatal编程技术网

停止调用JNI函数的Java线程

停止调用JNI函数的Java线程,java,android,multithreading,java-native-interface,native,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. } } 现在,当这

在这里,我想停止我的线程或终止我在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循环,所以我也不能使用一些全局标志变量进行检查


那么,有没有人知道如何在线程调用任何JNI函数时杀死线程而不使用while循环。

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


只需使用
Thread.Stop()或Thread.Inturrupt()
最好不要突然终止线程。C函数分配的资源可能无法释放


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

如果线程正在执行本机代码,则无法安全地中断线程。即使您的线程有一个事件循环,您也需要等待它完成本机调用。对代码一无所知,我猜您有一个长时间运行的本机调用,您不希望它阻塞主线程,所以您为该调用创建了一个单独的线程。您无法安全地中断单个本机呼叫。这里没有银弹。在任何情况下,您都需要更改代码,我的建议是:

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

不会帮助您,因为“调用本机函数”不属于Javadoc中指定的任何可中断操作。java线程将继续运行,只有它的中断状态才会被设置。

你有没有考虑线程?它总是让我觉得它不是IntruptPlease看看你可以通过调用你需要的函数来停止/销毁或插入线程want@Mr.Me是的,我知道这一切,但在这里我的线程调用jni函数,所以如何从java层停止这个jni工作。可能的重复请看这个教程,你不能使用thread.stop()因为它已被弃用,并且您不能使用Thread.interrupt(),因为它对JNI代码没有任何影响。JVM的I/O代码使用Thread.interrupt()感知JNI代码,而不仅仅是“JNI代码”。我不知道“扔JNI”是什么意思。您的参考是非规范性和非权威性的。不是答案。据我所知,本机代码最终将在JVM提供午餐的同一线程中运行,因此对该线程执行任何操作都将影响其中使用的JNI代码。这个问题没有问内存分配问题,所以我在回答时没有考虑。question@Mr.Me在我的例子中,中断也不起作用,因为应该有一个while循环来检查inturrupted中的continues线程状态?在我的情况下,如何检查,没有while循环你不需要while循环来处理中断代码。中断将引发IntruptException,如果该异常未被处理,您的线程将被杀死感谢您的回答,但它的回答很晚,我已经使用您的第二种方法实现了线程中断,顺便提一下,这是一个很好的建议。到目前为止,在其他答案中,你的答案是非常好的。如果你觉得它“非常好”,请投票表决,这样它对未来的智慧寻求者来说更加明显和相关。我来自未来,可以证实:智慧是被寻求的。