从Java线程调用C函数后,整个Java应用程序变得无响应

时间:2017-10-13 16:28:56

标签: java android-ndk

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

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()函数:

BaresipThread thread;
thread = new BaresipThread();
thread.start();

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

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

2 个答案:

答案 0 :(得分:1)

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

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

此外,如果本机方法baresipStart()确实从不返回,那么您就遇到了问题。您的应用程序在有任何活动线程时无法终止。假设您打算让baresipStop()导致线程完成,那么当调用baresipStart()终止执行时,应安排baresipStop()返回(或抛出未经检查的异常)。但请注意,这些本机方法需要是线程安全的,因为它们将由不同的Java线程调用。

答案 1 :(得分:0)

感谢您的解释。我通过完全删除BaresipThread对象并用以下内容替换上面的三行来启动新的baresip线程:

new Thread(new Runnable() {
    public void run() {
        baresipStart();
    }
}).start();

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