PjSIP从未知/外部线程调用它

时间:2017-03-30 09:11:01

标签: android pjsip

我试图通过在Android中构建一个cordova插件来构建pjsip并拨打一个基本电话。以下函数位于名为

的cordova插件中
  

公共类PJSIP扩展了CordovaPlugin {....}

  private void makeCall(String number,String hostip ) {

String buddy_uri = "sip:"+number+"@"+hostip;
MyAccount account = null;


AccountConfig accCfg = null;
accCfg = new AccountConfig();
accCfg.setIdUri("sip:localhost");
accCfg.getNatConfig().setIceEnabled(true);
accCfg.getVideoConfig().setAutoTransmitOutgoing(true);
accCfg.getVideoConfig().setAutoShowIncoming(true);

MyAccount acc = new MyAccount(accCfg);
account = acc;


MyCall call = new MyCall(account, -1);
CallOpParam prm = new CallOpParam(true);

try {
  call.makeCall(buddy_uri, prm);

} catch (Exception e) {
  call.delete();
  return;
}

currentCall = call;

}

我收到的错误如下:

  

A / libc:../ src / pj / os_core_unix.c:692:pj_thread_this:断言   "!"从未知/外部线程调用pjlib。你必须" "注册   外部线程与pj_thread_register()" "在调用任何pjlib之前   功能""失败

我正在检查周围,似乎垃圾收集器存在问题,但我不确定如何修复它。

由于

1 个答案:

答案 0 :(得分:3)

在pjsip中,每个调用都必须来自pjsip已知的线程。

EndPoint对象上有一种方法可以帮助您。 基本上,我刚刚创建了一个静态方法checkThread,它可以帮助我注册currentThread

我在访问pjsip对象的每个方法的开头调用此方法。 您需要同步此方法。

public static synchronized void checkThread() {
    try {

        if (mEndpoint != null && !mEndpoint.libIsThreadRegistered())
            mEndpoint.libRegisterThread(Thread.currentThread().getName());

    } catch (Exception e) {
        Log.w("SIP", "Threading: libRegisterThread failed: " + e.getMessage());
    }
}

现在,访问sip对象的每个方法都必须如下所示:

public void makeCall(String number) {
    checkThread();
    //...do your stuff...
}

希望这有帮助,干杯。