<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 手機與無(wú)線(xiàn)通信 > 設計應用 > 基于A(yíng)ndroid的VoIP系統的設計與實(shí)現

基于A(yíng)ndroid的VoIP系統的設計與實(shí)現

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

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


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>