PjSip官网编译指导:https://trac.pjsip.org/repos/wiki/Getting-Started/Android
编译环境:
ubuntu 16.04
14.04也是可以的
我创建的根目录:/home/pjsip-install/
,下面所有操作编译都在这个目录里面执行了
下面使用到的所有编译工具下载地址
链接:https://pan.baidu.com/s/1BmQtXI67cZXC6Mb9MFDPoA
提取码:pm0c
下载安装jdk jdk-8u77-linux-x64.tar.gz
,并配置环境变量,保证可用,可参考下面步骤5的配置
下载安装sdk,官方下载链接:http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
之后解压更新下载相应的platform,我在百度云里提供了下载好platform sdk可以直接使用和没有下载platform的sdk,可以根据自己的需求自行下载,解压sdk,配置环境变量,可参考下面步骤5的配置
tar -zxvf android-sdk_r24.4.1-linux.tgz
下载安装android-ndk-r13b
,官方下载链接:https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip,这里强烈建议使用android-ndk-r13b
版本,防止因版本不同导致编译的各种问题,13以下和14版本好像都有问题,官方文档有介绍,配置环境变量,可参考下面步骤5的配置
下载安装swig-3.0.12.tar.gz,用来编译Android代码的(PjSip官方要求swig版本最低为:2.0.5 )
下载链接:http://prdownloads.sourceforge.net/swig/swig-3.0.12.tar.gz,
安装参考地址:https://www.cnblogs.com/riasky/p/3483641.html
配置环境变量,可参考下面我的配置
查询libasound2-dev
是否安装成功
dpkg -s libasound2-dev
否则需要安装
sudo apt-get install libasound2-dev
下面是我配置环境全局环境变量的方法,其他配置环境变量的方法我就不介绍了:
编辑配置文件
vim /etc/profile
复制下面的配置并添加到文件末尾处 jdk,sdk,ndk,swig
环境变量,文件路径可根据自己的做修改
#set jdk environment
export JAVA_HOME=/home/pjsip/pjsip-install/jdk1.8.0_77
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
#sdk and ndk
export ANDROID_NDK_ROOT=/home/pjsip/pjsip-install/android-ndk-r13b
export ANDROID_SDK_ROOT=/home/pjsip/pjsip-install/android-sdk-linux
export PATH=$ANDROID_SDK_ROOT/tools:$PATH
#swig
export SWIG_PATH=/home/pjsip/pjsip-install/swigwin-3.0.12
export PATH=$SWIG_PATH:$PATH
更改之后,别忘了保存生效
source /etc/profile
编译openh264(如果不需要视频通话功能,则忽略此步)
下载链接:https://github.com/cisco/openh264/archive/v1.7.0.tar.gz
(1) 下载解压tar -zxvf openh264-1.7.0.tar.gz
(2) 进入到解压的目录openh264-1.7.0
(3) 编译对应版本so文件。编译arm64-v8a
的时候TARGET
必须大于等于21,因为NDK 从 level21 才开始支持 64位架构,因此 TARGET 低于 android-21 的将无法编译 arm64、x86_64、mips64 库,mips、mips64 两种架构未做优化处理
原因参考地址:https://www.cnblogs.com/elesos/p/9957588.html
下面提供2个案例
// 编译armeabi-v7a
make OS=android NDKROOT=/home/pjsip/pjsip-install/android-ndk-r13b TARGET=android-21 NDKLEVEL=21 ARCH=arm APP_ABI=armeabi-v7a PREFIX=/home/pjsip/pjsip-install/libopenh264/armeabi-v7a install-shared
// 编译arm64-v8a
make OS=android NDKROOT=/home/pjsip/pjsip-install/android-ndk-r13b TARGET=android-21 NDKLEVEL=21 ARCH=arm64 APP_ABI=arm64-v8a PREFIX=/home/pjsip/pjsip-install/libopenh264/arm64-v8a install-shared
—参数说明—
OS:系统名称
NDKROOT:指定NDK目录,请根据自己的NDK路径,设置成自己的绝对路径。
TARGET:指定android的对应API版本,参照自己安装的/android-sdk-linux/platforms/下目录名,如设置的是android-21
NDKLEVEL:NDK级别,默认值为12
ARCH:指定Android设备的体系结构,默认值arm(arm、arm64、x86、x86_64、mips、mips64)
APP_ABI:指定Android的ABI,ARCH=arm时,APP_ABI默认值=armeabi-v7a(取值可参照https://developer.android.google.cn/ndk/guides/abis.html)
PREFIX:设置openh264编译成功后的保存目录。这个在编译PjSip时,需要使用到,里面包含include头文件夹目录和lib库目录。
问题处理
Q1:针对x86编译
command not found nasm
,这是要根据提示下载安装nasmerror: symbol
xxxredefined
这种错误时,是nasm太旧所致,可更新到当前最新稳定 版2.13.02Q2: 出现collect2: error: ld returned 1 exit status
可以尝试先make clean,再make,还不行,删除openh264-1.7.0目录,重新解压,重来一遍
Q3: 出现NDK build error: fatal error: stdint.h: No such file or directory xxxx 4.9/include-fixed/limits.h:168:61: error: no include path in which to search for limits.h compilation terminated
arm64
的时候必须使用TARGET=android-21 和 NDKLEVEL=21
可能版本使用的不对armeabi-v7a
的时候使用了小于21版本的TARGET
和NDKLEVEL
,由于有缓存的影响,在编译arm64
等其他64位
的就会报错解决方法:
NDKROOT
的路径是否正确,然后使用-B
命令来进行一次full编译如:make -B OS=android ARCH=arm64 TARGET=android-21 NDK ..............
下载pjsip源码编译
解压pjsip源码:
tar -zxvf pjproject-2.10.tar.gz
之后在pjproject-2.10/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>
配置pjsip
举例编译armeabi-v7a
,其他版本要做相应修改,
TARGET_ABI=armeabi-v7a APP_PLATFORM=android-21 ./configure-android --use-ndk-cflags --with-openh264=/home/pjsip/pjsip-install/libopenh264/armeabi-v7a
PjSip 2.6版本编译的时必须有NDK_TOOLCHAIN_VERSION=4.9
NDK_TOOLCHAIN_VERSION=4.9 TARGET_ABI=armeabi-v7a APP_PLATFORM=android-21 ./configure-android --use-ndk-cflags --with-openh264=/home/pjsip/pjsip-install/libopenh264/armeabi-v7a
—参数说明—
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/pjsip/pjsip-install/libopenh264/armeabi-v7a 设置成openh264编译成功后,生成的libopenh264目录路径,设置成绝对路径,libopenh264目录名称参考openh264编译中PREFIX的目录名称
编译PjSip,在/pjproject-2.10
目录下执行如下命令
make dep && make clean && make
问题处理
Q1: 编译的时候出现如下异常
........
typename std::enable_if<std::is_integral<_A1>::value, double>::type
^
/home/pjsip/pjsip-install/android-ndk-r13b/sources/cxx-stl/llvm-libc++/include/math.h:1409:24: error: expected unqualified-id before '<' token
typename std::enable_if<std::is_integral<_A1>::value, double>::type
^
/home/pjsip/pjsip-install/pjproject-2.10/build/rules.mak:178: recipe for target 'output/libyuv-arm-unknown-linux-androideabi/compare.o' failed
make[3]: *** [output/libyuv-arm-unknown-linux-androideabi/compare.o] Error 1
make[3]: Leaving directory '/home/pjsip/pjsip-install/pjproject-2.10/third_party/build/yuv'
Makefile:100: recipe for target 'libyuv-arm-unknown-linux-androideabi.a' failed
make[2]: *** [libyuv-arm-unknown-linux-androideabi.a] Error 2
make[2]: Leaving directory '/home/pjsip/pjsip-install/pjproject-2.10/third_party/build/yuv'
Makefile:7: recipe for target 'all' failed
make[1]: *** [all] Error 1
make[1]: Leaving directory '/home/pjsip/pjsip-install/pjproject-2.10/third_party/build'
Makefile:14: recipe for target 'all' failed
make: *** [all] Error 1
我这边在第3步配置pjsip的时候去掉NDK_TOOLCHAIN_VERSION=4.9
,pjsip.2.10版的好像不配置,也是默认使用4.9版本的。之后make clean
一下,重新配置,重新编译就可以通过了
使用swig编译生成so文件和java文件,到样例应用中(pjproject-2.10/pjsip-apps/src/swig/java/android/app
)
进入到pjproject-2.10/pjsip-apps/src/swig
文件目录下执行
make
编译完成可在如下目录查看编译的文件:
至此,一个版本的PjSip编译完成