Android新版的NDK移除GCC的编译,改为CLANG,FFmpeg的编译脚本也需要相应修改。以下脚本实测通过NDK20没问题。与GCC编译的脚本相比,主要修改点在几个地方:
1.TOOLCHAIN的路径变化,这是最重要的,从gcc的$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
修改到现地址
2.添加了cc和cxx,指定为clang编译,至于API的支持版本网上有,不要太低都能支持的
3.OPTIMIZE_CFLAGS里面-DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD
宏的目的是解决一些系统函数编译时提示mismatch,千万不要删除
4.可以修改的地方是disable和enable的各种功能,根据自己项目实际开发需要对库进行缩减
5.ARCH和CPU也是根据自己项目进行修改,不全部列举
【提个问】NDK20b和NDK14b编译出来的ffmpeg库在工程设置为NDK14的项目都可以正常运作,当工程的NDK设为20的时候,ffmpeg解码同样的音频流会出现两种格式?
#!/bin/bash
export NDK=/home/Android/android-ndk-r20b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/
API=21
#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 -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD"
echo "Compiling FFmpeg for $CPU"
./configure \
--prefix=$PREFIX \
--disable-asm \
--enable-neon \
--enable-hwaccels \
--enable-shared \
--enable-jni \
--enable-mediacodec \
--enable-decoders \
--disable-encoders \
--enable-postproc\
--enable-demuxers \
--enable-muxers \
--enable-parsers \
--enable-protocols \
--enable-decoder=h264_mediacodec \
--enable-hwaccel=h264_mediacodec \
--enable-gpl \
--disable-bsfs \
--disable-indevs \
--disable-outdevs \
--disable-filters \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--enable-avdevice \
--disable-symver \
--disable-ffserver \
--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 -j4
make install