背景:在Mac下编译FFmpeg库时,看了比较多的教程基本都失败,偶然间发现NDK在去GCC化,需要通过交叉编译来完成编译,这里记录下NDK交叉编译链过程
地址 https://developer.android.google.cn/ndk/guides/standalone_toolchain
简单说交叉编译就是在A平台下编译B平台上可以使用的二进制库文件。
环境
操作系统:mac os 10.14.2
ndk版本:android-ndk-r20
编译器:clang
选择工具链(toolchain)
android平台目前的架构有armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips,在编译不同平台架构的库时,我们需要指定不同的交叉编译链来完成编译的工作,具体对应关系如下表:
ABI | toolchain |
---|---|
armeabi-v7a | armv7a-linux-androideabi |
arm64-v8a | aarch64-linux-android |
x86 | i686-linux-android |
x86-64 | x86_64-linux-android |
具体对应工具链的地址是在$NDK_HOME/toolchains目录中
制作工具链(toolchain)
NDK提供make-standalone-toolchain.sh shell脚本以允许我们从命令行执行定制的工具链安装,脚本位于 NDK是NDK的安装根目录,本文中也就是~/Library/Android/sdk/ndk-bundle目录,自行编写一个脚本
#!/bin/sh
export DEV=~/Library/Android/sdk
export NDK_HOME=~/Library/Android/sdk/ndk-bundle
platform=android-21
shmake=$NDK_HOME/build/tools/make-standalone-toolchain.sh
archs=(
'arm'
'arm64'
'x86'
'x86_64'
)
toolchains=(
'arm-linux-androideabi-4.9'
'aarch64-linux-android-4.9'
'x86-4.9'
'x86_64-4.9'
)
echo $NDK_HOME
num=${#archs[@]}
for ((i=0;i<$num;i++))
do
sh $shmake --arch=${archs[i]} --platform=$platform --install-dir=$NDK_HOME/Chain/android-toolchain/${archs[i]} --toolchain=${toolchains[i]}
done
把脚本保存为make_toolchain.sh,并添加执行权限。运行该脚本后,会在–install-dir的制定目录下生成对应的工具链文件夹
具体编译FFMPEG过程见下篇
Mac下编译FFMPEG for Android