当前位置: 首页 > 知识库问答 >
问题:

停止调用JNI函数的Java线程

彭允晨
2023-03-14
new Thread(new Runnable() {
    @Override
    public void run() {
         // My jni function call, It calls my JNI layer C function.
         }
   }

因此,有人知道如何杀死一个线程,同时它调用任何JNI函数而不使用while循环。

共有1个答案

张勇
2023-03-14

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

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

thread.interrupt()对您没有帮助,因为“调用本机函数”不属于Javadoc中指定的任何可中断操作。Java线程将继续运行,只设置中断状态。

 类似资料:
  • 问题内容: 我正在使用此处接受的答案中的方法来构造一个gameloop线程。 AndroidService类中的哪里停止/销毁线程? 此刻,我的线程基本上获取了时间,进行了一个本机功能调用,以更新游戏逻辑,然后在调整的经过时间之前进入睡眠状态。 令我好奇的是,由于我对Threads仍然不太满意,因此用interrupt()杀死Thread有多快?如果它在本机函数中运行的代码的中间,它将停止在其中,

  • 问题内容: 我正在编写一段连接到服务器的代码,使用该连接会生成一堆线程并执行一堆“工作”。 在某些情况下,连接失败,我需要停止所有操作并从头开始创建新对象。 我想在对象之后进行清理,但在线程上调用thread.stop,但是此方法似乎已被弃用。 推荐的替代方法是什么?是否应该为每个线程编写自己的清理和退出方法?将线程设置为null?或者是其他东西? 问题答案: 看这里 : 在HowToStopAT

  • 问题内容: 我真的很难弄清楚如何使用JNI从Objective-C调用Java函数。 我首先要说的是,我对Java并不了解很多,但是对Obj- C非常熟悉。我有一个带有单个方法的Java类,需要从我的应用程序包中调用它。该jar位于包中的Resources文件夹内,并且我将其设置为,它被检查并包含2个jar文件的名称(主要是一个,一个依赖)。 我正在通过调用来启动虚拟机,然后尝试使用该类来查找类,

  • 问题内容: 我们的游戏引擎本身可以在android上本地运行。我们需要从调用某些Java函数通过的。 为了进行调用,我们从此处(GitHub)使用JNIHelper.h / cpp: JniHelper.h,JniHelper.cpp 例如,此C ++代码: 理想情况下,我们希望所有这些调用都发生在上,并在函数调用完成后将an 作为参数传递给参数,并再次使用返回值进行调用。 调用函数的理想方法:

  • 问题内容: 我有一个按钮“ addCashier”,它正在创建一个名为“ Cashier”的线程,现在该线程只是每4秒简单地生成一个订单,该线程的run()方法中有while(true)循环。那里一切都很好,但是现在我想添加一个按钮来模拟收银员注销。我在我的while循环onDuty和一个公共函数logOff()中添加了一个布尔变量,该函数将onDuty布尔值设置为false,以使我退出运行的wh

  • 问题内容: 如果我有这样的Java代码: 并在调试中运行它,我可以看到所有这些线程(在取消之后)仍在运行,所以它们也占用了我的内存吗?如果是的话,我怎么能完全销毁那些线程? 问题答案: 调用您的线程,仅此而已。因此,您需要在您的方法中正确处理它。对于您的简单情况,您的线程将完成其执行,并且它们的对象将由GC清除。