ubuntu下PjSip2.10编译 for android
Posted 威威dett
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ubuntu下PjSip2.10编译 for android相关的知识,希望对你有一定的参考价值。
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
,这是要根据提示下载安装nasm - 如果出现
error: symbol
xxxredefined
这种错误时,是nasm太旧所致,可更新到当前最新稳定 版2.13.02
下载链接:http://www.nasm.us/pub/nasm/releasebuilds/2.13.02/nasm-2.13.02.tar.gz
Q2: 出现
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
编译完成可在如下目录查看编译的文件:
- libpjsua2.so文件,是给apk使用的,在/pjproject-2.10/pjsip-apps/src/swig/java/android/app/src/main/jniLibs目录下
- java文件,是给apk开发使用的,在/pjproject-2.10/pjsip-apps/src/swig/java/android/app/src/main目录下
-
至此,一个版本的PjSip编译完成
特别感谢,参考地址:https://my.oschina.net/wxsword/blog/1618587
以上是关于ubuntu下PjSip2.10编译 for android的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu下使用Eclipse IDE for C/C++ Developers交叉编译和调试
错误记录Kotlin 编译报错 ( Not nullable value required to call an ‘iterator()‘ method on for-loop range )(代码片
在ubuntu上交叉编译Boost 1.57.0 for arm
ubuntu 下出现E: Sub-process /usr/bin/dpkg returned an error code
ubuntu 下出现E: Sub-process /usr/bin/dpkg returned an error code