从零开始,手把手教你如何在Ubuntu下编译VLC-Android源码

前言

公司项目中使用的libvlcjni.so库文件,有点老,对Android 6.0+系统兼容性太差了,当程序运行在Android6.0+系统上时,回弹出警告框,提示libvlcjni.so:text relocations异常,虽然,程序播放视频没有问题,但是,总是弹出提示框就非常不友好了,为此,就需要重新编译一个新的库文件。
由于,在编译中遇到了一大堆难题,足足花了3天时间才将VLC-Android源码编译成功。期间在网上查找了不少参考资料,但是,大都介绍太过详细,好多地方没有将清楚,非常容易误导他人,所以,决定下一篇详细的教程来记录此次编译的过程,希望能给大家带来帮助。
特别感谢 从零开始在Linux编译VLC-Android开源项目 这篇博客给我带来的帮助!
本博客同步发布于XueLong的博客

VLC简介

VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。VLC使用C语言开发,可跨平台编译为其他系统所用;VLC-android是将VLC编译为Android可调用类库(*.so)的工程。
VLC官网
VLC-Android编译官方文档

编译系统配置

  • 编译系统环境为:Windows 10 企业版(版本1607)下 VMware Workstation 12 Pro(12.5.0 build-4352439)中安装的 Ubuntu16.04 LTS 64位 虚拟机。保证有一个稳定的网络环境,即使不能FQ也可以完成本次编译。
  • 本次编译的VLC-Android版本为2.1.16,代码时间为2017-08-10,SHA1 ID:6a04fdb0f10daf70ec4cc449c78d53c2a379f399
  • 本次编译的VLC版本未知,代码时间为2017-08-23,SHA1 ID:85f0e45b2304afa64ace2e3f0ddc19ad8b5accfb
  • VLC编译环境代码 git clone https://code.videolan.org/videolan/vlc-android.git
  • vlc源码 git clone http://git.videolan.org/git/vlc.git vlc

编译环境配置

  • 编译VLC源码需要安装 JDK、NDK、SDK、automake、ant、autopoint、cmake、build-essential、 libtool、patch、pkg-config、protobuf-compiler、ragel、subversion、unzip、git
  • 为了解决编译过程中不能下载 build.gradle 中的依赖环境问题,建议安装Android-Studio

JDK安装及环境变量配置

  • 1、下载jdk

jdk-8u144-linux-x64.tar.gz

  • 2、解压并赋权限
sudo tar zxvf ./jdk-8u144-linux-x64.tar.gz
sudo chmod -R 777 jdk-8u144-linux-x64

如果你下载的是zip格式的则使用下面的命令进行解压

unzip jdk-8u144-linux-x64.zip
  • 3、配置环境变量

打开配置文件

sudo gedit ~/.bashrc

在配置文件文本末尾输入环境变量,保存并退出

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

使环境变量生效

source ~/.bashrc

验证是否配置成功

java -version
  • 4、设置为ubuntu默认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配置,输入对应序号,选择oracle JDK作为默认Java

SDK安装及环境变量配置

  • 1、下载

android-sdk_r24.4.1-linux

  • 2、解压,将解压后的文件夹命名为 android-sdk
sudo tar zxvf ./android-sdk_r24.4.1-linux.tar
  • 3、配置环境变量

打开配置文件

sudo gedit ~/.bashrc

在配置文件文本末尾输入环境变量,保存并退出

export ANDROID_SDK=/home/skylark/Software/android-sdk   #VLC编译脚本只认 $ANDROID_SDK 环境变量
export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools

使环境变量生效

source ~/.bashrc

验证是否配置成功

android list target

NDK安装及环境变量配置

  • 1、下载

android-ndk-r13b-linux-x86_64

  • 2、解压
unzip android-ndk-r13b-linux-x86_64.zip
  • 3、配置环境变量

打开配置文件

sudo gedit ~/.bashrc

在配置文件文本末尾输入环境变量,保存并退出

export ANDROID_NDK=/home/skylark/Software/android-ndk-r13b   #VLC编译脚本只认 $ANDROID_NDK 环境变量
export PATH=$PATH:$ANDROID_NDK

使环境变量生效

source ~/.bashrc

验证是否配置成功

ndk-build --version

Android Studio安装

为了解决编译过程中不能下载 build.gradle 中的依赖环境问题,建议安装Android-Studio
如果你可以FQ的话,可以跳过次步骤

android-studio-ide-162.3871768-linux.zip

Android Studio的安装比较简单,由于篇幅的原因,这里就不再介绍了,记得安装时的SDK路径和NDK路径选择上面步骤中我们自己的路径。

官方推荐工具包安装

官方给出了一条指令 sudo apt-get install automake ant autopoint cmake build-essential libtool patch pkg-config protobuf-compiler ragel subversion unzip git 来安装所需要的包环境,建议自己逐条安装,一步一步来,以便清楚的了解到每个包的安装情况。

protobuf3编译及安装

我所使用的代码,在编译环节要求使用protobuf3,而通过protobuf-compiler安装的是libprotoc2.6.1版本,会出现“Unrecognized syntax identifier “proto3”的错误。因此需要手动下载protobuf3,进行安装。
这里我采用的是直接下载protobuf-3.0.0的源码,然后进行编译安装
Google Github Protobuf 安装介绍

  • 1、下载

protobuf-3.0.0.tar.gz

  • 2、编译工具准备
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/     #解压出的文件夹

在执行 ./autogen.sh 命令时,需要从Q外下载一个 gmock-1.7.0.zip 包,但是,由于网络原因下载失败,所以先提前下载。解压下载的文件,将文件夹重命名为 gmock,并移动到 protobuf-3.0.0 文件夹下。

  • 5、编译安装
cd ./protobuf-3.0.0/     #解压出的文件夹
./autogen.sh    #首先生成configure脚本
./configure    #运行configure
make
make check
sudo make install
sudo ldconfig # refresh shared library cache.   #千万不要漏掉了 .
./configure --prefix=/usr   #更改安装到/usr
  • 6、验证是否安装成功
protoc --version

VLC环境变量配置

为VLC指定要编译的设备类型,不设置环境变量时,默认采用 armeabi-v7a

打开配置文件

sudo gedit ~/.bashrc

在配置文件文本末尾输入环境变量,保存并退出

export ANDROID_ABI=armeabi-v7a

使环境变量生效

source ~/.bashrc

编译开始

经过上面复杂的环境变量配置及编译工具安装,现在我们终于要开始真正的VLC源码编译了

vlc-andorid源码下载

  • 克隆vlc-android源码到本地
git clone https://code.videolan.org/videolan/vlc-android.git    #使用git命令从VLC官网获取最新vlc-android代码 
  • 克隆vlc源码到本地
cd ./vlc-android/
git clone http://git.videolan.org/git/vlc.git vlc   #使用git命令从VLC官网获取最新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标签中的配置修改如下
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."
  • 将项目导入到 Android Studio

在编译过程中,脚本会去自动下载编译APK所需要的依赖包,但是由于网络原因很难下载下来。
由于公司内部网络不能FQ,所以没有办法下载。但是,想到每次在使用Android Studio时总是可以下载下来的,于是我就将 vlc-andorid 项目导入到 Android Studio ,虽然同步失败了,显示有许多错误,但是,当再次执行 compile.sh 脚本时,竟然破天荒的下载成功了!

  • 执行 compile.sh 脚本,开始编译

如果你看到下面的提示,恭喜你成功了!

vlc_android.png

编译完成

编译成功后的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

编译出错解决

  • 如果在执行compile.sh脚本时,遇到SDK或NDK环境变量未指定,则修改compile.sh,手动写死环境变量
ANDROID_SDK=/home/skylark/Software/android-sdk
ANDROID_NDK=/home/skylark/Software/android-ndk-r13b
ANDROID_ABI=armeabi-v7a
  • 如果在执行compile.sh脚本时,遇到 compile.sh: line 283: ./compile-libvlc.sh: Permission denied
    ,则修改compile.sh
#./compile-libvlc.sh $OPTS
sh compile-libvlc.sh $OPTS
  • 如果在执行compile.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源码的步骤。

如果你在参考过程中遇到问题,可以在我的联系方式中给我提问。

后面会继续介绍,Android的相关知识,欢迎继续关注我博客的更新。

参考资源

转载请注明:XueLong的博客 » 从零开始,手把手教你如何在Ubuntu下编译VLC-Android源码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容