编译pjsip for Android

pjsip

PJSIP是一个包含了SIP、SDP、RTP、RTCP、STUN、ICE等协议实现的开源库。它把基于信令协议SIP的多媒体框架和NAT穿透功能整合成高层次、抽象的多媒体通信API,这套API能够很容易的一直到各种构架中,不管是桌面计算机,还是嵌入式设备等。

PJSIP支持音频、视频和即时消息,并具有广泛的文档。PJSIP非常便携。在移动设备上,它抽象出与系统相关的功能,并且在许多情况下能够利用设备的本地多媒体功能。
官网
细致的介绍以及原理

编译

想要在Android开发中使用这个开源库,就要进行编译生成依赖包.so库

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

第一步 准备: 创建config_site.h

需要现在下载源码 官网下载地址
创建pjlib/include/pj/config_site.h, 并config.site.h它添加内容:

1
2
3
/* Activate Android specific settings in the 'config_site_sample.h' */
#define PJ_CONFIG_ANDROID 1
#include <pj/config_site_sample.h>

第二部 构建:环境

需要为你的ndk配置当前的环境变量

1
$ export ANDROID_NDK_ROOT=[YOUR ANDROID_NDK ROOT DIR]  //你的ndk根目录

然后依次执行

1
2
$ ./configure-android
$ make dep && make clean && make

这里需要说明下,本人在执行完./configure-android的时候遇到问题如下:
aconfigure: error: C preprocessor "/lib/cpp" fails sanity check
See `config.log' for more details

stackoverflow这哥们遇到的和我一样,but他解决了却不告诉我, 连喊三个what?
拿着他的编译成果纵然不甘心,一番搜索终于还是解决了,(官网教程也有写,只不过放在最底下,让我这按部就班背锅了) 原来pjsip无法建立在android-ndk-r15上,只要指定 NDK_TOOLCHAIN_VERSION版本就好了,执行以下指令:

1
$ NDK_TOOLCHAIN_VERSION=4.9 TARGET_ABI=armeabi ./configure-android --use-ndk-cflags

第三步: 生成libpjsua2.so

需要使用SWIG编译java接口文件swig下载
在这个过程中下载pcre-build.sh需要用的压缩包
我下载的是pcre-8.40.tar.bz2
把pcre-8.40.tar.bz2拷贝到swig的根目录下
重命名pcre-8.40.tar.bz2为pcre-8.40.tar
进入到swig根目录下,执行./Tools/pcre-build.sh
依次执行 ./autogen.sh
./configure
make
sudo make install

然后切到pjsip-apps/src/swig目录执行

1
$ make

等待执行完毕…
最终会在pjsip-apps/src/swig/java/android/app/src/main/jniLibs目录下生成libpjsua2.so
同时在pjsip-apps/src/swig/java/android/app/src/main生成
很多java文件。这些文件也是给apk开发使用的

1
2
$ cd pjsip-apps/src/pjsua/android/jni 
$ make //最终会生成libpjsua.so(例子)

(如果需视频则要把libopenh264.so也导入)

我的编译成果:github