整个Java应用程序成为从Java线程的C函数调用

问题描述:

我已经定义了这样的Android的Java类,其中本地函数baresipStart()永远不会终止后反应迟钝:整个Java应用程序成为从Java线程的C函数调用

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()函数在后台运行而不停止所有其他活动?

Thread.start()负责实际创建新的执行线程并将其设置为正在运行。通过重写它,就会导致它在调用start()的线程中运行baresipStart(),

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

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

感谢您的解释。我通过去除BaresipThread对象共和与此替换上面的三条线开始新baresip螺纹:

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

用户可以停止通过其用户界面得到的处理之后,应用程序被终止。