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

标签 android pjsip

我已将 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):

  1. it delays the destruction of Java objects (including pjsua2 objects), causing the code in object's destructor to be executed out of order
  2. 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/

相关文章:

c - pjsip pj_timer_heap_schedule 崩溃

android - 在 x86 中为 android 平台构建 openh264

java - 使用pjsip播放mp3文件

c# - MethodBody.GetILAsByteArray 方法的结果是否被缓存?如果是这样,如何清除缓存?

Android 应用内购买 "Item that you have requested is not available for purchase"错误

android - 为什么绝对尺寸在移动浏览器上显示为不同尺寸?

android - 使用 PJSIP 的 Android VoIP 应用程序中的语音质量问题

android - onSaveInstanceState 没有保存我的值(onCreate input Bundle 始终为 null)

android - 试图在代码中获取属性值返回不正确的值

android - 互联网断开和连接时的 pjsua2 android 连接问题