PjSIP 从 unknown/external 线程调用它
PjSIP Callling it from unknown/external thread
我正在尝试通过在 Android 中构建一个 cordova 插件来构建 pjsip 并进行基本的 phone 调用。以下函数位于名为
的 cordova 插件中
public class PJSIP extends 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: assertion
"!"Calling pjlib from unknown/external thread. You must " "register
external threads with pj_thread_register() " "before calling any pjlib
functions."" failed
我四处查看了一下,垃圾收集器似乎有问题,但我不确定如何解决它。
谢谢
在 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...
}
希望这对您有所帮助,干杯。
我正在尝试通过在 Android 中构建一个 cordova 插件来构建 pjsip 并进行基本的 phone 调用。以下函数位于名为
的 cordova 插件中public class PJSIP extends 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: assertion "!"Calling pjlib from unknown/external thread. You must " "register external threads with pj_thread_register() " "before calling any pjlib functions."" failed
我四处查看了一下,垃圾收集器似乎有问题,但我不确定如何解决它。
谢谢
在 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...
}
希望这对您有所帮助,干杯。