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=618486196283获取源码。源码功能性更好、更完善。

想测试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

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值