2014-02-13 3 views
1

Я пытаюсь создать приложение SIP с использованием JAIN SIP 1.2 и реализации NIST на Android.PeerUnavailableException с использованием JAIN SIP API на Android

Я перестроил jain-sip-api-1.2.jar и jain-sip-ri-1.2.1111.jar из источника и переименован в javax -> jain_javax и gov.nist.javax -> jain_gov.nist.jain_javax. Я протестировал файлы jar на примере textclient на стандартном java без проблем. Однако, когда я запускаю его на Android, я до сих пор получаю сообщение об ошибке:

"The Peer SIP Stack: jain_gov.nist.jain_javax.sip.SipstackImpl could not be instantiated. Ensure the Path Name has been set". 

Пропустил ли я что-нибудь здесь?

ответ

1

Недостаточно переименовать пакеты. JAIN-SIP имеет внутренние ссылки на некоторые классы по их первоначальному имени пакета «gov.nist». Вы также должны дважды проверить весь свой код, чтобы переименовать любые ссылки «gov.nist», такие как префикс для классов стека.

Android имеет встроенную старую версию JAIN-SIP, которая берет на себя некоторые из существующих ссылок на эти классы «gov.nist». Это не экспортированный API, поэтому не совсем очевидно. Вот почему он может вести себя по-разному на настольных компьютерах. Отправьте код и полные сообщения об ошибках/отладочные журналы, если вам нужна дополнительная помощь.

0

Я использую JAIN-SIP-1-2-164. Вот код приложения:

import java.io.UnsupportedEncodingException; 
import java.net.InetAddress; 
import java.text.ParseException; 
import java.util.*; 
import android.os.Handler; 

import jain_javax.sip.*; 
import jain_javax.sip.address.*; 
import jain_javax.sip.header.*; 
import jain_javax.sip.message.*; 

public class SipLayer implements SipListener { 

private SipStack sipStack; 
private SipFactory sipFactory; 
private Properties properties; 
private String local_ip;  
int listen_port;    

/** Here we initialize the SIP stack. */ 
public SipLayer(int listen_port) { 
    try { 
    setUsername(username); 
    this.local_ip = InetAddress.getLocalHost().getHostAddress();; 
    this.listen_port = listen_port;  
    // Create the SIP factory and set the path name. 
    this.sipFactory = SipFactory.getInstance(); 
    this.sipFactory.setPathName("jain_gov.nist"); 
    // Create and set the SIP stack properties. 
    this.properties = new Properties(); 
    this.properties.setProperty("jain_javax.sip.STACK_NAME", "stack"); 
    this.properties.setProperty("jain_javax.sip.IP_ADDRESS", local_ip); 
    if(proxy != null) 
     this.properties.setProperty("jain_javax.sip.OUTBOUND_PROXY", proxy + ':' + server_port + '/' + protocol); 

    //DEBUGGING: Information will go to files textclient.log and textclientdebug.log 
    this.properties.setProperty("jain_gov.nist.javax.sip.TRACE_LEVEL", "32"); 
    // this.properties.setProperty("jain_gov.nist.javax.sip.SERVER_LOG", "textclient.txt"); 
    // this.properties.setProperty("jain_gov.nist.javax.sip.DEBUG_LOG", "textclientdebug.log"); 

    // Create the SIP stack. 
    this.sipStack = this.sipFactory.createSipStack(properties); 
    } 
    catch (Exception e) {  
    msgProc.processError("SipLayer failed: " + e.getMessage() + "\n"); 
    } 
    } 
} 

же код работает нормально на Java на окна машины, но андроид эмулятор я получил указанное выше сообщение об ошибке.

Я обнаружил, что он не удалось выполнить процедуру Jain SIP 1.2 в «SipStack sipStack = (SipStack) sipStackConstructor.newInstance (conArgs);»

private SipStack createStack(Properties properties) 
     throws PeerUnavailableException { 
    try { 
     // create parameters argument to identify constructor 
     Class[] paramTypes = new Class[1]; 
     paramTypes[0] = Class.forName("java.util.Properties"); 
     // get constructor of SipStack in order to instantiate 
     Constructor sipStackConstructor = Class.forName(
       getPathName() + ".jain_javax.sip.SipStackImpl").getConstructor(
       paramTypes); 
     // Wrap properties object in order to pass to constructor of 
     // SipSatck 
     Object[] conArgs = new Object[1]; 
     conArgs[0] = properties; 
     // Creates a new instance of SipStack Class with the supplied 
     // properties. 
     SipStack sipStack = (SipStack) sipStackConstructor.newInstance(conArgs); 
     sipStackList.add(sipStack); 
     String name = properties.getProperty("jain_javax.sip.STACK_NAME"); 
     this.sipStackByName.put(name, sipStack); 
        return sipStack; 
    } catch (Exception e) { 
     String errmsg = "The Peer SIP Stack: " 
       + getPathName() 
       + ".jain_javax.sip.SipStackImpl" 
       + " could not be instantiated. Ensure the Path Name has been set."; 
     throw new PeerUnavailableException(errmsg, e); 
    } 
} 

Любое предложение или как отлаживать дальше?

1

Совместимость. Jain Sip использует log4i-1.2.x.jar, который не работает должным образом на Android. В Интернете много обсуждений, как сделать log4j работающим на Android, но ни один из них не работает для меня. Я удалил весь связанный с log4j код из источника Jain Sip, и теперь sip-стек работает на Android.

+0

Если вы не хотите зависеть от такой третьей стороны, вы всегда можете использовать регистратор с чем-то вроде 'properties.put (« gov.nist.javax.sip.STACK_LOGGER », MyStackLogger.class.getName()); 'во время создания стека. Этот регистратор должен реализовывать 'StackLogger'. – pdeschen