從零開始在Linux編譯VLC-Android開源專案

wkw1125發表於2017-02-25

前言

作為菜鳥到公司的第一天,boss就讓我熟悉下VLC的內容,然後總共是第五天才編譯出了VLC最新的lib類庫和demo工程的apk。之所以標題為“從零開始”,是由於剛接觸Linux、shell命令沒多久,就要在Linux下進行VLC-Android的交叉編譯,儘管只是執行官方的編譯指令碼,但是新手上路遇到的問題一個接一個。導致五天才編譯成功的另外一個原因是,混淆了官方最新程式碼與公司給的舊版本,所以出現一堆環境配置問題。五天來相當的煎熬,好在前輩們不吝賜教,也由此對Linux和shell更熟悉了一些,到公司實幹還是最鍛鍊人的。

本文以我作為菜鳥的角度來介紹從零開始,到編譯出VLC類庫和APK的整個過程,所以也會比較囉嗦。

介紹

VLC介紹

VLC是一個免費開源的跨平臺多媒體播放器和框架,可以播放眾多的多媒體檔案,DVD、CD、VCD和各種流協議。VLC使用C語言開發,可跨平臺編譯為其他系統所用;VLC-Android是將VLC編譯為Android可呼叫類庫(*.so)的工程。官網建議在Linux下進行編譯,由於依賴的工具包很多,並且VLC編譯指令碼對工具包版本、程式碼版本都有嚴格的hash校驗,再加上官方說明並不是很照顧新手,所以出現了很多配置問題。

VLC官網:http://www.videolan.org
VLC原始碼:http://www.videolan.org/vlc/download-sources.html
VLC依賴:ftp://ftp.videolan.org/pub/contrib/http://download.videolan.org/pub/contrib/
VLC框架介紹:http://www.codeweblog.com/the-architecture-of-vlc-media-framework/
VLC-Android編譯官方文件:https://wiki.videolan.org/AndroidCompile/

編譯前注意事項

編譯VLC-Android的整體流程基本上按照官方文件進行,但是還是會遇到很多問題只有在編譯過程中邊查邊做才知道是怎麼回事。

首先,VLC-Android官網只推薦在Linux系統上進行編譯,因此需要安裝Linux系統或者虛擬機器。
第二,既然是編譯Android程式,自然需要安裝Android SDK(而Android SDK又要求安裝JDK);另外,為了使用許多由C/C++語言編寫的第三方庫,需要安裝Android NDK。
第三,整個編譯過程通過shell指令碼進行,因此需要對shell命令有一定的瞭解,能夠使用常見的shell命令,能通讀指令碼,也才容易定位編譯出錯所在。
第四,編譯過程中,指令碼會通過git來從官網獲得程式碼,用wget從VLC官網或工具包官網下載大量依賴包,依賴包體積不大,但資源基本都是海外網站,因此如果想通過指令碼直接完成編譯,你必須要會翻牆(使用VPN)。然而我買了付費VPN翻了牆,下載速度還是很慢。所以,還是要會分析指令碼知道指令碼在做什麼,比如從哪個連結下載什麼包放到哪裡,這樣就可以通過迅雷等工具從其他地方下載依賴包後放到指定資料夾。指令碼中缺少部分工具時會聯網下載,用完後還刪了!刪了!比如gradle。雖然初衷是好的,但是這在需要重複編譯時簡直就是噩夢。所以,還可以修改程式碼,在本地存在一些依賴檔案時,不刪除、也不重複下載檔案。
第五,理想情況下只需要一條命令執行指令碼即可完成編譯,但是由於眾多的依賴包以及國內的牆,基本是不可能的。建議通讀指令碼後加入一些控制語句,類似斷點除錯一樣地執行指令碼。我五天的編譯時間基本都是耗在下載包以及關於依賴包的錯誤上。只要這些依賴包全部正確,通過指令碼編譯只是時間問題。

編譯大致流程

  1. Ubuntu下安裝JDK、SDK、NDK
  2. 安裝git等工具包以及automake等編譯工具包
  3. 各類環境變數的配置
  4. 使用git下載vlc-android程式碼
  5. 執行指令碼開始編譯

基礎操作

對後文中多次用到的shell命令,和一些操作方法進行統一的介紹。

1、安裝/解除安裝等需要許可權的命令前可以加sudo表示最大許可權
2、解壓(tar.gz與zip兩種壓縮包)

sudo tar zxvf ./xxx.tar.gz
unzip xxx.zip

3、聯網安裝Ubuntu程式

sudo apt-get install xxx

4、修改環境變數
開啟配置檔案~/.bashrc

gedit ~/.bashrc

在檔案末尾輸入環境變數,如:

export JAVA_HOME=/home/wkw/sdk/jdk1.8.0_121
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
//(注意,不使用export也可以正確配置,使用export後設定的環境變數可以在其他shell指令碼中通過$JAVA_HOME訪問,這在編譯指令碼中會用到)

儲存~/.bashrc,退出gedit。
重開一個終端即可使環境變數生效,或者在終端中輸入以下命令重新整理環境變數:

source ~/.bashrc

檢視環境變數:

echo $JAVA_HOME

Ubuntu編譯環境

編譯環境:Windows 10-64bit 下虛擬機器裝的 Ubuntu 16.04LTS-64bit
編譯版本:VLC-(2017.2.27由官網git地址得到,不知道是哪個版本,TESTED_HASH=cd47cfc)

安裝工具包

以下是官方文件提供的示例安裝命令,實際操作中建議一個一個安裝,以便知道安裝結果。

sudo apt-get install automake ant autopoint cmake build-essential libtool patch pkg-config protobuf-compiler ragel subversion unzip git

以下安裝包依賴其他包,ubuntu會自動一起下載安裝;部分包Ubuntu16.04已自帶(可更新):

安裝包 依賴包
automake autoconf autotools-dev libsigsegv2 m4
ant ant-optional ca-certificates-java default-jre-headless java-common openjdk-8-jre-headless
cmake cmake-data libjsoncpp1
libtool libltdl-dev
protobuf-compiler libprotoc9v5
git git-man liberror-perl
subversion libapr1 libaprutil1 libserf-1-1 libsvn1 (指令碼中使用git,多裝無妨)
unzip 解壓工具,已自帶

根據官網描述的所有包中,有部分包在示例安裝命令中沒有出現,做以下分析:

安裝包 描述
make mawk gcc g++ 已自帶
gawk 系統未帶,要安裝
nawk 找不到這個包,不需安裝,百度awk nawk mawk gawk的關係
protobuf 其安裝包名為protobuf-compiler,需要安裝。【新版VLC要求protobuf3】,見下文說明
curl wget 下載工具,需要安裝
gettext 需要0.19.3以上版本,已自帶0.19.7
yasm 如果要為x86裝置編譯,需要安裝

新版VLC要求使用protobuf3

我2017.2.27從官網git到的VLC在編譯環節要求使用protobuf3,而Ubuntu16.04預設的和通過protobuf-compiler安裝的是libprotoc2.6.1版本,編譯器libprotoc不認識VLC的protobuf3程式碼,會出現“Unrecognized syntax identifier “proto3””的錯誤。因此需要手動下載protobuf3,進行安裝。

1、檢視protobuf版本

protoc --version

2、下載:https://github.com/google/protobuf/releases/download/v3.1.0/protobuf-cpp-3.1.0.tar.gz
3、解壓安裝:

sudo tar zxvf ./protobuf-cpp-3.1.0.tar.gz    #解壓
cd ./protobuf-3.1.0/    #解壓出的資料夾
./configure    #執行configure
make
make check
sudo make install
make clean
sudo ldconfig  #更新shared library cache

若以上命令若許可權不夠(提示“permission denied”),可在命令前加sudo。
4、重開terminal檢視protobuf版本,顯示:libprotoc 3.1.0

Ubuntu安裝Oracle JDK

在ubuntu可以直接使用apt-get安裝openjdk,環境變數已配好,但是開發最好用oracle官方版本,並自行配環境變數。

1、下載:jdk-8u121-linux-x64.tar.gz
2、解壓

sudo tar zxvf ./jdk-8u121-linux-x64.tar.gz

2*、許可權:解壓出來的資料夾jdk-8u121-linux-x64右下角有鎖,表示有許可權限制,可在屬性中檢視訪問許可權。若要解除許可權可以給予root使用者許可權:

sudo chmod -R 777 jdk-8u121-linux-x64

給該資料夾遞迴地賦予root許可權,不過jdk一般只需只讀,所以沒必要
3、JDK環境變數(設定方法見本文開頭基礎知識部分)

#java jdk
export JAVA_HOME=/home/wkw/sdk/jdk1.8.0_121
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=.:$JRE_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_BIN=$JAVA_HOME/bin

請注意,重開terminal環境變數才生效,或者在終端中輸入source ~/.bashrc重新整理環境變數。
4、驗證:輸入以下命令,若輸出Java相關版本資訊說明JDK安裝成功

java -version

5、將安裝的JDK設定為ubuntu預設JDK
由於Ubuntu可以通過命令聯網安裝openJDK在根目錄下,這會導致Ubuntu將openJDK設定為預設的JDK(java -version出現“openjdk version 1.8.0_121”),需要將自己安裝的oracle JDK設為預設。方法如下:

#檢視根目錄的Java,目前只有openJDK
sudo update-alternatives --config java    

#將oracle JDK安裝到根目錄
sudo update-alternatives --install /usr/bin/java java /home/wkw/sdk/jdk1.8.0_121/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /home/wkw/sdk/jdk1.8.0_121/bin/javac 300

#再次檢視Java配置,輸入對應序號,選擇oracle JDK作為預設Java
sudo update-alternatives --config java

#再次驗證Java版本,可看到切換回了oracle Java
java -version

Ubuntu安裝Android SDK

在這之前最好先安裝好JDK,因為Android使用JDK

1、下載:tools_r25.2.3-linux.zip,Android Studio不是必須
2、解壓:新建一個資料夾android-sdk,並將tools.zip解壓在該資料夾下,解壓出的資料夾名為tools。

unzip tools_r25.2.3-linux.zip    #解壓出的資料夾名為tools

3、SDK環境變數

#android sdk
export ANDROID_SDK=/home/wkw/sdk/android-sdk    #VLC編譯指令碼只認 $ANDROID_SDK 環境變數
export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools

4、驗證:輸入android命令,若開啟了SDK Manager則說明SDK安裝成功,可在SDK Manager中下載需要的SDK版本。建議把5.0(API21)以上的SDK都安裝,後續編譯APK時對版本有要求

Ubuntu安裝Android NDK

最新VLC需要NDK r13以上版本

1、下載:android-ndk-r13b-linux-x86_64.zip
2、解壓

unzip android-ndk-r13b-linux-x86_64.zip    #解壓出的資料夾名為android-ndk-r13b

3、NDK環境變數

#android ndk
export ANDROID_NDK=/home/wkw/sdk/android-ndk-r13b  #VLC編譯指令碼只認 $ANDROID_NDK 環境變數
export PATH=$PATH:$ANDROID_NDK

4、驗證:

ndk-build

若出現“Android NDK: Could not find application project directory”表示NDK正確安裝,只是沒有待編譯的工程而已,可以android官網下載ndk samples進行編譯(這是一個ndk sample

配置VLC環境變數

為VLC指定要編譯的裝置型別,不設定環境變數時,預設採用armeabi-v7a。更多裝置型別請訪問官方編譯文件。

#vlc-android
export ANDROID_ABI=armeabi-v7a

開始編譯

下載vlc-android程式碼

使用git命令從VLC官網獲取最新vlc-android程式碼(約24M)

git clone https://code.videolan.org/videolan/vlc-android.git

注意:vlc-android只是編譯環境的程式碼,不是vlc原始碼。vlc原始碼(約400M)的git地址在vlc-android/compile.sh指令碼里定義

確認vlc版本

vlc-android只是編譯android apk所需環境的程式碼,其中的compile.sh指令碼是主程式,整個指令碼執行完畢會生成vlc播放器的apk。該指令碼中會下載vlc原始碼,並執行另外一個指令碼compile-libvlc.sh對vlc原始碼進行*.so類庫的編譯。如果只需vlc類庫,可只執行compile-libvlc.sh。這兩個指令碼是整個編譯過程的主要指令碼,通讀這兩個指令碼會對編譯過程有很大幫助。

親身體會!切忌用“不同版本”vlc-android的指令碼編譯“不同版本”的vlc程式碼,因為依賴的包不一樣。我就因為用官網最新的vlc-android與其中的指令碼編譯公司給我的較老版本,出現了很多問題。

剩下的編譯工作主要compile.sh與compile-libvlc.sh完成,因此接下來對這兩個指令碼進行解讀,弄懂指令碼在做什麼,才能對問題進行定位和解決。

compile.sh大綱

compile.sh分為以下部分:

#FUNCTIONS
指令碼兩個提示資訊函式的定義,以及對編譯環境(SDK環境變數等)的檢查。根據提示配置環境,問題不大。

#GRADLE
這好像是編譯APK所需的內容,如果沒有正確配置,指令碼會自己下載和安裝,容易卡在這裡。

#Configure gradle
對gradle進行配置,沒問題

#Fetch VLC source
下載VLC原始碼,並會使用指令碼中定義的TESTED_HASH對下載的原始碼進行校驗,容易卡在下載上。

#Make VLC
編譯VLC,傳入引數,執行compile-libvlc.sh進行編譯,是整個環節中最重要的部分,也是最容易出問題的部分。如果是隻編譯類庫,單獨執行compile-libvlc.sh即可(需配置ABI環境變數或者作為引數傳入指令碼)

#Compile the UI & RUN
指令碼會聯網下載VLC的安卓工程進行APK的編譯,這會耗點時間。其實通過#Make VLC後基本就是成功了,如果不需要AP可以跳過。

compile.sh解讀

下面,對最容易出錯的#GRADLE,#Fetch VLC source,#Make VLC 部分的指令碼進行說明。
以下指令碼中我已經加入了自己的“斷點除錯”和條件控制,目的是在某些包存在的情況下不再進行重複的下載、刪除,一來為了可以自己下載包放到路徑,二來為了方便重複編譯。要知道,整個編譯過程浪費在下載上的時間是最多的。

指令碼中我改動的部分都用#"wkw"進行了註釋。

GRADLE

#GRADLE部分會檢查作業系統是否安裝了gradle指定版本(這裡是3.3)。指令碼會檢查vlc-android目錄下是否存在gradle-3.3-all.zip安裝包,若不存在則下載,若存在則解壓到gradle-3.3資料夾。之後進入這個資料夾,執行gradle-3.3/bin/gradle指令碼,指令碼的作用是根據作業系統配置出一個Java命令,執行/gradle-3.3/gradle/wrapper/gradle-wrapper.jar包,該jar包作用是根據同資料夾下的gradle-wrapper.properties配置檔案下載gradle-3.3-bin.zip,下載地址由該配置檔案的distributionUrl屬性決定。因此,如果下載速度太慢,可以在這裡更換地址。

P.S.
使用本地已有的gradle-3.3-bin.zip的方式是,開啟根目錄下的隱藏資料夾./gradle(即/home/wkw/.gradle),將該包放置於類似這樣的路徑:/home/wkw/.gradle/wrapper/dists/gradle-3.3-bin/64bhckfm0iuu9gap9hg3r7ev2/gradle-3.3-bin.zip
重新執行指令碼即可。注意,如果此時存在/vlc-android/gradle/wrapper路徑,需要刪除,指令碼才能進入gradle的安裝步驟。

正確安裝gradle後會輸出gradle的版本資訊表明安裝成功。之後指令碼會將/vlc-android/gradle-3.3/gradle/wrapper/資料夾移動到/vlc-android/gradle/wrapper/,並以該資料夾是否存在,作為是否進行gradle安裝的判斷條件。(因此,使用上述本地gradle-3.3-bin.zip安裝前需要刪除該資料夾讓指令碼進入安裝流程)。

原指令碼的最後會刪除gradle-3.3-all.zip,建議註釋掉該行指令碼程式碼,保留安裝包以備後用。
還建議備份/gradle和/gradle-3.3資料夾,因為指令碼完成編譯後,好像會刪除這兩個資料夾。

該部分的指令碼和我的註釋如下:

##########
# GRADLE #
##########

read -p "wkw: press any key to start #GRADLE" wkwarg

if [ ! -d "gradle/wrapper" ]; then
    GRADLE_VERSION=3.3

    #wkw: 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}-all.zip
        wget ${GRADLE_URL} 2>/dev/null || curl -O ${GRADLE_URL}
        checkfail "gradle: download failed"
    else
        echo "wkw: #FUNCTIONS find local gradle-${GRADLE_VERSION}-all.zip"
    fi

    unzip -o gradle-${GRADLE_VERSION}-all.zip
    checkfail "gradle: unzip failed"

    #wkw: change gradle-v-bin.zip downloading url.
    echo "wkw: 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/wkw/.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." wkwarg

    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

    #wkw: keep this package.
    #rm -rf gradle-${GRADLE_VERSION}-all.zip
fi

echo "wkw: #GRADLE done."

Fetch VLC source

該步驟通過git下載官方最新的vlc原始碼。Windows下vlc程式碼400m,Linux下100m(檔案系統不一樣)。git地址:

git clone http://git.videolan.org/git/vlc.git vlc

你可以通過更快的方式git到vlc原始碼後放入/vlc-android/vlc。該指令碼會使用指令碼中的TESTED_HASH變數對vlc資料夾進行校驗。我遇到的情況是,2017.2.27從VLC原始碼下載頁下載到的vlc-2.2.4.zip解壓出的原始碼無法通過指令碼的驗證,只有從上述地址git的原始碼可以通過。也正因為這個校驗,如果使用新的compile.sh對舊的vlc原始碼進行編譯,會無法通過這個校驗。

Make VLC

該步驟將組織ANDROID_ABI等環境變數作為引數,傳給compile-libvlc.sh指令碼開始類庫的編譯過程。編譯過程中會檢查依賴的包是否安裝,未安裝則聯網下載。這個步驟成功後,基本就是成功了。

下面,對compile-libvlc.sh進行解讀,關鍵步驟在於其中的依賴包的安裝。
需要下載的內容主要位於以下兩個資料夾

/vlc-android/vlc/extras/tools
/vlc-android/vlc/contrib/tarballs

compile-libvlc.sh解讀

這裡只解讀compile-libvlc.sh中最重要和最容易出錯的部分,其他內容可以自行閱讀指令碼:

FLAGS

本步驟中最重要的是檢查作業系統安裝的NDK版本,程式碼如下。可以看到,要求的NDK版本為13以上。關於NDK的版本資訊需要自己看這部分的程式碼,之前用公司給的舊版本指令碼,這裡是寫死了要求版本11。

# try to detect NDK version
REL=$(grep -o '^Pkg.Revision.*[0-9]*.*' $ANDROID_NDK/source.properties |cut -d " " -f 3 | cut -d "." -f 1)

//require NDKv13 or later
if [ "$REL" -ge 13 ]; then
    if [ "${HAVE_64}" = 1 ];then
        ANDROID_API=21
    else
        ANDROID_API=9
    fi
else
    echo "You need the NDKv13 or later"
    exit 1
fi

Build buildsystem tools

該步驟會建立編譯所需的系統,會要求使用幾個工具包,若不存在這些包,則會聯網下載。存放位置位於位於

/vlc-android/vlc/extras/tools

,需要的安裝包如下:

  • libtool-2.4.2.tar.gz
  • automake-1.15.tar.gz
  • protobuf-3.1.0.tar.gz
  • pkg-config-0.28-1.tar.gz

指令碼需要的安裝包名、版本,都會輸出在命令列,可以根據這些提示用其他方式下載後放入上述資料夾。

P.S.
這裡有點疑問,在進行本步驟之前我已經安裝了protobuf-cpp-3.1.0.tar.gz,不知怎麼在這裡又再次要求下載protobuf-3.1.0.tar.gz,指令碼中命令的意思好像是二者選其一,難道這兩個包不一樣?我重新下載了protobuf-3.1.0.tar.gz放入/extras/tools後本步驟完成。(也許開篇關於protobuf3的步驟可以放到本步驟完成,待之後實驗後下定論)

Contribs

該步驟下載VLC程式碼依賴的包。由於依賴的包眾多,下載速度巨慢,該步驟成為了整個指令碼最容易出現的問題(缺少包、包版本不對等等)。好在所有依賴包會顯示在命令列,可以根據提示手動下載這些依賴包放進指定位置。出現下載慢的包時,終止指令碼。複製地址去下載,放入上述資料夾,重新執行指令碼。

該步驟中開始執行依賴檢查和下載工作的程式碼是以下這句:

make $MAKEFLAGS fetch
checkfail "contribs: make fetch failed"

指令碼會檢查依賴包是否位於以下路徑,若不存在,這聯網下載(超級慢)。

/vlc-android/vlc/contrib/tarballs

要求的包眾多,這裡就不列出來了。如果完成了該步驟,那麼剩下的就是水到渠成了。
P.S.
再次提示,不同編譯指令碼與不同vlc原始碼要求的依賴包版本不同,如果在該步驟反覆出錯,請檢查下載的vlc-android和vlc的版本。我就是吃了這個虧。

完成編譯

編譯成功後,可以在以下目錄找到編譯完成檔案:

  • /vlc-android/vlc-android/build/outputs/apk
    • VLC-Android-2.1.0-ARMv7.apk
  • /vlc-android/libvlc/jni/libs/armeabi-v7a
    • libvlc.so
    • libvlcjni.so
  • /vlc-android/libvlc/private_libs/libs/armeabi-v7a
    • libanw.10.so
    • libanw.13.so
    • libanw.14.so
    • libanw.18.so
    • libanw.21.so
    • libiomx.10.so
    • libiomx.13.so
    • libiomx.14.so

APK編譯成功
編譯完成

APK執行介面
這裡寫圖片描述

遇到的問題

  • 在compile.sh的#Compile the UI步驟,遇到了以下問題。

The SDK directory ‘/home/wkw/sdk/tools’ does not exist

解決:由於在compile.sh的#GRADLE 步驟完成之後,我改變了一次ANDROID_SDK的位置,而gradle已經配置好的SDK位置未能更新,解決方法是在/vlc-android/local.properties中修改SDK與NDK配置(或重新進行#GRADLE步驟獲取新的環境變數)

sdk.dir=/home/wkw/sdk/tools #修改為新的SDK地址
ndk.dir=/home/wkw/sdk/android-ndk-r13b

  • 在compile.sh的#Compile the UI步驟,還遇到了以下問題。

c compiler cannot create executables

實際上,追蹤命令列輸出,會提示你檢視config.log。檢視該檔案會發現,實際上並不是gcc的問題。根據日誌會查到,其實是Android SDK找不到導致的命令無效。原因起源於我在編譯了最新的官方版本後,又去編譯公司給的舊版本,而舊版本中的compile-libvlc.sh要求的版本是11,因此我從新版本那邊copy關於版本校驗的指令碼程式碼到舊版本指令碼中。觀察以下指令碼:

#新版指令碼
if [ "$REL" -ge 13 ]; then
    if [ "${HAVE_64}" = 1 ];then
        ANDROID_API=21
    else
        ANDROID_API=9
    fi
else
    echo "You need the NDKv13 or later"
    exit 1
fi
#舊版
case "$REL" in
    11*)
        if [ "${HAVE_64}" = 1 ];then
            ANDROID_API=android-21
        else
            ANDROID_API=android-9
        fi
    ;;
    *)
    echo "You need the NDKv11 or later"
    exit 1
    ;;
esac

二者除了對版本的判斷(11和>13)不同外,對ANDROID_API賦值也不一樣,新版中的API沒有”android-“字首!!!由於賦值貼上沒考慮到這個,導致API賦值錯誤,以致後面找不到API路徑,因此無法編譯。

參考

  1. Ubuntu檢視/修改環境變數PATH的方法
  2. Android NDK編譯C/C++為so共享物件
  3. Linux下編譯Android-VLC開源播放器詳解(13年的,太舊)
  4. vlc-android原始碼的編譯(16年)

後記

五天搞一個東西真的是要人命了,不過入了門後就好多了。目前已經兩次編譯成功,不過都是官網最新的版本。後面得把公司給的版本編譯過了才行。
本文到此結束,寫的是正確的安裝流程,所以規避了之前我遇到的很多問題。如果讀者有什麼問題可以留言,我知道的會回覆。希望能幫助到跟我一樣手忙腳亂過的萌新。

相關文章