FFmpeg历史版本:
http://www.ffmpeg.org/releases/
NDK的下载:android-ndk-r20b-linux-x86_64 (直接使用浏览器下载快)
wget https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip
解压:
unzip android-ndk-r20b-linux-x86_64.zip
FFmpeg的下载: ffmpeg-4.2
wget http://www.ffmpeg.org/releases/ffmpeg-4.2.tar.bz2
tar -xjf ffmpeg-4.2.tar.bz2
把结果压缩:(sz rz)
zip -r myfile.zip ./*
修改configure文件,3718行:
vim configure
set number
3718
# 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)'
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P9upfxe4-1655449531923)(https://raw.githubusercontent.com/liupanfeng/images/master/img/image-20220617141804740.png)]
#!/bin/bash
NDK=/home/ms/tools/ndk/android-ndk-r20b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
API=29
echo "开始编译中 NDK=$NDK"
#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"
./configure \
--prefix=$PREFIX \
--disable-neon \
--disable-x86asm \
--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 "FFmpeg编译完成了 cup=$CPU 恭喜你 Succes"
#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
CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
./configure \
--prefix=$PREFIX \
--disable-neon \
--disable-x86asm \
--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 "FFmpeg编译完成了 cup=$CPU 恭喜你 Succes"
#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"
./configure \
--prefix=$PREFIX \
--disable-neon \
--disable-x86asm \
--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 "FFmpeg编译完成了 cup=$CPU 恭喜你 Succes"
#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 "
./configure \
--prefix=$PREFIX \
--disable-neon \
--disable-x86asm \
--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 "FFmpeg编译完成了 cup=$CPU 恭喜你 Succes"
#derry update update update update is success
chmod 777 build.sh
sudo sh build.sh
编译成功后,在android文件下会产生编译产物
ABI:ABI即Application Binary Interface,定义了二进制接口(比如so文件)交互规则,以适用于不同CPU
Android目前支持以下七种ABI:armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64。
NDK以前支持mips,mips64,armeabi,但在NDK r17 移除了对这些ABI的支持。注意:NDK向前兼容(前,forward,未来),推荐使用app的minsdkVersion对应的编译平台,而不是最新。
手机是armeabi-v7a(ARMv7)CPU架构:会去兼容 armeabi(ARMv5)so库, armeabi-v7a(ARMv7)so库
手机是armeabi(ARMv5)CPU架构:不会去寻找armeabi-v7a(ARMv7)so库不会向高版本去寻找 报错
得出结论:AndroidStudio NDK 开发中,只需要一个 armeabi 低版本的就可以了,这也是为什么支付宝只有一个 armeabi 的原因(支付宝,后期可能会修改成 armeabi-v7a)
支付宝:armeabi(为什么支付宝 放入的是armeabi,为了兼容百分之99.9的手机)
QQ:armeabi(为什么QQ 放入的是armeabi,为了兼容百分之99.9的手机)
QQ音乐:armeabi (为什么QQ音乐 放入的是armeabi,为了兼容百分之99.9的手机) 以前是(现在是armeabi-v7a)
王者荣耀:armeabi-v7a (为什么王者荣耀 放入的是armeabi-v7a 而不是 armeabi,因为armeabi的手机会越来越少了,性能考虑)(浮点运算机制=硬浮点)
项目中具体需要支持那个指令集,根据实际情况来定。
下面是几篇对于CPU指令级的介绍文档连接:
https://www.cnblogs.com/liushilin/p/6292263.html
https://www.jianshu.com/p/b17f9b926f2b
https://blog.csdn.net/xx326664162/article/details/51163905
http://blog.csdn.net/xx326664162/article/details/51167849