1 背景
雖然交叉編譯技術(shù)已經(jīng)比較成熟脐往,但是一旦遇到問題依然很難排查膘茎,所以直接編譯任然是首選漆弄。Android系統(tǒng)基于Linux內(nèi)核,我們在進(jìn)行NDK開發(fā)時(shí)弄砍,編譯生成.so文件的過程仙畦,最好直接在Linux環(huán)境下進(jìn)行 。現(xiàn)以在CentOS7下編譯ffmpeg為例音婶,記錄整個(gè)過程慨畸。
- Linux x86_64
- CentOS7
- NDK r20
- ffmpeg 4.2
2 操作過程
2.1 安裝Git
- yum安裝
yum install git
- 查看yum源倉庫Git信息
yum info git
- 查看已安裝的Git版本
git --version
- 移除默認(rèn)安裝的Git
yum remove git
2.2 安裝ZIP/UNZIP
- 安裝支持ZIP的工具
yum install -y unzip zip
- 解壓zip文件
unzip 文件名.zip
- 壓縮成一個(gè)zip文件
zip 文件名.zip 待壓縮的文件夾或文件名稱
2.3 下載NDK并配置環(huán)境
- 下載NDK,下載鏈接可以在https://developer.android.google.cn/ndk/downloads/index.html找到
cd /download
wget https://dl.google.com/android/repository/android-ndk-r20-linux-x86_64.zip
- 解壓下載的.zip文件
unzip android-ndk-r20-linux-x86_64.zip -d ndk
- 配置環(huán)境變量
#修改~/.bashrc
vim ~/.bashrc
#在文件末尾添加
export NDKROOT=/home/tongbo/download/ndk/android-ndk-r20
export PATH=$NDKROOT:$PATH
#保存退出衣式,更新一下環(huán)境變量
source ~/.bashrc
#修改/etc/profile
vim /etc/profile
#在文件末尾添加
export NDKROOT=/home/tongbo/download/ndk/android-ndk-r20
export PATH=$NDKROOT:$PATH
#保存退出先口,更新一下環(huán)境變量
source /etc/profile
ndk-build
#輸入ndk-build命令,沒有出現(xiàn)ndk-build not found瞳收,說明NDK安裝成功
2.4 下載并編譯ffmpeg
- 修改configure文件
#養(yǎng)成備份的習(xí)慣
cp configure configure_bak
#vim打開configure
vim configure
#按o進(jìn)入編輯模式
Q:為什么要修改configure文件?
A:由于默認(rèn)編譯出來的動(dòng)態(tài)庫文件名含有版本號厢汹,形如“l(fā)ibavcodec.so.5.100.1”螟深,而Android平臺(tái)不能識(shí)別這樣的文件名,所以需要修改烫葬,使得編譯生成的文件形如“l(fā)ibavcodec.so”
#在打開的configure文件中找到:
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
#改成:
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
- 編寫編譯腳本build_bash.sh
#新建文件
touch build_bash.sh
#vim編輯
vim build_bash.sh
#按o進(jìn)入編輯模式
#!/bin/bash
NDK=/home/fanzhang/ffmpegwork/ndk/android-ndk-r20
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/
API=29
function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
--prefix=$PREFIX \
--disable-neon \
--disable-hwaccels \
--disable-gpl \
--disable-postproc \
--enable-shared \
--enable-jni \
--disable-mediacodec \
--disable-decoder=h264_mediacodec \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC
--cxx=$CXX
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}
#armv8-a
ARCH=arm64
CPU=armv8-a
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
#armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -
march=$CPU "
build_android
#x86
ARCH=x86
CPU=x86
CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -
mfpmath=sse -m32"
build_android
#x86_64
ARCH=x86_64
CPU=x86-64
CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
- 執(zhí)行build_bash.sh編譯文件
#添加執(zhí)行權(quán)限
sudo chmod +x build_bash.sh
#輸入root密碼
#執(zhí)行build_bash.sh文件
./build_bash.sh
編譯結(jié)束將在build_bash.sh文件所在文件夾生成android文件夾界弧,里面按照CPU架構(gòu)分成多個(gè)子文件夾,打開任意一個(gè)架構(gòu)文件夾搭综,里面包含include文件夾垢箕、lib文件夾、share文件夾:
- include文件夾包含頭文件
- lib文件夾包含.so文件
- share文件夾包含.c/.cpp文件
將三個(gè)文件夾移入samba服務(wù)器管理的共享文件夾即可在windows下使用兑巾。