2015-06-18 5 views
6

Ho integrato pjsua2 nella mia applicazione Android. L'applicazione si arresta in modo anomalo quando invio un SMS. Non si blocca ogni volta, sta accadendo casualmente. (una volta ogni 10 messaggi).Chiamare pjlib da thread sconosciuto/esterno. È necessario "" registrare thread esterni con pj_thread_register()

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

} 

Secondo logcat, devo chiamare pj_thread_register(). Ma ho avuto un metodo libRegisterThread() in finale, così ho usato come qui di seguito

MyApp.ep.libRegisterThread("SipApi"); 

Ecco il 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 

risposta

3

Ecco la risposta corretta.

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

(Per quelli di voi che si stanno chiedendo il motivo per cui ha risolto il problema)

Per chiarire la soluzione di Gangadhar, il problema è stato causato da Garbage Collector. Come per PJSIP Docs:

Ci sono due problemi con Java garbage collector (GC):

  1. ritarda la distruzione di oggetti Java (inclusi oggetti pjsua2), causando il codice nel distruttore dell'oggetto per essere eseguito su ordine
  2. dell'operazione gc possono essere effettuate su filo diverso, non precedentemente registrato PJLIB

La soluzione è stata applicazione

tenuto a distruggere immediatamente gli oggetti pjsua2 usando oggetto di metodo() cancellare, invece di basarsi sul gc per ripulire l'oggetto.

come si può vedere nella sua soluzione che chiama il metodo di eliminazione del MyBuddy:

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

Ho dovuto spostare 'myBuddy.delete();' nella clausola 'finally' perché quando si è usciti dall'eccezione l'oggetto non è stato cancellato. –

0

Per evitare questo tipo di errore, è necessario registrarsi filettatura esterna (come un filo Java) poco dopo la chiamata libCreate () metodo; in caso contrario, verrà visualizzato lo stesso errore. PJSUA2 registra innanzitutto il thread corrente come thread principale all'interno di libCreate(). Così, per registrare thread diverso quello che dovete fare una delle seguenti-

  1. chiamata libCreate() dal thread che si desidera registrare come principale thread.
  2. Chiama libRegisterThread (nome del thread che si desidera) dopo chiamando la libCreate(). Il nuovo thread verrà registrato come thread secondario.
Problemi correlati