Android ubuntu20.04 android-ndk-r20b编译 ffmpeg4.2 四大平台

1.资源下载

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 ./*


2.修改configure,去掉了打包生成的数字后缀

修改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)]

3.编译脚本

#!/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

4.进行编译操作

chmod 777 build.sh
sudo sh build.sh

5.编译结果

编译成功后,在android文件下会产生编译产物

image-20220617150457222

6.ABI指令集兼容分析

ABI:ABI即Application Binary Interface,定义了二进制接口(比如so文件)交互规则,以适用于不同CPU

Android目前支持以下七种ABI:armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64。

image-20220617144536009

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

猜你喜欢

转载自blog.csdn.net/u014078003/article/details/125333870