Вызов pjlib из неизвестной / внешней нити. Вы должны "" регистрировать внешние потоки с помощью pj_thread_register ()

Я включил pjsua2 в свое приложение для Android. При отправке SMS-сообщения приложение аварийно завершает работу. Он не падает каждый раз, это происходит случайным образом. (Каждые 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; } } 

Согласно logcat, я должен вызвать pj_thread_register (). Но у меня есть метод libRegisterThread () в конечной точке, поэтому я использовал его, как показано ниже

 MyApp.ep.libRegisterThread("SipApi"); 

Вот 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 

Вот правильный ответ.

 /**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; } } 

(Для тех из вас, кто задается вопросом, почему он решил проблему)

Чтобы прояснить решение Gangadhar, проблема была вызвана сборщиком мусора. Согласно PJSIP Docs :

Есть две проблемы с сборщиком мусора Java (gc):

  1. Он задерживает уничтожение объектов Java (включая объекты pjsua2), вызывая выполнение кода в деструкторе объекта вне порядка
  2. Операция gc может выполняться на другом потоке, ранее не зарегистрированном в PJLIB

Решение было

Приложение ДОЛЖНО немедленно уничтожить объекты pjsua2, используя метод delete () объекта, вместо того, чтобы полагаться на gc для очистки объекта.

Как вы можете видеть в своем решении, которое называется методом удаления MyBuddy:

 try { myBuddy.create(account, bCfg); myBuddy.sendInstantMessage(prm); myBuddy.delete(); } catch (Exception e) { e.printStackTrace(); return; } 

Чтобы избежать такой ошибки, вам необходимо зарегистрировать внешний поток (например, поток Java) сразу после вызова метода libCreate (); В противном случае будет показана одна и та же ошибка. PJSUA2 сначала регистрирует текущий поток как основной поток внутри libCreate (). Итак, чтобы зарегистрировать другую тему, вам нужно сделать одно из следующих действий:

  1. Вызовите libCreate () из потока, который хотите зарегистрировать в качестве основного потока.
  2. Вызовите libRegisterThread (имя нужного вам потока) после вызова libCreate (). Новый поток будет зарегистрирован как вторичный поток.
Intereting Posts
Национальная / региональная версия Dashboard для разработчиков Android Студия Android после переименования пакета, который он выбрал. Не найдено соответствующего клиента Eclipse успешно компилируется, но все же дает семантические ошибки Приложение Android выполняется дважды в главном меню Android, http: Как загрузить файл на сайт, размещенный на общем сервере? Белый экран перед брызговым экраном Неизвестный источник при использовании Proguard Редактирование текста Android скрыто при отображении виртуальной клавиатуры и задействован SurfaceView Android: OptionMenu между активностью и фрагментами Android – информация об использовании аккумулятора Как программно получить список зарегистрированных пользователей в Firebase DownloadManager исключает исключение при загрузке более одного файла API Android Android v2 с настраиваемыми маркерами IllegalArgumentException readExceptionFromParcel Изменение цвета по умолчанию для Android CheckBox Check Mark