NDKr21使用clang交叉编译ffmpeg4.4

由于ffmpeg和NDK都是在不断进行迭代的,比如说NDK在r18之后之后彻底移除了gcc(包含r18版本),ffmpeg在4.o版本开始也针对Android平台的交叉编译默认使用clang编译,但是网上的很多资料都是使用gcc编译的。
所以如果要对照网上资料进行编译的话,保证NDK版本和ffmpeg版本甚至是编译环境工具都和作者的一样,这样会大大提高编译的成功率。
在编译成功之后再不断尝试修改参数结合搜索资料尝试,力求弄清楚每个参数的意义,做到触类旁通。

本次编译使用的是macbook,使用的NDK版本是r21(21.4.7075529),ffmpeg则是目前最新版4.4

说明:

  1. 从官网下载好ffmpeg新版本之后,解压进入到FFmpeg目录中,使用命令vi  build.sh创建shell脚本,
  2. 更改NDK目录及CFLAG参数,其中CFLAG参数这么长,怎么来的?其实这个不用死记,可以从AS NDK工程的.externativeBuild/cmake/debug/armeabi-v7a/build.ninja中拷贝,需要注意的是替换掉NDK的路径地址。 与网上gcc编译的脚本对比可以发现少了一些类似--sysroot这样的参数。
  3. 保存后运行脚本./build.sh。运行脚本的时候可能会遇到没有权限的问题,运行命令行chmod +x build.sh增加一下执行权限后再次执行即可进行编译。 

如果没有报错,大概几分钟后就能看编译成功。

NDKr21使用clang交叉编译ffmpeg4.4

如果报错,大家可以按照Clang编译FFmpeg常见问题此文章进行修改。

 

本次笔者编译使用的shell脚本如下:

#!/bin/bash
# 将NDK的路径替换成你自己的NDK路径
NDK=/Users/yonglin/Library/Android/sdk/ndk/21.4.7075529
API=21
# arm aarch64 i686 x86_64
ARCH=arm
# 指定目标cpu的架构 armv7a aarch64 i686 x86_64
PLATFORM=armv7a

TARGET=$PLATFORM-linux-androideabi

# 设置工具链mac苹果电脑的是darwin-x86_64 而如果是linux的话则是linux-x86_64

TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin

# 设置编译产物的输出目录,这里表示在当前目录下新建Android_out目录
PREFIX=./Android_out/$PLATFORM

CFLAG="-D__ANDROID_API__=$API -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security   -O0 -fno-limit-debug-info  -fPIC"

build_one()
{
#执行configure脚本,用于生成makefile
./configure \
--ln_s="cp -rf" \
--prefix=$PREFIX \
# 指定交叉编译工具
--cc=$TOOLCHAIN/$TARGET$API-clang \
--cxx=$TOOLCHAIN/$TARGET$API-clang++ \
--ld=$TOOLCHAIN/$TARGET$API-clang \
# 设置android目标平台之后编译出来的动态库不带版本号,方便JNI调用
--target-os=android \
--arch=$ARCH \
--cpu=$PLATFORM \
--cross-prefix=$TOOLCHAIN/$ARCH-linux-androideabi- \
# 开启交叉编译
--enable-cross-compile \
--enable-shared \
--disable-static \
--enable-runtime-cpudetect \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
# 优化大小
--enable-small \
--enable-gpl \
--enable-nonfree \
--enable-version3 \
--disable-iconv \
--enable-neon \
--enable-hwaccels \
--enable-jni \
--enable-mediacodec \
# 关闭avdevice模块,此模块在android中无用
--disable-avdevice  \
--disable-decoders \
--enable-decoder=vp9 \
--enable-decoder=h264 \
--enable-decoder=mpeg4 \
--enable-decoder=aac \
--enable-decoder=h264_mediacodec \
--disable-postproc \
# 会传给编译器的参数
--extra-cflags="$CFLAG" \
--extra-ldflags="-marm"
}

build_one

make clean

# 使用4条线程进行编译,增加编译速度
make -j4

make install

 

上一篇:#pragma warning(disable: n)将某个警报置为失效


下一篇:SAP Spartacus B2B 页面 Disable 按钮的显示原理