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 
  1. 下载安装jdk jdk-8u77-linux-x64.tar.gz,并配置环境变量,保证可用,可参考下面步骤5的配置

  2. 下载安装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
    
  3. 下载安装android-ndk-r13b,官方下载链接:https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip,这里强烈建议使用android-ndk-r13b版本,防止因版本不同导致编译的各种问题,13以下和14版本好像都有问题,官方文档有介绍,配置环境变量,可参考下面步骤5的配置

  4. 下载安装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
    配置环境变量,可参考下面我的配置

  5. 查询libasound2-dev是否安装成功

    dpkg -s libasound2-dev
    

    否则需要安装

    sudo apt-get install libasound2-dev
    
  6. 下面是我配置环境全局环境变量的方法,其他配置环境变量的方法我就不介绍了

    编辑配置文件

    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
    
  7. 编译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编译

    1. 如果出现 command not found nasm,这是要根据提示下载安装nasm
    2. 如果出现error: symbolxxxredefined这种错误时,是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

    1. 因为在编译arm64的时候必须使用TARGET=android-21 和 NDKLEVEL=21可能版本使用的不对
    2. 或者在编译其他版本如armeabi-v7a的时候使用了小于21版本的TARGETNDKLEVEL,由于有缓存的影响,在编译arm64等其他64位的就会报错

    解决方法:

    1. 此时检查NDKROOT的路径是否正确,然后使用-B命令来进行一次full编译如:
      make -B OS=android ARCH=arm64 TARGET=android-21 NDK ..............
    2. 如果还是不行,可能缓存还没有清除,可关闭命令窗口重新打开一个或终极方法重启下虚拟机(如果你有其他清缓存的方法,麻烦告诉我一下)解决方法参考地址
  8. 下载pjsip源码编译

    1. 解压pjsip源码:

      tar -zxvf pjproject-2.10.tar.gz
      
    2. 之后在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>
      
    3. 配置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的目录名称

    4. 编译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一下,重新配置,重新编译就可以通过了

    5. 使用swig编译生成so文件和java文件,到样例应用中pjproject-2.10/pjsip-apps/src/swig/java/android/app
      进入到pjproject-2.10/pjsip-apps/src/swig文件目录下执行

      make
      

      编译完成可在如下目录查看编译的文件:

      1. libpjsua2.so文件,是给apk使用的,在/pjproject-2.10/pjsip-apps/src/swig/java/android/app/src/main/jniLibs目录下
      2. 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编译matcaffe

在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