PJSIP编译

必须使用Linux编译,不要在Windows上浪费时间,编译好了再把so拷贝出来Windows即可。没有Linux?virtualbox搞一个Ubuntu不是什么难事,网速快的话半小时搞定。

源码目录说明

目录:
lib: [PJPROJECT的lib库]
pjlib:[基础框架库]
pjlib-util:[辅助工具库]
pjmedia:[开源的媒体栈]
pjnath:[开源的NAT-T辅助库]
pjsip:[开源的SIP协议栈]
pjsip-apps[demo]

配置准备

VirtualBox6.1
Ubuntu 16.0.4桌面版(编译期间最好不用让Ubuntu息屏或锁屏,否则可能会导致失败)

安装vim,方便编辑

以下软件全部放到/home/itant/Documents/下:
①先卸载原有的openjdk,再安装jdk 1.8(arch命令查看系统架构,然后下载对应的版本,这里是x86_64,即下载x64对应的即可)
对应文件夹:/home/itant/Documents/jdk1.8

②Android Studio Bumblebee | 2021.1.1
对应文件夹:/home/itant/Documents/android-studio
打开AndroidStudio,在Android Studio的Setting修改Android SDK Location:/home/itan/Documents/sdk
应用并等待完成…
对应文件夹:/home/itant/Documents/sdk
然后再次点击Setting,设置:
-Android SDK:Android 25(根据测试机的安卓版本确定,对应Android 7.1.1,可酌情修改,可以安装Android Studio后在SDK Manager里下载)
-Android SDK Build-Tools 24(build-tools;24.0.0)
-Android SDK Command-line Tools (cmdline-tools;1.0)
-CMake 3.6.4111459(cmake;3.6.4111459)
Setting里cmake和command line勾选最旧的

③Android SDK Tools
http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz 。(必需等于或小于该版本,之后的版本弃用android命令,导致编译失败)
将android-sdk_r24.4.1-linux.tgz解压后的tools文件夹覆盖Android Studio默认SDK里的tools文件夹。

④android-ndk-r13b
对应文件夹:/home/itant/Documents/ndk-r13b

⑤Openh264版本:1.6.0
下载地址https://github.com/cisco/openh264/archive/v1.6.0.zip
说明:没有使用最新版本,在https://trac.pjsip.org/repos/ticket/1947明确说明了使用1.6.0版本
对应文件夹:/home/itant/Documents/openh264-1.6.0

pjproject-2.11
下载链接:https://github.com/pjsip/pjproject/archive/refs/tags/2.11.zip
对应文件夹:/home/itant/Documents/pjproject-2.11

因为项目需求,需要保证SIP通话过程中服务器不对音频数据包进行转码,因此需要减少PJSIP默认支持的音频编码格式,同时也可以减小编译出来的链接库大小。
在pjlib/include/pj/中新建config_site.h文件,内容如下:

/* Activate Android specific settings in the 'config_site_sample.h' */  
#define PJ_CONFIG_ANDROID 1  
//To enable video  
#define PJMEDIA_HAS_VIDEO 1  
//To enable libyuv  
#define PJMEDIA_HAS_LIBYUV  1  
//To enable TCP transport  
#define PJ_HAS_TCP 1  
#include <pj/config_site_sample.h>

此时,config_site.h也是有一个锁的标志的,直接chmod 777 config_site.h

(可选)修改config_site_sample.h中针对Android的配置如下:

······
/*
 * Android sample settings.
 */
#if PJ_CONFIG_ANDROID
······
/* Disable some codecs */
#define PJMEDIA_HAS_L16_CODEC        0
#define PJMEDIA_HAS_GSM_CODEC        1 
#define PJMEDIA_HAS_SPEEX_CODEC        0
#define PJMEDIA_HAS_ILBC_CODEC        0
#define PJMEDIA_HAS_PCMU_CODEC        1 
#define PJMEDIA_HAS_PCMA_CODEC        1
#define PJMEDIA_HAS_G722_CODEC        0

#define PJMEDIA_RTP_PT_TELEPHONE_EVENTS        0
#define PJMEDIA_RTP_PT_TELEPHONE_EVENTS_STR        0

#define PJMEDIA_ADVERTISE_RTCP      0
······

上述修改主要是保留了GSM、PCMU、PCMA音频编码,取消了其余的静态编码方式和动态编码方式,可以根据需要酌情修改。

配置环境

①配置Java环境变量
执行vim /etc/profile,在最后一行添加:

export JAVA_HOME=/home/itant/Documents/jdk1.8
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib  
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

②配置SDK
可以安装Android Studio后在SDK Manager里下载相应SDK版本,然后将android-sdk_r24.4.1-linux.tgz解压后的tools文件夹覆盖Android Studio默认SDK里的tools文件夹。
编辑/etc/profile配置文件,添加:

export ANDROID_SDK_ROOT=/home/itant/Documents/sdk
export PATH=$PATH:$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools

③配置NDK
将NDK解压,编辑/etc/profile配置文件,添加:

export ANDROID_NDK_ROOT=/home/itant/Documents/ndk-r13b
export PATH=$PATH:$ANDROID_NDK_ROOT

④更新环境变量
临时:执行source /etc/profile,更新本次终端的环境变量;
长期:重启,/etc/profile文件在每次启动时均会加载
这里最好重启一下

开始编译

①编译说明
编译过程中所有Android版本均使用android 25(根据目标机的安卓版本确定,对应Android 7.1.1,可酌情修改);
CPU架构均使用arm64-v8a

②编译openh264
进入openh264目录,可以先建立androidlib目录,然后执行

make OS=android NDKROOT=/home/itant/Documents/ndk-r13b TARGET=android-25 PREFIX=./androidlib install-shared ARCH=arm64-v8a

注意,NDKROOT赋值为前述NDK的路径,PREFIX为编译后生成的头文件和链接库的位置,这里是openh264目录下的androidlib文件夹,这个路径在编译PJSIP还要用于指明openh264位置。
Opneh264默认采用armeabi-v7a架构。如ARCH=arm可以指定编译架构。

③安装swig用于编译java接口文件:

sudo apt install swig

建议手动安装:
下载安装swig4.0.2(http://www.swig.org/download.html),下载完成后解压。
下载pcre-8.40.tar.bz2(https://sourceforge.net/projects/pcre/files/),放到解压后的swig目录里
依次执行:

./Tools/pcre-build.sh
./autogen.sh
./configure
make
make install

④编译PJSIP配置:
进入PJSIP目录,执行配置:

NDK_TOOLCHAIN_VERSION=clang TARGET_ABI=arm64-v8a APP_PLATFORM=android-25 ./configure-android --use-ndk-cflags --with-openh264=/home/itant/Documents/openh264-1.6.0/androidlib

如果有权限问题,chmod 777

注意:NDK_TOOLCHAIN_VERSION=4.9 这个必须设置,如果没有设置这个,configure-android无法配置成功,亲测还是会报错“This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.”,于是换成NDK_TOOLCHAIN_VERSION=clang;

APP_PLATFORM=android-25设置成自己需要运行的android版本;

–use-ndk-cflags 为系统选项,必须跟上;

–with-openh264=xxx/androidlib/ 设置成openh264编译成功后,生成的androidlib目录的绝对路径,参考openh264编译中PREFIX的目录名称。编译时可能报错’wels/codec_api.h’ file not found,可能是因为没有权限,仔细观察发现androidlib文件夹上有个锁的标志,chmod 777 androidlib,再次运行还是不行,原来openh264的路径写的是相对路径,替换成全路径重试成功。

⑤编译PJSIP:

make dep && make clean && make

⑥如果要编译其他架构,必须先清除

$ cd /path/to/your/pjsip/dir
$ make clean

# cleanup pjsua sample app
$ cd pjsip-apps/src/pjsua/android/jni
$ make clean

# also cleanup pjsua2 sample app (SWIG)
$ cd /path/to/your/pjsip/dir
$ cd pjsip-apps/src/swig
$ make clean

然后再执行⑤

⑦使用swig编译demo
编译之前也要先执行⑥

cd /path/to/your/pjsip/dir
cd pjsip-apps/src/swig
make

demo源码:pjsip-apps/src/swig/java/android,拷贝出来导入AndroidStudio运行,记得把生成的其他so,如libopenh264.so也拷贝到android/pjsua2/src/main/jniLibs/对应架构文件夹下。

⑧创建自己的项目
导入pjsua2使用
如果不使用module,则拷贝在pjsip-apps/src/swig/java/android/app/src/main/java/org/pjsip/pjsua2生成的pjsua2 Java接口文件,这些文件是给apk开发使用的,so文件也要拷贝全。

刚开始使用armeabi-v7a没有成功,提示Failed to load native library pjsua2,后来不使用openh264,且改用arm64-v8a成功了(部分支持arm64-v8a架构的手机可用)

局域网拨打

我们的开发环境大多都是局域网,而sip如果要跨网段打电话,就需要sip服务器和stun服务器。其实,如果我们的手机都在同一个网段的局域网,而且只是测试PjSip的功能,是没有必要使用sip服务器和stun服务器的。

下面说下,不需要sip服务器和stun服务器,只在局域网内测试PjSip功能,A、B在同一个网段的局域网中。。

1、打开pjsip-apps\src\swig\java\android\app\src\main\java\org\pjsip\pjsua2\app目录下的MyApp.java,注释掉 public void init(MyAppObserver obs, String app_dir, boolean own_worker_thread)接口中的:

//ua_cfg.setStunServer(stun_servers); //局域网测试中,不需要设置stun服务器。


//不需要TCP和TLS transport连接,特别是TLS,在apk运行是报错,TCP可以参考保留
//  try {
//     ep.transportCreate(pjsip_transport_type_e.PJSIP_TRANSPORT_TCP,
//              sipTpConfig);
// } catch (Exception e) {
//     System.out.println(e);
// }
// try {
//     sipTpConfig.setPort(SIP_PORT+1);
//     ep.transportCreate(pjsip_transport_type_e.PJSIP_TRANSPORT_TLS,
//              sipTpConfig);
// } catch (Exception e) {
//     System.out.println(e);
// }

2、设置sip账号
点击扳手图标,设置Pjsip中自己的sip账号地址(可填写当前设备的局域网IP,留空则对方看到empty):sip:IP地址,如:sip:192.168.1.100

3、点击加号图标增加一个联系人,联系人设置成:sip:对方局域网IP地址:6000,如:sip:192.168.1.100:6000
6000是端口号,example指定了端口号为6000

4、拨打
选中添加的联系人,点击拨号按钮。

实例设置:
A的ID设置成sip:192.168.1.100,增加一个联系人B,B的地址设置成:sip:192.168.1.106:6000
B的ID设置成sip:192.168.1.106,增加一个联系人A,A的地址设置成:sip:192.168.1.100:6000

可以A拨打B或者B拨打A

跨网段打电话测试

1、需要搭建自己的公网sip服务器
2、需要搭建自己的stun服务器或者使用公网的stun服务器
3、设置自己的ID:sip:电话@IP地址,如:sip:101@192.168.1.1
4、设置注册服务器地址registrar:sip:192.168.1.1
5、设置用户名和密码

转换为AndroidStudio编译

1、新建native module,拷贝整个pjproject开源库到cpp目录,拷贝编译好的pjsua java文件到java文件夹。
2、复制可能用到的其他so到cpp目录,如openh264.so
3、自行编写CMakeLists.txt文件,链接所有C/C++文件(重点)

官方文档:https://trac.pjsip.org/repos/wiki/Getting-Started/Android
参考文档:https://www.freesion.com/article/9552413705/
仓库地址:https://github.com/pjsip/pjproject

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Linux PJ-SIP是一个开源的软电话/ VoIP库,它可以用于开发基于SIP协议的通信应用程序。编译PJ-SIP库时,您可以按照以下步骤进行操作: 1. 下载PJ-SIP:您可以从PJ-SIP官方网站(http://www.pjsip.org)下载最新版本的PJ-SIP库。解压缩下载的文件。 2. 安装依赖项:在编译PJ-SIP之前,您需要安装一些依赖项。以Ubuntu为例,您可以使用以下命令安装依赖项: ``` sudo apt-get install build-essential python-dev libssl-dev libncurses5-dev libxml2-dev libjansson-dev ``` 3. 配置编译参数:进入PJ-SIP的目录,并使用以下命令生成编译配置文件: ``` cd <pj-sip-directory> ./configure --enable-shared --disable-sound --disable-video --disable-opencore-amr --disable-resample ``` 4. 编译和安装:使用以下命令进行编译和安装: ``` make dep make sudo make install ``` 5. 测试安装:编译完成后,您可以使用示例应用程序进行测试。进入PJ-SIP的pjsip-apps/bin目录,运行以下命令启动一个测试客户端: ``` ./pjsua-x86_64-unknown-linux-gnu ``` 以上是简要的步骤,用于在Linux上编译PJ-SIP库。请注意,具体的编译过程可能会根据您的操作系统和环境而有所不同。在执行编译过程时,请确保您的系统满足所有依赖项,并仔细阅读PJ-SIP的官方文档,以获取更多详细信息。 ### 回答2: Linux平台上编译PJSIP的步骤如下: 1. 首先,确保你的Linux操作系统已经安装了必要的编译工具,如gcc、g++等。你可以通过在终端中输入以下命令来检查它们是否已安装: ``` gcc --version g++ --version ``` 2. 下载PJSIP源代码。你可以从PJSIP的官方网站上下载最新的稳定版本或开发版本。使用wget命令来下载: ``` wget http://www.pjsip.org/release/2.10/pjproject-2.10.tar.bz2 ``` 3. 解压源代码包。使用以下命令来解压下载的源代码包: ``` tar -xvjf pjproject-2.10.tar.bz2 ``` 4. 进入解压后的目录: ``` cd pjproject-2.10 ``` 5. 配置编译选项。运行以下命令来生成编译配置文件: ``` ./configure ``` 6. 编译源代码。使用make命令来编译源代码。这个过程可能需要一些时间: ``` make ``` 7. 安装编译好的库文件。使用以下命令将编译好的库文件安装到系统中: ``` sudo make install ``` 8. 编译PJSUA示例程序。运行以下命令来编译PJSUA示例程序: ``` cd pjsip-apps/src/ make pjsua ``` 9. 编译和运行其他需要的示例程序。你可以使用类似的命令来编译和运行其他示例程序,如PJSUA2、PJSIP测试套件等。 这些步骤将会在Linux平台上编译PJSIP并生成所需的库文件和示例程序。你可以根据自己的需求进行特定的配置和编译选项。希望以上的解答能够对你有所帮助。 ### 回答3: 要编译Linux下的PJSIP,你需要按照以下步骤进行操作: 1. 下载PJSIP软件包:可以从PJSIP官方网站上下载最新的软件包,也可以使用命令行工具如wget进行下载。 2. 解压软件包:使用解压缩工具如tar解压下载的PJSIP软件包。进入解压后的目录。 3. 设置编译环境:在终端中输入"./configure" 命令,这会自动检测系统环境并生成相应的Makefile。 4. 进行编译:在终端中输入"make" 命令进行编译。这会执行Makefile文件中的编译规则,然后将生成的可执行文件和库文件拷贝到指定目录。 5. 安装PJSIP:在终端中输入"sudo make install" 命令,这会将编译生成的文件安装到系统目录中。 6. 配置PJSIP:在PJSIP安装目录下的"pjsua" 子目录中,可以找到一个名为"pjsua.conf" 的配置文件。你可以根据自己的需求修改该文件,配置PJSIP的各项参数。 7. 测试PJSIP:使用终端中的"pjsua" 命令启动PJSUA应用程序,并通过命令行进行测试。 编译PJSIP可能会因为环境配置不正确或者依赖包缺失而出现错误。如果遇到错误,可以根据错误提示进行解决,可能需要安装一些依赖包或者调整系统环境配置。 值得提醒的是,这只是一个简单的介绍,具体的编译步骤可能因为系统环境的不同而有所差异。因此,在进行PJSIP编译之前,建议先阅读官方文档或者相关教程,以便正确地进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ithouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值