我在我的android应用程序中集成了pjsua2.发送短信时应用程序崩溃.它不会每次都崩溃,它会随机发生.(每10条消息一次).
MyCode是:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
根据logcat,我必须调用pj_thread_register().但是我在端点中有一个方法libRegisterThread(),所以我在下面使用它
MyApp.ep.libRegisterThread("SipApi");
Run Code Online (Sandbox Code Playgroud)
这是logcat:
../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
Run Code Online (Sandbox Code Playgroud)
(对于那些想知道为什么它可以解决问题的人)
为了阐明Gangadhar的解决方案,该问题是由垃圾收集器引起的。根据PJSIP文档:
Java垃圾收集器(gc)有两个问题:
- 它延迟了Java对象(包括pjsua2对象)的销毁,从而导致对象的析构函数中的代码无法按顺序执行
- gc操作可能在先前未注册到PJLIB的不同线程上运行
解决方案是
应用程序必须立即使用对象的delete()方法销毁pjsua2对象,而不是依靠gc清理对象。
正如您在他的解决方案中看到的那样,该解决方案调用了MyBuddy的delete方法:
try {
myBuddy.create(account, bCfg);
myBuddy.sendInstantMessage(prm);
myBuddy.delete();
} catch (Exception e) {
e.printStackTrace();
return;
}
Run Code Online (Sandbox Code Playgroud)
这是正确的答案。
/**Send message to this number
* @param String number
* @param String msgBody*/
public void sendInstantMessage(String number, String msgBody) {
String sipServer = "aaa.ggg.net";
String buddy_uri = "<sip:" + number + "@" + sipServer + ">";
BuddyConfig bCfg = new BuddyConfig();
bCfg.setUri(buddy_uri);
bCfg.setSubscribe(false);
MyBuddy myBuddy = new MyBuddy(bCfg);
SendInstantMessageParam prm = new SendInstantMessageParam();
prm.setContent(msgBody);
try {
myBuddy.create(account, bCfg);
myBuddy.sendInstantMessage(prm);
myBuddy.delete();
} catch (Exception e) {
e.printStackTrace();
return;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3445 次 |
| 最近记录: |