PJSIP 2.8 android 8 pjsua2編譯、運行教程

PJSIP2.8 下載地址https://www.pjsip.org/download.htm

sdk更新 安卓26

ndk用 android-ndk-r15c 

你要覺得麻煩或難解決錯誤可到https://item.taobao.com/item.htm?id=591748792847獲取源碼。源碼功能性更好、更完善。

想測試apk請加羣261074724 

=>官方編譯說明
https://trac.pjsip.org/repos/wiki/Getting-Started/Android

1.創建文件:vim pjlib/include/pj/config_site.h 

#define PJ_CONFIG_ANDROID 1
#include <pj/config_site_sample.h>

2.NDK_TOOLCHAIN_VERSION=4.9  APP_PLATFORM=android-26  TARGET_ABI=arm64-v8a ./configure-android --use-ndk-cflags 
make dep && make clean && make

cd pjsip-apps/src/swig=> make

3.把pjsip-apps/src/swig/java/android 項目東西考出來

4.創建一個安卓項目基於8的 包含c++的

創建一個模塊包pjsua 把主工程的CMakeLists.txt 及build.gradle裏的

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
    cmake {
        cppFlags "-frtti -fexceptions"
        abiFilters 'arm64-v8a'
    }
}
externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}
sourceSets {
    main {
        jniLibs.srcDirs = ['src/main/jniLibs']
    }
}

移到模塊下  主工程去掉這些  同時頁面main裏的cpp移過去

在src /main下的創建一個目錄jniLibs/arm64-v8a  導入libpjsua2.so

在cmakelist.txt添加

add_library( libpjsua2 SHARED IMPORTED)
set_target_properties( libpjsua2
                       PROPERTIES IMPORTED_LOCATION
                       ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libpjsua2.so)
target_link_libraries( # Specifies the target library.
                       native-lib
                       libpjsua2 

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

 

在java目錄導入包 除了app裏的activity 同時吧MyApp類改成public 裏面的類我把它考到了my裏 結果如下

 

好了在主工程的佈局文件添加一個按鈕點擊註冊並添加權限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

在oncreate 添加

if (PermissionsUtil.hasPermission(this, new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission. CAMERA  ,Manifest.permission. PROCESS_OUTGOING_CALLS ,Manifest.permission. READ_PHONE_STATE ,Manifest.permission. WRITE_EXTERNAL_STORAGE  })) {
    //有
    start();
} else {
    PermissionsUtil.requestPermission(this, new PermissionListener() {

        public void permissionGranted(@NonNull String[] permissions) {
            //用戶授予了
            start();
        }
        public void permissionDenied(@NonNull String[] permissions) {
            //用戶拒絕了訪問攝像頭的申請
            Toast.makeText(MainActivity.this, "您沒有授權將無法啓用網絡電話!", Toast.LENGTH_LONG).show();
        }
    }, new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission. CAMERA ,Manifest.permission. PROCESS_OUTGOING_CALLS ,Manifest.permission. READ_PHONE_STATE ,Manifest.permission. WRITE_EXTERNAL_STORAGE });
}

 

private void start() {

    if (app == null) {
        app = new MyApp();
        /**Wait for GDB to init, for native debugging only
         if (false &&   (getApplicationInfo().flags &   ApplicationInfo.FLAG_DEBUGGABLE) != 0)
         {
         try {
         Thread.sleep(5000);
         } catch (InterruptedException e) {}
         }**/
        app.init(this, getFilesDir().getAbsolutePath());
    }
}

這塊是初始化的可以參考編譯生成項目的actity

在點擊按鈕添加

accCfg = new AccountConfig();
accCfg.setIdUri("sip:"+username+"@"+ipport);
accCfg.getRegConfig().setRegistrarUri("sip:"+username+"@"+ipport);
AuthCredInfoVector creds = accCfg.getSipConfig().    getAuthCreds();
creds.clear();

creds.add(new AuthCredInfo("Digest", "*", username, 0, password));

StringVector proxies = accCfg.getSipConfig().getProxies();
proxies.clear();
//  proxies.add(proxy);
/* Enable ICE */
//accCfg.getNatConfig().setIceEnabled(true);
//accCfg.getVideoConfig( ).setAutoTransmitOutgoing(false );
accCfg.getVideoConfig( ).setAutoShowIncoming(true);
try {
    for(MyAccount m : app.accList){
        app.delAcc(m);
    }
    account = app.addAcc(accCfg);
    account.modify(accCfg);

} catch (Exception e) {}

並且讓actity實現MyAppObserver

好了 現在就可以點擊註冊   註冊成功後在現實的方法添加輸出

@Override
public void notifyRegState(pjsip_status_code code, String reason, int expiration) {
    Log.e("notifyRegState",""+reason);
    if( code==pjsip_status_code. PJSIP_SC_OK){
CodecInfoVector  a = MyApp.ep.codecEnum();
String audioinfo = "";
for( int i=0;i<a.size() ;i++  ){ //可用編碼輸出
    CodecInfo x= a.get(i);
    audioinfo+=x.getCodecId()+"("+x.getPriority()+")_"; 
}

好了  其他的參考編譯的項目的actity了

後面將會講到gcb729、opus、h264的編譯

交流羣261074724 

linphone 版教程https://blog.csdn.net/Java_lilin/article/details/80539116

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章