Android NDK 编译Pjsip

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、设置用户名和密码

你可能感兴趣的:(Android NDK 编译Pjsip)