前言
公司項(xiàng)目中使用的libvlcjni.so
庫文件,有點(diǎn)老,對Android 6.0+
系統(tǒng)兼容性太差了儒洛,當(dāng)程序運(yùn)行在Android6.0+
系統(tǒng)上時(shí)狼速,回彈出警告框,提示libvlcjni.so:text relocations
異常恼蓬,雖然处硬,程序播放視頻沒有問題拇派,但是,總是彈出提示框就非常不友好了疮方,為此茧彤,就需要重新編譯一個(gè)新的庫文件。
由于惫谤,在編譯中遇到了一大堆難題许蓖,足足花了3天時(shí)間才將VLC-Android
源碼編譯成功。期間在網(wǎng)上查找了不少參考資料窖式,但是动壤,大都介紹太過詳細(xì),好多地方?jīng)]有將清楚,非常容易誤導(dǎo)他人启妹,所以饶米,決定下一篇詳細(xì)的教程來記錄此次編譯的過程车胡,希望能給大家?guī)韼椭?br>
特別感謝 從零開始在Linux編譯VLC-Android開源項(xiàng)目 這篇博客給我?guī)淼膸椭?br>
本博客同步發(fā)布于XueLong的博客
VLC簡介
VLC 是一款自由匈棘、開源的跨平臺(tái)多媒體播放器及框架主卫,可播放大多數(shù)多媒體文件簇搅,以及 DVD筒主、音頻 CD使兔、VCD 及各類流媒體協(xié)議虐沥。VLC使用C語言開發(fā)镐依,可跨平臺(tái)編譯為其他系統(tǒng)所用槐壳;VLC-android
是將VLC
編譯為Android
可調(diào)用類庫(*.so)的工程。
VLC官網(wǎng)
VLC-Android編譯官方文檔
編譯系統(tǒng)配置
- 編譯系統(tǒng)環(huán)境為:Windows 10 企業(yè)版(版本1607)下
VMware Workstation 12 Pro
(12.5.0 build-4352439)中安裝的Ubuntu16.04 LTS 64位
虛擬機(jī)吨灭。保證有一個(gè)穩(wěn)定的網(wǎng)絡(luò)環(huán)境,即使不能FQ也可以完成本次編譯。- 本次編譯的VLC-Android版本為2.1.16特幔,代碼時(shí)間為2017-08-10,SHA1 ID:
6a04fdb0f10daf70ec4cc449c78d53c2a379f399
- 本次編譯的VLC版本未知遭赂,代碼時(shí)間為2017-08-23,SHA1 ID:
85f0e45b2304afa64ace2e3f0ddc19ad8b5accfb
- VLC編譯環(huán)境代碼
git clone https://code.videolan.org/videolan/vlc-android.git
- vlc源碼
git clone http://git.videolan.org/git/vlc.git vlc
編譯環(huán)境配置
- 編譯VLC源碼需要安裝 JDK、NDK锌畸、SDK比默、automake命咐、ant、autopoint钝域、cmake迷捧、build-essential漠秋、 libtool庆锦、patch、pkg-config求晶、protobuf-compiler、ragel吝秕、subversion、unzip、git
- 為了解決編譯過程中不能下載
build.gradle
中的依賴環(huán)境問題如捅,建議安裝Android-Studio
JDK安裝及環(huán)境變量配置
- 1、下載jdk
- 2谎僻、解壓并賦權(quán)限
sudo tar zxvf ./jdk-8u144-linux-x64.tar.gz
sudo chmod -R 777 jdk-8u144-linux-x64
如果你下載的是zip
格式的則使用下面的命令進(jìn)行解壓
unzip jdk-8u144-linux-x64.zip
- 3、配置環(huán)境變量
打開配置文件
sudo gedit ~/.bashrc
在配置文件文本末尾輸入環(huán)境變量,保存并退出
export JAVA_HOME=/home/skylark/Software/jdk1.8.0_144
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_BIN=$JAVA_HOME/bin
使環(huán)境變量生效
source ~/.bashrc
驗(yàn)證是否配置成功
java -version
- 4、設(shè)置為ubuntu默認(rèn)JDK
sudo update-alternatives --config java #查看根目錄的Java,目前只有openJDK
sudo update-alternatives --install /usr/bin/java java /home/skylark/Software/jdk1.8.0_144/bin/java 300 #將oracle JDK安裝到根目錄
sudo update-alternatives --install /usr/bin/javac javac /home/skylark/Software/jdk1.8.0_144/bin/javac 300 #將oracle JDK安裝到根目錄
sudo update-alternatives --config java #再次查看Java配置缭保,輸入對應(yīng)序號,選擇oracle JDK作為默認(rèn)Java
SDK安裝及環(huán)境變量配置
- 1、下載
- 2苞尝、解壓,將解壓后的文件夾命名為
android-sdk
sudo tar zxvf ./android-sdk_r24.4.1-linux.tar
- 3抡砂、配置環(huán)境變量
打開配置文件
sudo gedit ~/.bashrc
在配置文件文本末尾輸入環(huán)境變量碴巾,保存并退出
export ANDROID_SDK=/home/skylark/Software/android-sdk #VLC編譯腳本只認(rèn) $ANDROID_SDK 環(huán)境變量
export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools
使環(huán)境變量生效
source ~/.bashrc
驗(yàn)證是否配置成功
android list target
NDK安裝及環(huán)境變量配置
- 1啤月、下載
- 2谎仲、解壓
unzip android-ndk-r13b-linux-x86_64.zip
- 3绞呈、配置環(huán)境變量
打開配置文件
sudo gedit ~/.bashrc
在配置文件文本末尾輸入環(huán)境變量,保存并退出
export ANDROID_NDK=/home/skylark/Software/android-ndk-r13b #VLC編譯腳本只認(rèn) $ANDROID_NDK 環(huán)境變量
export PATH=$PATH:$ANDROID_NDK
使環(huán)境變量生效
source ~/.bashrc
驗(yàn)證是否配置成功
ndk-build --version
Android Studio安裝
為了解決編譯過程中不能下載
build.gradle
中的依賴環(huán)境問題,建議安裝Android-Studio
如果你可以FQ的話志鹃,可以跳過次步驟
android-studio-ide-162.3871768-linux.zip
Android Studio的安裝比較簡單曹铃,由于篇幅的原因,這里就不再介紹了评甜,記得安裝時(shí)的SDK路徑和NDK路徑選擇上面步驟中我們自己的路徑。
官方推薦工具包安裝
官方給出了一條指令
sudo apt-get install automake ant autopoint cmake build-essential libtool patch pkg-config protobuf-compiler ragel subversion unzip git
來安裝所需要的包環(huán)境,建議自己逐條安裝嘉抒,一步一步來隶症,以便清楚的了解到每個(gè)包的安裝情況。
protobuf3編譯及安裝
我所使用的代碼,在編譯環(huán)節(jié)要求使用protobuf3胁住,而通過protobuf-compiler安裝的是libprotoc2.6.1版本儡司,會(huì)出現(xiàn)“Unrecognized syntax identifier “proto3”的錯(cuò)誤捕犬。因此需要手動(dòng)下載protobuf3,進(jìn)行安裝垢粮。
這里我采用的是直接下載protobuf-3.0.0的源碼蜡吧,然后進(jìn)行編譯安裝
Google Github Protobuf 安裝介紹
- 1斩跌、下載
- 2、編譯工具準(zhǔn)備
sudo apt-get install autoconf automake libtool curl make g++ unzip
- 3、解壓
sudo tar zxvf ./protobuf-3.0.0.tar.gz #解壓
cd ./protobuf-3.0.0/ #解壓出的文件夾
- 4、下載 gmock-1.7.0.zip
在執(zhí)行 ./autogen.sh
命令時(shí)上沐,需要從Q外下載一個(gè) gmock-1.7.0.zip
包,但是硫眯,由于網(wǎng)絡(luò)原因下載失敗净宵,所以先提前下載择葡。解壓下載的文件敏储,將文件夾重命名為 gmock
,并移動(dòng)到 protobuf-3.0.0
文件夾下酝碳。
- 5疏哗、編譯安裝
cd ./protobuf-3.0.0/ #解壓出的文件夾
./autogen.sh #首先生成configure腳本
./configure #運(yùn)行configure
make
make check
sudo make install
sudo ldconfig # refresh shared library cache. #千萬不要漏掉了 .
./configure --prefix=/usr #更改安裝到/usr
- 6、驗(yàn)證是否安裝成功
protoc --version
VLC環(huán)境變量配置
為VLC指定要編譯的設(shè)備類型吗氏,不設(shè)置環(huán)境變量時(shí)污尉,默認(rèn)采用
armeabi-v7a
打開配置文件
sudo gedit ~/.bashrc
在配置文件文本末尾輸入環(huán)境變量被碗,保存并退出
export ANDROID_ABI=armeabi-v7a
使環(huán)境變量生效
source ~/.bashrc
編譯開始
經(jīng)過上面復(fù)雜的環(huán)境變量配置及編譯工具安裝,現(xiàn)在我們終于要開始真正的VLC
源碼編譯了
vlc-andorid源碼下載
- 克隆vlc-android源碼到本地
git clone https://code.videolan.org/videolan/vlc-android.git #使用git命令從VLC官網(wǎng)獲取最新vlc-android代碼
- 克隆vlc源碼到本地
cd ./vlc-android/
git clone http://git.videolan.org/git/vlc.git vlc #使用git命令從VLC官網(wǎng)獲取最新vlc代碼
- 修改vlc-android目錄下的
build.gradle
//將classpath 'com.android.tools.build:gradle:3.4.1'修改為下面的
classpath 'com.android.tools.build:gradle:2.3.3'
- 修改vlc-android目錄下的
compile.sh
將GRADLE標(biāo)簽中的配置修改如下
read -p "skylark:press any key to start #GRADLE" skylark
if [ ! -d "gradle/wrapper" ]; then
GRADLE_VERSION=3.4.1
#skylark: if there is no gradle-v-all.zip,then download it.
if [ ! -a "gradle-${GRADLE_VERSION}-all.zip" ]; then
diagnostic "Downloading gradle"
GRADLE_URL=https://download.videolan.org/pub/contrib/gradle/gradle-${GRADLE_VERSION}-bin.zip
wget ${GRADLE_URL} 2>/dev/null || curl -O ${GRADLE_URL}
checkfail "gradle: download failed"
else
echo "skylark:#FUNCTIONS find local gradle-${GRADLE_VERSION}-all.zip"
fi
unzip -o gradle-${GRADLE_VERSION}-bin.zip
checkfail "gradle: unzip failed"
#skylark: change gradle-v-bin.zip downloading url.
echo "skylark: unzip done. Next step will execute gradle-${GRADLE_VERSION}/bin/gradle wrapper.This execution will lead to the downloading of [ gradle-${GRADLE_VERSION}-bin.zip ]. Notice that,you can use a faster download url in gradle-${GRADLE_VERSION}/gradle/wrapper/gradle-wrapper.properties with the value of [ distributionUrl ] AFTER canceling default downloading process (because gradle-${GRADLE_VERSION}/bin/gradle will not be created until this execution)."
echo "Or,you can place your own [ gradle-${GRADLE_VERSION}-bin.zip ] to the location like /home/skylark/.gradle/wrapper/dists/gradle-3.3-bin/64bhckfm0iuu9gap9hg3r7ev2 , and run compile.sh again(if gradle/wrapper exists,you should remove it first to run this part shell of compile.sh)"
read -p "Press any key to continue." skylark
cd gradle-${GRADLE_VERSION}
./bin/gradle wrapper
checkfail "gradle: wrapper failed"
./gradlew -version
checkfail "gradle: wrapper failed"
cd ..
mkdir -p gradle
mv gradle-${GRADLE_VERSION}/gradle/wrapper/ gradle
mv gradle-${GRADLE_VERSION}/gradlew .
chmod a+x gradlew
#skylark : keep this package.
#rm -rf gradle-${GRADLE_VERSION}-bin.zip
fi
echo "skylark : #GRADLE done."
- 將項(xiàng)目導(dǎo)入到
Android Studio
在編譯過程中蘑险,腳本會(huì)去自動(dòng)下載編譯APK所需要的依賴包贵少,但是由于網(wǎng)絡(luò)原因很難下載下來滔灶。
由于公司內(nèi)部網(wǎng)絡(luò)不能FQ,所以沒有辦法下載斗这。但是钮莲,想到每次在使用Android Studio
時(shí)總是可以下載下來的崔拥,于是我就將vlc-andorid
項(xiàng)目導(dǎo)入到Android Studio
拆魏,雖然同步失敗了俺附,顯示有許多錯(cuò)誤事镣,但是,當(dāng)再次執(zhí)行compile.sh
腳本時(shí)随闪,竟然破天荒的下載成功了俏讹!
- 執(zhí)行
compile.sh
腳本泽疆,開始編譯
如果你看到下面的提示梯浪,恭喜你成功了!
編譯完成
編譯成功后的APK在
/home/skylark/projects/vlc-android/vlc-android/build/outputs/apk/VLC-Android-2.1.16-ARMv7.apk
編譯成功后的aar包在/home/skylark/projects/vlc-android/libvlc/build/outputs/aar/libvlc-3.0.0-null.aar
編譯出錯(cuò)解決
- 如果在執(zhí)行compile.sh腳本時(shí),遇到SDK或NDK環(huán)境變量未指定,則修改compile.sh吻育,手動(dòng)寫死環(huán)境變量
ANDROID_SDK=/home/skylark/Software/android-sdk
ANDROID_NDK=/home/skylark/Software/android-ndk-r13b
ANDROID_ABI=armeabi-v7a
- 如果在執(zhí)行compile.sh腳本時(shí)摊趾,遇到
compile.sh: line 283: ./compile-libvlc.sh: Permission denied
,則修改compile.sh
#./compile-libvlc.sh $OPTS
sh compile-libvlc.sh $OPTS
- 如果在執(zhí)行compile.sh腳本時(shí),遇到
Could not resolve all dependencies for configuration ':classpath'.
侨糟,則修改compile.sh
#classpath 'com.android.tools.build:gradle:3.4.1'
classpath 'com.android.tools.build:gradle:2.3.3'
寫在最后
以上就是如何在 Ubuntu 16.04 下編譯VLC源碼的步驟。
如果你在參考過程中遇到問題,可以在我的聯(lián)系方式中給我提問汰具。
后面會(huì)繼續(xù)介紹吟孙,Android的相關(guān)知識藻治,歡迎繼續(xù)關(guān)注我博客的更新。
參考資源
- 從零開始在Linux編譯VLC-Android開源項(xiàng)目
- VLC for Android on Linux
- Android使用VLC庫開發(fā)自己的視頻播放器
- Protocol Buffers - Google's data interchange format
轉(zhuǎn)載請注明:XueLong的博客 ? 從零開始,手把手教你如何在Ubuntu下編譯VLC-Android源碼