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編譯完成