首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Java线程调用C函数后,整个Java应用程序都变得没有响应

从Java线程调用C函数后,整个Java应用程序都变得没有响应
EN

Stack Overflow用户
提问于 2017-10-14 00:28:56
回答 2查看 84关注 0票数 0

我定义了这种Android Java类,其中本机函数baresipStart()永远不会结束:

代码语言:javascript
复制
package com.tutpro.baresip;

public class BaresipThread extends Thread {

    public void start() {
        baresipStart();
    }

    public void kill() {
        baresipStop();
    }

    public native void baresipStart();
    public native void baresipStop();

}

然后我从另一个Java类调用它的start()函数:

代码语言:javascript
复制
BaresipThread thread;
thread = new BaresipThread();
thread.start();

结果是baresipStart()函数开始正常运行,但应用程序的其余部分完全没有响应。

为什么会这样?如何修复代码,使baresipStart()函数在后台运行,而不会停止所有其他活动?

EN

回答 2

Stack Overflow用户

发布于 2017-10-14 00:46:16

Thread.start()负责实际创建新的执行线程并将其设置为运行。通过像您所做的那样覆盖它,您可以使它在调用start()的线程中运行baresipStart()

您应该覆盖run(),而不是覆盖start()。此方法定义了要在新的执行线程中执行的工作。

此外,如果本机方法baresipStart()确实永远不会返回,那么您就有问题了。当您的应用程序有任何活动线程时,它不能终止。假设您打算让baresipStop()使线程结束,那么您应该安排baresipStart()在调用baresipStop()终止执行时返回(或抛出未检查的异常)。但是,一定要知道,这些本机方法需要是线程安全的,因为它们将被不同的Java线程强制调用。

票数 1
EN

Stack Overflow用户

发布于 2017-10-15 19:17:32

谢谢你的解释。我通过完全删除BaresipThread对象并用下面的代码替换上面的三行代码来启动新的object SIP线程:

代码语言:javascript
复制
new Thread(new Runnable() {
    public void run() {
        baresipStart();
    }
}).start();

用户可以通过其用户界面停止生成的进程,然后终止应用程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46734275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档