我已将 pjsua2 集成到我的 android 应用程序中。当我发送 SMS 时应用程序崩溃。它不会每次都崩溃,它是随机发生的。 (每 10 条消息一次)。
我的代码是:
public void sendInstantMessage(String number, String msgBody) {
String buddy_uri = "<sip:" + number + "@" + mPref.getString(PREF_SIPSERVER, "") + ">";
Log.e(TAG, "sendInstantMessage ==== "+buddy_uri);
BuddyConfig bCfg = new BuddyConfig();
bCfg.setUri(buddy_uri);
bCfg.setSubscribe(false);
MyBuddy im = new MyBuddy(bCfg);
SendInstantMessageParam prm = new SendInstantMessageParam();
prm.setContent(msgBody);
prm.setContentType("text/plain; charset=utf-8");
try {
im.create(account, bCfg);
boolean valid1 = im.isValid();
Log.e(TAG, "valid1 ======= "+valid1);
im.sendInstantMessage(prm);
} catch (Exception e) {
Log.e(TAG, "sendInstantMessage ==== "+e);
e.printStackTrace();
return;
}
}
根据 logcat,我必须调用 pj_thread_register()。但是我在端点中有一个方法 libRegisterThread(),所以我像下面这样使用它
MyApp.ep.libRegisterThread("SipApi");
这是日志:
../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
最佳答案
(对于那些想知道为什么它解决了问题的人)
为了澄清 Gangadhar 的解决方案,该问题是由垃圾收集器引起的。根据 PJSIP Docs :
There are two problems with Java garbage collector (gc):
- it delays the destruction of Java objects (including pjsua2 objects), causing the code in object's destructor to be executed out of order
- the gc operation may be run on different thread, not previously registered to PJLIB
解决方案是
application MUST immediately destroy pjsua2 objects using object's delete() method, instead of relying on the gc to clean up the object.
正如您在他的解决方案中所见,该解决方案调用了 MyBuddy 的删除方法:
try {
myBuddy.create(account, bCfg);
myBuddy.sendInstantMessage(prm);
myBuddy.delete();
} catch (Exception e) {
e.printStackTrace();
return;
}
关于android - 从未知/外部线程调用 pjlib。您必须使用 pj_thread_register() ""注册外部线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30914810/