Skip to content

Commit 0625423

Browse files
committed
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.
1 parent bd19953 commit 0625423

File tree

2 files changed

+39
-11
lines changed

2 files changed

+39
-11
lines changed

libraries/decoder_ffmpeg/README.md

+8-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ FFMPEG_MODULE_PATH="$(pwd)/libraries/decoder_ffmpeg/src/main"
2929
```
3030

3131
* Download the [Android NDK][] and set its location in a shell variable.
32-
This build configuration has been tested on NDK r21.
32+
This build configuration has been tested on NDK r26b (r23c if ANDROID_ABI is 16).
3333

3434
```
3535
NDK_PATH="<path to Android NDK>"
@@ -41,6 +41,12 @@ NDK_PATH="<path to Android NDK>"
4141
HOST_PLATFORM="linux-x86_64"
4242
```
4343

44+
* Set the ABI version for native code (typically it's equal to minSdk and must not exceed it):
45+
46+
```
47+
ANDROID_ABI=16
48+
```
49+
4450
* Fetch FFmpeg and checkout an appropriate branch. We cannot guarantee
4551
compatibility with all versions of FFmpeg. We currently recommend version
4652
6.0:
@@ -74,7 +80,7 @@ ln -s "$FFMPEG_PATH" ffmpeg
7480
```
7581
cd "${FFMPEG_MODULE_PATH}/jni" && \
7682
./build_ffmpeg.sh \
77-
"${FFMPEG_MODULE_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ENABLED_DECODERS[@]}"
83+
"${FFMPEG_MODULE_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ANDROID_ABI}" "${ENABLED_DECODERS[@]}"
7884
```
7985

8086
## Build instructions (Windows)

libraries/decoder_ffmpeg/src/main/jni/build_ffmpeg.sh

+31-9
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,17 @@
1616
#
1717
set -eu
1818

19-
FFMPEG_MODULE_PATH=$1
20-
NDK_PATH=$2
21-
HOST_PLATFORM=$3
22-
ENABLED_DECODERS=("${@:4}")
23-
JOBS=$(nproc 2> /dev/null || sysctl -n hw.ncpu 2> /dev/null || echo 4)
19+
FFMPEG_MODULE_PATH="$1"
20+
echo "FFMPEG_MODULE_PATH is ${FFMPEG_MODULE_PATH}"
21+
NDK_PATH="$2"
22+
echo "NDK path is ${NDK_PATH}"
23+
HOST_PLATFORM="$3"
24+
echo "Host platform is ${HOST_PLATFORM}"
25+
ANDROID_ABI="$4"
26+
echo "ANDROID_ABI is ${ANDROID_ABI}"
27+
ENABLED_DECODERS=("${@:5}")
28+
echo "Enabled decoders are ${ENABLED_DECODERS[@]}"
29+
JOBS="$(nproc 2> /dev/null || sysctl -n hw.ncpu 2> /dev/null || echo 4)"
2430
echo "Using $JOBS jobs for make"
2531
COMMON_OPTIONS="
2632
--target-os=android
@@ -45,12 +51,28 @@ for decoder in "${ENABLED_DECODERS[@]}"
4551
do
4652
COMMON_OPTIONS="${COMMON_OPTIONS} --enable-decoder=${decoder}"
4753
done
54+
55+
ARMV7_CLANG="${TOOLCHAIN_PREFIX}/armv7a-linux-androideabi${ANDROID_ABI}-clang"
56+
if [[ -e "${TOOLCHAIN_PREFIX}" && ! -e "$ARMV7_CLANG" ]]
57+
then
58+
echo "AVMv7 Clang compiler with path $ARMV7_CLANG does not exist"
59+
echo "It's likely your NDK version doesn't support ANDROID_ABI $ANDROID_ABI"
60+
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)"
61+
exit 1
62+
fi
63+
ANDROID_ABI_64BIT="$ANDROID_ABI"
64+
if [[ "$ANDROID_ABI_64BIT" -lt 21 ]]
65+
then
66+
echo "Using ANDROID_ABI 21 for 64-bit architectures"
67+
ANDROID_ABI_64BIT=21
68+
fi
69+
4870
cd "${FFMPEG_MODULE_PATH}/jni/ffmpeg"
4971
./configure \
5072
--libdir=android-libs/armeabi-v7a \
5173
--arch=arm \
5274
--cpu=armv7-a \
53-
--cross-prefix="${TOOLCHAIN_PREFIX}/armv7a-linux-androideabi16-" \
75+
--cross-prefix="${TOOLCHAIN_PREFIX}/armv7a-linux-androideabi${ANDROID_ABI}-" \
5476
--nm="${TOOLCHAIN_PREFIX}/llvm-nm" \
5577
--ar="${TOOLCHAIN_PREFIX}/llvm-ar" \
5678
--ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \
@@ -65,7 +87,7 @@ make clean
6587
--libdir=android-libs/arm64-v8a \
6688
--arch=aarch64 \
6789
--cpu=armv8-a \
68-
--cross-prefix="${TOOLCHAIN_PREFIX}/aarch64-linux-android21-" \
90+
--cross-prefix="${TOOLCHAIN_PREFIX}/aarch64-linux-android${ANDROID_ABI_64BIT}-" \
6991
--nm="${TOOLCHAIN_PREFIX}/llvm-nm" \
7092
--ar="${TOOLCHAIN_PREFIX}/llvm-ar" \
7193
--ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \
@@ -78,7 +100,7 @@ make clean
78100
--libdir=android-libs/x86 \
79101
--arch=x86 \
80102
--cpu=i686 \
81-
--cross-prefix="${TOOLCHAIN_PREFIX}/i686-linux-android16-" \
103+
--cross-prefix="${TOOLCHAIN_PREFIX}/i686-linux-android${ANDROID_ABI}-" \
82104
--nm="${TOOLCHAIN_PREFIX}/llvm-nm" \
83105
--ar="${TOOLCHAIN_PREFIX}/llvm-ar" \
84106
--ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \
@@ -92,7 +114,7 @@ make clean
92114
--libdir=android-libs/x86_64 \
93115
--arch=x86_64 \
94116
--cpu=x86_64 \
95-
--cross-prefix="${TOOLCHAIN_PREFIX}/x86_64-linux-android21-" \
117+
--cross-prefix="${TOOLCHAIN_PREFIX}/x86_64-linux-android${ANDROID_ABI_64BIT}-" \
96118
--nm="${TOOLCHAIN_PREFIX}/llvm-nm" \
97119
--ar="${TOOLCHAIN_PREFIX}/llvm-ar" \
98120
--ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \

0 commit comments

Comments
 (0)