从未知/外部线程调用pjlib.您必须使用pj_thread_register()注册外部线程

Gan*_*lli 7 android pjsip

我在我的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)

use*_*104 5

(对于那些想知道为什么它可以解决问题的人)

为了阐明Gangadhar的解决方案,该问题是由垃圾收集器引起的。根据PJSIP文档

Java垃圾收集器(gc)有两个问题:

  1. 它延迟了Java对象(包括pjsua2对象)的销毁,从而导致对象的析构函数中的代码无法按顺序执行
  2. 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)


Gan*_*lli 4

这是正确的答案。

/**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)