1、ffmpeg
#!/bin/bash
# ndk路径
NDK=/ff/ndk/android-ndk-r21b
# 编译工具链目录,ndk17版本以上用的是clang,以下是gcc
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# 版本号
API=21
# 交叉编译树的根目录(查找相应头文件和库用)
SYSROOT="${TOOLCHAIN}/sysroot"
#armv7-a
OUTPUT_FOLDER="armeabi-v7a"
ARCH="arm"
CPU="armv7-a"
TOOL_CPU_NAME=armv7a
TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-androideabi"
OPTIMIZE_CFLAGS="-march=$CPU"
# arm64-v8a,这个指令集最低支持api21
# OUTPUT_FOLDER="arm64-v8a"
# ARCH="aarch64"
# CPU="armv8-a"
# TOOL_CPU_NAME=aarch64
# TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
# OPTIMIZE_CFLAGS="-march=$CPU"
#x86
#OUTPUT_FOLDER="x86"
#ARCH="x86"
#CPU="x86"
#TOOL_CPU_NAME="i686"
#TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
#OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
# x86_64,这个指令集最低支持api21
# OUTPUT_FOLDER="x86_64"
# ARCH="x86_64"
# CPU="x86_64"
# TOOL_CPU_NAME="x86_64"
# TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
# OPTIMIZE_CFLAGS="-march=$CPU"
# 输出目录
PREFIX="${PWD}/android/$OUTPUT_FOLDER"
# so的输出目录, --libdir=$LIB_DIR 可以不用指定,默认会生成在$PREFIX/lib目录中
#LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
# 编译器
CC="${TOOL_PREFIX}${API}-clang"
CXX="${TOOL_PREFIX}${API}-clang++"
# 执行 configure 脚本生成 Makefile 构建脚本
./configure \
--prefix=$PREFIX \
--disable-programs \
--disable-avdevice \
--enable-cross-compile \
--cc=$CC \
--cxx=$CXX \
--sysroot=$SYSROOT \
--extra-cflags="$FLAGS" \
--arch=$ARCH \
--target-os=android
# 清除之前的编译内容
make clean
# 开启新的 FFMPEG 编译
make install
2、x264
#!/bin/bash
echo ">>>>>>>>> build x264 for android arm-v7a <<<<<<<<"
#NDK位置,编译结果保存位置
export NDK=/ff/ndk/android-ndk-r21b
export TARGET=$(pwd)/android/arm
#C、C++编译器所在位置
export PLATFORM=linux-x86_64
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$PLATFORM
export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++
function build
{
echo ">>>>>>>> build start <<<<<<<<<<"
./configure \
--prefix=$TARGET \
--enable-static \
--enable-shared \
--enable-pic \
--host=arm-linux \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot=$TOOLCHAIN/sysroot \
make clean
make
make install
echo ">>>>>> build done <<<<<<"
}
build
3、ffmpeg_width_x264
#!/bin/bash
# ndk路径
NDK=/ff/ndk/android-ndk-r21b
X264=/ff/x264/x264-snapshot-20191217-2245
# 编译工具链目录,ndk17版本以上用的是clang,以下是gcc
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export PKG_CONFIG_PATH=/ff/x264/x264-snapshot-20191217-2245/android/arm/lib/pkgconfig;
# 版本号
API=21
# 交叉编译树的根目录(查找相应头文件和库用)
SYSROOT="${TOOLCHAIN}/sysroot"
#X264
X264_INCLUDE=$X264/android/arm/include
X264_LIB=$X264/android/arm/lib
#armv7-a
OUTPUT_FOLDER="armeabi-v7a"
ARCH="arm"
CPU="armv7-a"
TOOL_CPU_NAME=armv7a
TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-androideabi"
OPTIMIZE_CFLAGS="-march=$CPU"
# arm64-v8a,这个指令集最低支持api21
# OUTPUT_FOLDER="arm64-v8a"
# ARCH="aarch64"
# CPU="armv8-a"
# TOOL_CPU_NAME=aarch64
# TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
# OPTIMIZE_CFLAGS="-march=$CPU"
#x86
#OUTPUT_FOLDER="x86"
#ARCH="x86"
#CPU="x86"
#TOOL_CPU_NAME="i686"
#TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
#OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
# x86_64,这个指令集最低支持api21
# OUTPUT_FOLDER="x86_64"
# ARCH="x86_64"
# CPU="x86_64"
# TOOL_CPU_NAME="x86_64"
# TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
# OPTIMIZE_CFLAGS="-march=$CPU"
# 输出目录
PREFIX="${PWD}/android/$OUTPUT_FOLDER"
# so的输出目录, --libdir=$LIB_DIR 可以不用指定,默认会生成在$PREFIX/lib目录中
#LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
# 编译器
CC="${TOOL_PREFIX}${API}-clang"
CXX="${TOOL_PREFIX}${API}-clang++"
# 执行 configure 脚本生成 Makefile 构建脚本
./configure \
--prefix=$PREFIX \
--disable-programs \
--disable-avdevice \
--enable-gpl \
--enable-libx264 \
--enable-cross-compile \
--cc=$CC \
--cxx=$CXX \
--sysroot=$SYSROOT \
--extra-cflags="$OPTIMIZE_CFLAGS" \
--arch=$ARCH \
--target-os=android
# 清除之前的编译内容
make clean
# 开启新的 FFMPEG 编译
make install
(1) .build_ffmpeg.sh (windows)
#!/bin/bash
#未开启硬件编码
# 清空上次的编译
make clean
#你自己的NDK路径.
export NDK=/D/java/ff/ndk/android-ndk-r21e
function build() {
echo "Compiling FFmpeg for $CPU"
./configure \
--prefix="$PREFIX" \
--libdir="$LIB_DIR" \
--enable-small \
--enable-shared \
--enable-static \
--enable-jni \
--disable-asm \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix="$CROSS_PREFIX" \
--cc="$CC" \
--cxx="$CXX" \
--sysroot="$SYSROOT" \
--extra-cflags="-O3 -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="-O3 -fpic $OPTIMIZE_CFLAGS" \
--arch="$ARCH" \
--target-os=android
make clean
make
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}
#function build_shared() {
# make clean
# $CC "$C_FLAGS" -shared -o libffmpeg.so -Wl,--whole-archive libavcodec.a libavformat.a libswresample.a libavfilter.a libavutil.a libswscale.a -Wl,--no-whole-archive
#}
# 编译工具链目录,ndk17版本以上用的是clang,以下是gcc
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/windows-x86_64
# 版本号
API=21
# 交叉编译树的根目录(查找相应头文件和库用)
SYSROOT="${TOOLCHAIN}/sysroot"
#ADDI_CFLAGS="-fPIE -pie -march=armv7-a -mfloat-abi=softfp -mfpu=neon"
ADDI_LDFLAGS="-fPIE -pie"
#armv7-a
OUTPUT_FOLDER="armeabi-v7a"
ARCH="arm"
CPU="armv7-a"
PREFIX="${PWD}/android/$OUTPUT_FOLDER"
LIB_DIR="$PREFIX/libs"
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
#armv8-a
#OUTPUT_FOLDER="arm64-v8a"
#ARCH=arm64
#CPU=armv8-a
#PREFIX="${PWD}/android/$OUTPUT_FOLDER"
#LIB_DIR="$PREFIX/libs"
#CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
#CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
#CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
#OPTIMIZE_CFLAGS="-march=$CPU"
#x86 针对x86需要设置--disable-asm \,不然运行时会报错:“文件中有重定位”
#OUTPUT_FOLDER="x86"
#ARCH=x86
#CPU=x86
#PREFIX="${PWD}/android/$OUTPUT_FOLDER"
#LIB_DIR="$PREFIX/libs"
#CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
#CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
#CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
#OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
#C_FLAGS="--sysroot=/root/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"
#x86_64
#OUTPUT_FOLDER="x86_64"
#ARCH=x86_64
#CPU=x86_64
#PREFIX="${PWD}/android/$OUTPUT_FOLDER"
#LIB_DIR="$PREFIX/libs"
#CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
#CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
#CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
#OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
build
#build_shared
(2) .merge_static_to_share.sh (windows)
function merge_static_to_share() {
"${CROSS_PREFIX}"ld \
-rpath-link="$SYSROOT"/usr/lib \
-L"$SYSROOT"/usr/lib \
-soname libffmpeg.so -shared -Bsymbolic --whole-archive -o \
"$PREFIX"/lib/libffmpeg.so \
"$PREFIX"/lib/libavcodec.a \
"$PREFIX"/lib/libavfilter.a \
"$PREFIX"/lib/libswresample.a \
"$PREFIX"/lib/libavformat.a \
"$PREFIX"/lib/libavutil.a \
"$PREFIX"/lib/libswscale.a \
-lstdc++ -fPIC -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
"$CROSS_GCC_LIB"/libgcc.a
}
export NDK=/D/java/ff/ndk/android-ndk-r21e
HOST_OS_ARCH=windows-x86_64
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/windows-x86_64
SYSROOT="${TOOLCHAIN}/sysroot"
OUTPUT_FOLDER="x86"
PREFIX="${PWD}/android/$OUTPUT_FOLDER"
TOOLCHAIN_PATH=$NDK/toolchains/x86-4.9/prebuilt/$HOST_OS_ARCH
TOOLCHAIN_PREFIX=i686-linux-android
CROSS_PREFIX=$TOOLCHAIN_PATH/bin/$TOOLCHAIN_PREFIX-
CROSS_GCC_LIB=$TOOLCHAIN_PATH/lib/gcc/$TOOLCHAIN_PREFIX/4.9.x
merge_static_to_share