ffmpeg: add support of specifying Android ABI version when building FFmpeg

Also add proper error message when using NDK that doesn't support requested ABI version.
This commit is contained in:
Alexey Rochev 2023-12-06 21:32:58 +03:00 committed by tonihei
parent 90a0cbdf3d
commit 6874cc80cf
2 changed files with 39 additions and 11 deletions

View File

@ -29,7 +29,7 @@ FFMPEG_MODULE_PATH="$(pwd)/libraries/decoder_ffmpeg/src/main"
``` ```
* Download the [Android NDK][] and set its location in a shell variable. * Download the [Android NDK][] and set its location in a shell variable.
This build configuration has been tested on NDK r21. This build configuration has been tested on NDK r26b (r23c if ANDROID_ABI is 16).
``` ```
NDK_PATH="<path to Android NDK>" NDK_PATH="<path to Android NDK>"
@ -41,6 +41,12 @@ NDK_PATH="<path to Android NDK>"
HOST_PLATFORM="linux-x86_64" HOST_PLATFORM="linux-x86_64"
``` ```
* Set the ABI version for native code (typically it's equal to minSdk and must not exceed it):
```
ANDROID_ABI=16
```
* Fetch FFmpeg and checkout an appropriate branch. We cannot guarantee * Fetch FFmpeg and checkout an appropriate branch. We cannot guarantee
compatibility with all versions of FFmpeg. We currently recommend version compatibility with all versions of FFmpeg. We currently recommend version
6.0: 6.0:
@ -74,7 +80,7 @@ ln -s "$FFMPEG_PATH" ffmpeg
``` ```
cd "${FFMPEG_MODULE_PATH}/jni" && \ cd "${FFMPEG_MODULE_PATH}/jni" && \
./build_ffmpeg.sh \ ./build_ffmpeg.sh \
"${FFMPEG_MODULE_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ENABLED_DECODERS[@]}" "${FFMPEG_MODULE_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ANDROID_ABI}" "${ENABLED_DECODERS[@]}"
``` ```
## Build instructions (Windows) ## Build instructions (Windows)

View File

@ -16,11 +16,17 @@
# #
set -eu set -eu
FFMPEG_MODULE_PATH=$1 FFMPEG_MODULE_PATH="$1"
NDK_PATH=$2 echo "FFMPEG_MODULE_PATH is ${FFMPEG_MODULE_PATH}"
HOST_PLATFORM=$3 NDK_PATH="$2"
ENABLED_DECODERS=("${@:4}") echo "NDK path is ${NDK_PATH}"
JOBS=$(nproc 2> /dev/null || sysctl -n hw.ncpu 2> /dev/null || echo 4) HOST_PLATFORM="$3"
echo "Host platform is ${HOST_PLATFORM}"
ANDROID_ABI="$4"
echo "ANDROID_ABI is ${ANDROID_ABI}"
ENABLED_DECODERS=("${@:5}")
echo "Enabled decoders are ${ENABLED_DECODERS[@]}"
JOBS="$(nproc 2> /dev/null || sysctl -n hw.ncpu 2> /dev/null || echo 4)"
echo "Using $JOBS jobs for make" echo "Using $JOBS jobs for make"
COMMON_OPTIONS=" COMMON_OPTIONS="
--target-os=android --target-os=android
@ -45,12 +51,28 @@ for decoder in "${ENABLED_DECODERS[@]}"
do do
COMMON_OPTIONS="${COMMON_OPTIONS} --enable-decoder=${decoder}" COMMON_OPTIONS="${COMMON_OPTIONS} --enable-decoder=${decoder}"
done done
ARMV7_CLANG="${TOOLCHAIN_PREFIX}/armv7a-linux-androideabi${ANDROID_ABI}-clang"
if [[ -e "${TOOLCHAIN_PREFIX}" && ! -e "$ARMV7_CLANG" ]]
then
echo "AVMv7 Clang compiler with path $ARMV7_CLANG does not exist"
echo "It's likely your NDK version doesn't support ANDROID_ABI $ANDROID_ABI"
echo "Either use older version of NDK or raise ANDROID_ABI (be aware that ANDROID_ABI must not be greater than your application's minSdk)"
exit 1
fi
ANDROID_ABI_64BIT="$ANDROID_ABI"
if [[ "$ANDROID_ABI_64BIT" -lt 21 ]]
then
echo "Using ANDROID_ABI 21 for 64-bit architectures"
ANDROID_ABI_64BIT=21
fi
cd "${FFMPEG_MODULE_PATH}/jni/ffmpeg" cd "${FFMPEG_MODULE_PATH}/jni/ffmpeg"
./configure \ ./configure \
--libdir=android-libs/armeabi-v7a \ --libdir=android-libs/armeabi-v7a \
--arch=arm \ --arch=arm \
--cpu=armv7-a \ --cpu=armv7-a \
--cross-prefix="${TOOLCHAIN_PREFIX}/armv7a-linux-androideabi16-" \ --cross-prefix="${TOOLCHAIN_PREFIX}/armv7a-linux-androideabi${ANDROID_ABI}-" \
--nm="${TOOLCHAIN_PREFIX}/llvm-nm" \ --nm="${TOOLCHAIN_PREFIX}/llvm-nm" \
--ar="${TOOLCHAIN_PREFIX}/llvm-ar" \ --ar="${TOOLCHAIN_PREFIX}/llvm-ar" \
--ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \ --ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \
@ -65,7 +87,7 @@ make clean
--libdir=android-libs/arm64-v8a \ --libdir=android-libs/arm64-v8a \
--arch=aarch64 \ --arch=aarch64 \
--cpu=armv8-a \ --cpu=armv8-a \
--cross-prefix="${TOOLCHAIN_PREFIX}/aarch64-linux-android21-" \ --cross-prefix="${TOOLCHAIN_PREFIX}/aarch64-linux-android${ANDROID_ABI_64BIT}-" \
--nm="${TOOLCHAIN_PREFIX}/llvm-nm" \ --nm="${TOOLCHAIN_PREFIX}/llvm-nm" \
--ar="${TOOLCHAIN_PREFIX}/llvm-ar" \ --ar="${TOOLCHAIN_PREFIX}/llvm-ar" \
--ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \ --ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \
@ -78,7 +100,7 @@ make clean
--libdir=android-libs/x86 \ --libdir=android-libs/x86 \
--arch=x86 \ --arch=x86 \
--cpu=i686 \ --cpu=i686 \
--cross-prefix="${TOOLCHAIN_PREFIX}/i686-linux-android16-" \ --cross-prefix="${TOOLCHAIN_PREFIX}/i686-linux-android${ANDROID_ABI}-" \
--nm="${TOOLCHAIN_PREFIX}/llvm-nm" \ --nm="${TOOLCHAIN_PREFIX}/llvm-nm" \
--ar="${TOOLCHAIN_PREFIX}/llvm-ar" \ --ar="${TOOLCHAIN_PREFIX}/llvm-ar" \
--ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \ --ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \
@ -92,7 +114,7 @@ make clean
--libdir=android-libs/x86_64 \ --libdir=android-libs/x86_64 \
--arch=x86_64 \ --arch=x86_64 \
--cpu=x86_64 \ --cpu=x86_64 \
--cross-prefix="${TOOLCHAIN_PREFIX}/x86_64-linux-android21-" \ --cross-prefix="${TOOLCHAIN_PREFIX}/x86_64-linux-android${ANDROID_ABI_64BIT}-" \
--nm="${TOOLCHAIN_PREFIX}/llvm-nm" \ --nm="${TOOLCHAIN_PREFIX}/llvm-nm" \
--ar="${TOOLCHAIN_PREFIX}/llvm-ar" \ --ar="${TOOLCHAIN_PREFIX}/llvm-ar" \
--ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \ --ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \