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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章