<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 手機與無線通信 > 設(shè)計應(yīng)用 > 基于Android的VoIP系統(tǒng)的設(shè)計與實現(xiàn)

          基于Android的VoIP系統(tǒng)的設(shè)計與實現(xiàn)

          作者: 時間:2011-04-21 來源:網(wǎng)絡(luò) 收藏

          2.2.2 頭文件的生成
          C庫與Java間還需通過一個后綴為“.h”的頭文件來銜接,這個頭文件可以手動編寫,也可以通過“Javah”來生成,該工具包含在JDK中,是由SUN公司提供的。
          Javah生產(chǎn)的頭文件包含一定的規(guī)則,例如,本例中,它將生成的函數(shù)聲明為“Java_com_android_IMSandroid_pjsip_**”的形式,以便在調(diào)用C庫時能正確識別。
          由于Java中的數(shù)據(jù)類型與C/C++不盡相同,因此還必須注意參數(shù)傳遞時參數(shù)類型的轉(zhuǎn)換。本文所涉及到的Java數(shù)據(jù)類型有String和int型,Javah生成的頭文件中會先定義好需要傳遞的參數(shù)類型以及函數(shù)返回類型,例如方法“add_account(String sip_user,Stringsip_dom-ain,String sip_passwd)”,在頭文件中將定義函數(shù)的形式為“JNIEXPORT jint JNICALL Java_com_android_IMSandroid_pjsip_add_lac-count(JNIEnv*,jclass,jstring,jstring,jstring)”,其中JNIEXPORT為JNI外部函數(shù)聲明,jint是“jni.h”中定義C語言中整形的對應(yīng)類型,JNCALL是JNI關(guān)鍵字。比較特殊的是JNIEnv,它是一個指向類型為JNIEnv_的一個特殊JNI數(shù)據(jù)結(jié)構(gòu)的指針,它的每個元素都指向一個JNI函數(shù)的指針,jclass會根據(jù)引用Java類的不同而不同,本文中“pjsip.class”是靜態(tài)類,因此這里的jclass指的是類本身,如果是非靜態(tài)類則指的是對象。后面幾個就是pjsip類需要傳遞的參數(shù),根據(jù)“jni.h”的定義,String類型對應(yīng)jstring,int對應(yīng)jint。然而這只是函數(shù)申明與類中方法的形式對應(yīng),參數(shù)的具體傳遞還需要相應(yīng)的轉(zhuǎn)化,具體將在下一節(jié)詳細介紹。
          2.2.3 JNI接口函數(shù)的
          創(chuàng)建了pjsip庫類和頭文件之后,必須應(yīng)用一個庫接口函數(shù),這部分是pjsip接口的,限于篇幅,本文只講解幾個重要函數(shù)的實現(xiàn)。
          (1)init函數(shù)
          首先是init函數(shù),對應(yīng)的接口函數(shù)為JNICALL Java_com_android_IMSandroid_pjsip_init。該函數(shù)在初始化時調(diào)用,其作用是配置相關(guān)參數(shù),并發(fā)起一個pjsua應(yīng)用。它先通過函數(shù)“pjsua_create()”創(chuàng)建一個“pjsua”應(yīng)用,然后通過三個函數(shù)“pjsua_config_default
          (&cfg)”,“pjsua_logging_config_default(log_cfg”),“pjsua_media_config_default(&media_cfg)”配置其相關(guān)參數(shù),其中cfg是pjsua的相關(guān)參數(shù),主要是狀態(tài)改變時的回調(diào)函數(shù);log_cfg用來配置log級別;media_cfg中包含時鐘頻率、聲道數(shù)目等相關(guān)參數(shù)。
          完成配置之后就可以使用pjsua_init(&cfg,&log_cfg,&media_cfg)將先前配置的參數(shù)初始化。在初始化之后,還需為pjsua添加一個udp傳輸,這一步是通過pjsua_transport_create(PJSIP_TRANSPORT_UDP,cfg,NULL)來實現(xiàn)的,cfg中包含指定的通訊端口,3GPP建議使用5060。
          需要注意的是,配置完以上參數(shù)之后,還需指定SPEEX編碼優(yōu)先級,一般將其設(shè)為最大,可以通過函數(shù)pisua_codec_set_priority(&-speex_codec_id,255)來實現(xiàn)。所有配置完成之后,就可以發(fā)起pjsua,即最后調(diào)用pjsua_start()。成功的話,本函數(shù)的返回類型為PJ_SUCCESS。
          (2)make_call函數(shù)
          另一個很重要的函數(shù)是make_call,其在本接口文件中對應(yīng)的函數(shù)為Java_com_android_IMSandroid_pjsip_make_lcall,這個函數(shù)一般在發(fā)起會話時調(diào)用,它與上一個函數(shù)在結(jié)構(gòu)上最大的不同在于本函數(shù)需要傳遞一個字符串參數(shù),前面提到,Java與C/C++在參數(shù)結(jié)構(gòu)上并不完全相同,因此這里需要將Java傳遞過來的String類型的參數(shù)轉(zhuǎn)化,可以通過“url_ptr=(char*)env->GetStringUTFChars(url,iscopy)”來實現(xiàn)。env->GetStringUTFChars在“jni.h”中定義,其功能是將jsting類型(Java)的url復(fù)制到char*類型(C)的url_ptr中,以此來完成參數(shù)類型的轉(zhuǎn)換。
          為了保證傳遞地址的有效性,還需要使用pjsua_verify_sip_url(url_ptr)驗證,這個函數(shù)主要驗證url_ptr是符合SIP的規(guī)則,即是否是一個合法的SIP地址。然而char*型的地址pjsua中還是不能直接使用的,這是因為pjsua重新封裝了參數(shù)類型,所以最后還需要將其轉(zhuǎn)化成pj_ str_t類型,pjlib提供pj_str()函數(shù)可以完成轉(zhuǎn)化。在完成了參數(shù)的轉(zhuǎn)化后,調(diào)用“pjsua_call_make_call()”,將發(fā)起會話。
          (3)hangup函數(shù)和pjsua_destroy函數(shù)
          這兩個函數(shù)用來銷毀和掛斷會話,一般在需結(jié)束的時候調(diào)用,它們在接口函數(shù)中對應(yīng)Java_com_android_
          IMSandroid_pjsip_hangup和Java_com_android_IMSandroid_pjsip_destroy,由于沒有參數(shù)傳遞,也沒有其他的調(diào)用,因此這兩個函數(shù)非常簡單,基本上直接調(diào)用pjsua提供的pjsua_call_hangup_all()和pjsua_destroy()就能實現(xiàn)。pisua中這兩個函數(shù)將完成內(nèi)存釋放、賬戶注銷等工作。
          (4)add_account函數(shù)
          該函數(shù)在基本的pjsua中并不是必須的,但如果要使用SIP服務(wù)器的話,就必須實現(xiàn)該函數(shù),它在接口函數(shù)中對應(yīng)“Java_com_android_I-MSandroid_pjsip_add_1account”,同“make_call”一樣,也需要傳遞參數(shù),不同的是,它傳遞三個參數(shù),只是原理大體一樣。
          首先它將參數(shù)轉(zhuǎn)化后保持到cfg,通過“pjsua_acc_add(&cfg,PJ_TRUE,&ace_id)”將參數(shù)添加到pjsua。pjsua將以其中的sip服務(wù)器為目的地址,注冊會話發(fā)起申請,經(jīng)過一系列的操作之后,與目的地址發(fā)起會話。
          2.2.4 主程序與用戶界面
          的主程序是一個標準的應(yīng)用程序,它使用Java語言開發(fā),符合SDK規(guī)范。與一般的SDK程序不同的是,該類中必須使用Syst-em.loadLibrary加載PJSIP庫文件。形式如下:
          System.loadLibrary(“pjsip-jni”);
          其中,pjsip-jni就是上節(jié)中PJSIP協(xié)議棧生成的庫。


          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();