Android NDK 编译Pjsip
Android NDK 编译Pjsip
这网站很多android的工具资源都可以下载到:http://tools.android-studio.org/index.php/sdk/
Pjsip官网在编译Android版本时,已经做了非常详细的说明。按照官网的指导,肯定是可以编译成功的。
官网编译指导:https://trac.pjsip.org/repos/wiki/Getting-Started/Android
一、环境资源准备
1)、Ubuntu 14.04 LTS
必须使用Ubuntu 14.04以上版本,不要使用Ubuntu12.04。因为12.04版本的SWIG版本太低,PjSip官方要求版本最低为:2.0.5。在编译完PjSip后,需要使用swig编译生成java接口文件。
2)、JDK
使用的JDK版本是:jdk-8u77-linux-x64.tar.gz
下载链接:https://pan.baidu.com/s/1bo5zmDh
3)、SDK
使用的版本是:android-sdk_r24.4.1-linux.tgz
下载链接:http://tools.android-studio.org/index.php/sdk
4)、NDK
使用版本:android-ndk-r13b-linux-x86_64.zip
下载链接:https://developer.android.google.cn/ndk/downloads/older_releases.html#ndk-13b-downloads
注意:不要使用r14b版本,r14b在编译PjSip时,会报缺少头文件的错误。
5)、openh264
使用版本:openh264-1.6.0.zip
下载链接:https://github.com/cisco/openh264/archive/v1.6.0.zip
6)、Pjsip
使用版本:pjproject-2.6.tar.bz2
下载链接:http://www.pjsip.org/release/2.6/pjproject-2.6.tar.bz2
以上资源都下载好后,把相应的资源放到自己的Ubuntu工作目录中。现在可以开始搭建编译环境
二、安装JDK
1)、把jdk-8u77-linux-x64.tar.gz拷贝到Ubuntu14.04的工作目录中,解压。解压后的目录 jdk1.8.0_77 会在当前工作目录中
$tar zxvf jdk-8u77-linux-x64.tar.gz
2)、将解压好的jdk1.8.0_77文件夹用最高权限复制到 /usr/lib/jvm/jdk1.8.0_77 目录里。jvm/jdk1.8.0_77目录自己新建。
$sudo cp -r ./jdk1.8.0_77/ /usr/lib/jvm/jdk1.8.0_77/
拷贝完后,进入/usr/lib/jvm/jdk1.8.0_77目录,查看jdk文件是否都拷贝到该目录下
3)、配置环境变量,保存成env.sh,env.sh后面经常会用到,保存成文件,用时会方便点。
#!/bin/sh
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_77
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:
保存成env.sh文件后执行,当然你不嫌累,可以一条的执行:
$source env.sh
4)、将系统默认的JDK修改成自己的JDK
$sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_77/bin/java 300
$sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_77/bin/javac 300
$sudo update-alternatives --config java
$sudo update-alternatives --config javac
5)、查看JDK安装是否成功
$java -version
如果成功,显示如下信息,如果不显示下面信息,请检查前面设置安装是否正确:
java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)
三、安装SDK
SDK本身解压就可以使用,并不需要安装,但是需要更新,下载对应的android SDK版本。
1)、解压SDK
$tar xvf android-sdk_r24.4.1-linux.tgz
2)、更新sdk,进入到android-sdk-linux/tools目录下 (在Ubuntu中的Terminal终端操作,不要在第三方ssh终端操作,下同,不要问为什么,因为后面的操作有界面啊)
$android list sdk
3)、选择需要更新的序号,因为我用的android版本为5.1,在android版本上请安装自己的android版本选择更新,当然多更新几个sdk也是没问题的大笑
$android update sdk -t 1,2,3,9
四、安装NDK
解压NDK
$unzip android-ndk-r13b-linux-x86_64.zip
如果需要视频通话功能,PjSip需要配置h264编码器,在编译PjSip前,需要先编译openh264。
五、编译openh264
1)、设置环境变量,Android NDK 编译PjSip 2.6 之 环境准备 (一)中说明了,可以把环境变量保存成env.sh文件。
$export ANDROID_SDK_ROOT=/home/xxx/PJSIP/android-sdk-linux
$export PATH=$ANDROID_SDK_ROOT/tools:$PATH
上面中xxx为我的工作目录。ANDROID_SDK_ROOT变量请根据自己的SDK路径配置。
2)、编译
$make OS=android NDKROOT=/home/xxx/PJSIP/android-ndk-r13b TARGET=android-22 PREFIX=./androidlib install-shared
NDKROOT请根据自己的NDK路径,设置成自己的绝对路径。
TARGET设置成自己需要编译的android的对应的版本,我要在android 5.1上运行,所以设置的是android-22
PREFIX设置openh264编译成功后的安装目录。这个在编译PjSip时,需要使用到,里面包含include头文件夹目录和lib库目录。
六、编译PjSip
1)、新建config_site.h文件,并把文件放入PjSip工程目录:pjproject-2.6/pjlib/include/pj/config_site.h
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
2)、设置NDK环境变量
$export ANDROID_NDK_ROOT=/home/xxx/PJSIP/android-ndk-r13b
请根据自己的NDK目录路径设置。
3)、配置PjSip
$NDK_TOOLCHAIN_VERSION=4.9 TARGET_ABI=armeabi-v7a APP_PLATFORM=android-22 ./configure-android --use-ndk-cflags --with-openh264=/home/xxx/PJSIP/androidlib/
NDK_TOOLCHAIN_VERSION=4.9 这个必须设置,PjSip 2.6编译如果没有设置这个,configure-android无法配置成功
TARGET_ABI根据自己的android机器CPU,设置相应的ABI,目前支持的ABI有: armeabi、armeabi-v7a、arm64-v8a、x86
APP_PLATFORM=android-22设置成自己需要运行的android版本,我的是android5.1所以设置成android-22
--use-ndk-cflags 为系统选项,必须跟上
--with-openh264=/home/xxx/PJSIP/androidlib/ 设置成openh264编译成功后,生成的androidlib目录路径,设置成绝对路径,androidlib目录名称参考openh264编译中PREFIX的目录名称。
可能出现的错误
configure-android error: ANDROID_NDK_ROOT env var is not specified or invalid
解决方法
直接把环境变量的shell命令写到脚本前面,原因是无法识别到前面设置的环境变量
可能出现的错误
./configure-android: 316: ./configure-android: ./configure: Permission denied
解决方法
给对应的文件执行权限
chmod +x configure
可能出现的错误
./configure: 2: ./configure: ./aconfigure: Permission denied
解决方法
给对应的文件执行权限
chmod +x aconfigure
4)、编译PjSip
$make dep && make clean && make
5)、使用SWIG编译java接口文件
如果还没有安装SWIG,先安装SWIN
$sudo apt-get install swig
进入pjproject-2.6/pjsip-apps/src/swig目录,执行
$make
会在pjproject-2.6/pjsip-apps/src/swig/java/android/app/src/main/jniLibs目录下生成libpjsua2.so,这个so是给apk使用的。同时在pjproject-2.6/pjsip-apps/src/swig/java/android/app/src/main生成很多java文件。这些文件是给apk开发使用的。
好了,到此,PjSip编译完成。生成了libpjsua2.so和相应的java文件供开发apk使用。
七、我们导入PjSip的example apk程序,编译生成apk放到手机中测试。
1)、把pjproject-2.6/pjsip-apps目录拷贝出来,放到自己的PC机的 apk开发目录中。
2)、进入到pjproject-2.6\pjsip-apps\src\swig\java\android\app\src\main\jniLibs目录中,根据前面编译PjSip时,指定的TARGET_ABI,新建相应的目录,我的TARGET_ABI=armeabi-v7a,所以新建目录armeabi-v7a,并把原来的jniLibs目录生成的libpjsua2.so放入到新建的目录中,删除原来的ABI目录。
把openh264编译出来的libopenh264.so也拷贝到armeabi-v7a目录下。
3)、使用Android studio 导入pjproject-2.6\pjsip-apps\src\swig\java\android 目录中的Android studio apk工程。导入过程会持续很长时间,慢慢等。
4)、在Android studio中clean project,并buid APK。根据报错修改下对应的文件,一般都是pjproject-2.6\pjsip-apps\src\swig\java\android\app下的build.gradle问题,修改对应工具的版本号就好。
八、其实编译PjSip和生成example apk都比较快,但是在测试example apk时,碰到了问题。
我们的开发环境大多都是局域网,而sip如果要跨网段打电话,就需要sip服务器和stun服务器。
其实,如果我们的手机都在同一个网段的局域网,而且只是测试PjSip的功能,是没有必要使用sip服务器和stun服务器的。
下面说下,不需要sip服务器和stun服务器,只在局域网内测试PjSip功能。
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账号地址:sip:IP地址,如:sip:192.168.1.100
3、增加一个联系人,联系人设置成:sip:IP地址:6000,如果:sip:192.168.1.100:6000
6000是端口号,example指定了端口号为6000.
4、拨打
A、B在同一个网段的局域网中。
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:[email protected]
4、设置注册服务器地址registrar:sip:192.168.1.1
5、设置用户名和密码