Closed
Description
My setup:
- ExoPlayer 2.15.1
- Android NDK 23.1.7779620
- CMake 3.22.2 (using system package from Fedora)
In order to build with this setup, I'm using the following patch:
diff --git a/extensions/ffmpeg/build.gradle b/extensions/ffmpeg/build.gradle
index a9edeaff6b..14d3bc9fbb 100644
--- a/extensions/ffmpeg/build.gradle
+++ b/extensions/ffmpeg/build.gradle
@@ -17,7 +17,8 @@ apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle"
// failures if ffmpeg hasn't been built according to the README instructions.
if (project.file('src/main/jni/ffmpeg').exists()) {
android.externalNativeBuild.cmake.path = 'src/main/jni/CMakeLists.txt'
- android.externalNativeBuild.cmake.version = '3.7.1+'
+ android.externalNativeBuild.cmake.version = '3.18.0+'
+ android.ndkVersion = '23.1.7779620'
}
dependencies {
diff --git a/extensions/ffmpeg/src/main/jni/build_ffmpeg.sh b/extensions/ffmpeg/src/main/jni/build_ffmpeg.sh
index 7b2e933902..e678d2ef2e 100755
--- a/extensions/ffmpeg/src/main/jni/build_ffmpeg.sh
+++ b/extensions/ffmpeg/src/main/jni/build_ffmpeg.sh
@@ -49,10 +49,10 @@ cd "${FFMPEG_EXT_PATH}/jni/ffmpeg"
--arch=arm \
--cpu=armv7-a \
--cross-prefix="${TOOLCHAIN_PREFIX}/armv7a-linux-androideabi16-" \
- --nm="${TOOLCHAIN_PREFIX}/arm-linux-androideabi-nm" \
- --ar="${TOOLCHAIN_PREFIX}/arm-linux-androideabi-ar" \
- --ranlib="${TOOLCHAIN_PREFIX}/arm-linux-an
7B22
droideabi-ranlib" \
- --strip="${TOOLCHAIN_PREFIX}/arm-linux-androideabi-strip" \
+ --nm="${TOOLCHAIN_PREFIX}/llvm-nm" \
+ --ar="${TOOLCHAIN_PREFIX}/llvm-ar" \
+ --ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \
+ --strip="${TOOLCHAIN_PREFIX}/llvm-strip" \
--extra-cflags="-march=armv7-a -mfloat-abi=softfp" \
--extra-ldflags="-Wl,--fix-cortex-a8" \
${COMMON_OPTIONS}
@@ -64,10 +64,10 @@ make clean
--arch=aarch64 \
--cpu=armv8-a \
--cross-prefix="${TOOLCHAIN_PREFIX}/aarch64-linux-android21-" \
- --nm="${TOOLCHAIN_PREFIX}/aarch64-linux-android-nm" \
- --ar="${TOOLCHAIN_PREFIX}/aarch64-linux-android-ar" \
- --ranlib="${TOOLCHAIN_PREFIX}/aarch64-linux-android-ranlib" \
- --strip="${TOOLCHAIN_PREFIX}/aarch64-linux-android-strip" \
+ --nm="${TOOLCHAIN_PREFIX}/llvm-nm" \
+ --ar="${TOOLCHAIN_PREFIX}/llvm-ar" \
+ --ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \
+ --strip="${TOOLCHAIN_PREFIX}/llvm-strip" \
${COMMON_OPTIONS}
make -j$JOBS
make install-libs
@@ -77,10 +77,10 @@ make clean
--arch=x86 \
--cpu=i686 \
--cross-prefix="${TOOLCHAIN_PREFIX}/i686-linux-android16-" \
- --nm="${TOOLCHAIN_PREFIX}/i686-linux-android-nm" \
- --ar="${TOOLCHAIN_PREFIX}/i686-linux-android-ar" \
- --ranlib="${TOOLCHAIN_PREFIX}/i686-linux-android-ranlib" \
- --strip="${TOOLCHAIN_PREFIX}/i686-linux-android-strip" \
+ --nm="${TOOLCHAIN_PREFIX}/llvm-nm" \
+ --ar="${TOOLCHAIN_PREFIX}/llvm-ar" \
+ --ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \
+ --strip="${TOOLCHAIN_PREFIX}/llvm-strip" \
--disable-asm \
${COMMON_OPTIONS}
make -j$JOBS
@@ -91,10 +91,10 @@ make clean
--arch=x86_64 \
--cpu=x86_64 \
--cross-prefix="${TOOLCHAIN_PREFIX}/x86_64-linux-android21-" \
- --nm="${TOOLCHAIN_PREFIX}/x86_64-linux-android-nm" \
- --ar="${TOOLCHAIN_PREFIX}/x86_64-linux-android-ar" \
- --ranlib="${TOOLCHAIN_PREFIX}/x86_64-linux-android-ranlib" \
- --strip="${TOOLCHAIN_PREFIX}/x86_64-linux-android-strip" \
+ --nm="${TOOLCHAIN_PREFIX}/llvm-nm" \
+ --ar="${TOOLCHAIN_PREFIX}/llvm-ar" \
+ --ranlib="${TOOLCHAIN_PREFIX}/llvm-ranlib" \
+ --strip="${TOOLCHAIN_PREFIX}/llvm-strip" \
--disable-asm \
${COMMON_OPTIONS}
make -j$JOBS
I compile ffmpeg code according to build instructions:
cd extensions/ffmpeg/src/main/jni/
git clone git://source.ffmpeg.org/ffmpeg
(cd ffmpeg && \
git checkout release/4.2)
./build_ffmpeg.sh \
/path/to/ExoPlayer/extensions/ffmpeg/src/main \
/path/to/android-sdk-linux/ndk/23.1.7779620 \
linux-x86_64 \
ac3 mp3
Finally I try to compile the demo app:
./gradlew :demo:assembleWithDecoderExtensionsDebug
Build fails at task :extension-ffmpeg:externalNativeBuildDebug
. The output log at the failure is the following (there are actually a bunch of link errors, I just copied the first ones):
[2/2] Linking CXX shared library /path/to/ExoPlayer/extensions/ffmpeg/buildout/intermediates/cmake/debug/obj/arm64-v8a/libffmpegJNI.so
FAILED: /path/to/ExoPlayer/extensions/ffmpeg/buildout/intermediates/cmake/debug/obj/arm64-v8a/libffmpegJNI.so
: && /path/to/android-sdk-linux/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --sysroot=/path/to/android-sdk-linux/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fexceptions -frtti -stdlib=libc++ -g -fno-limit-debug-info -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--fatal-warnings -Qunused-arguments -Wl,--no-undefined -shared -Wl,-soname,libffmpegJNI.so -o /path/to/ExoPlayer/extensions/ffmpeg/buildout/intermediates/cmake/debug/obj/arm64-v8a/libffmpegJNI.so CMakeFiles/ffmpegJNI.dir/ffmpeg_jni.cc.o -landroid /path/to/ExoPlayer/extensions/ffmpeg/src/main/jni/ffmpeg/android-libs/arm64-v8a/libswresample.a /path/to/ExoPlayer/extensions/ffmpeg/src/main/jni/ffmpeg/android-libs/arm64-v8a/libavcodec.a /path/to/ExoPlayer/extensions/ffmpeg/src/main/jni/ffmpeg/android-libs/arm64-v8a/libavutil.a /path/to/android-sdk-linux/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/21/liblog.so -static-libstdc++ -latomic -lm && :
ld: error: relocation R_AARCH64_ADR_PREL_PG_HI21 cannot be used against symbol ff_cos_32; recompile with -fPIC
>>> defined in /path/to/ExoPlayer/extensions/ffmpeg/src/main/jni/ffmpeg/android-libs/arm64-v8a/libavcodec.a(fft_float.o)
>>> referenced by fft_neon.S:356 (libavcodec/aarch64/fft_neon.S:356)
>>> fft_neon.o:(fft32_neon) in archive /path/to/ExoPlayer/extensions/ffmpeg/src/main/jni/ffmpeg/android-libs/arm64-v8a/libavcodec.a
ld: error: can't create dynamic relocation R_AARCH64_ADD_ABS_LO12_NC against symbol: ff_cos_32 in readonly segment; recompile object files with -fPIC or pass '-Wl,-z,notext' to allow text relocations in the output
>>> defined in /path/to/ExoPlayer/extensions/ffmpeg/src/main/jni/ffmpeg/android-libs/arm64-v8a/libavcodec.a(fft_float.o)
>>> referenced by fft_neon.S:356 (libavcodec/aarch64/fft_neon.S:356)
>>> fft_neon.o:(fft32_neon) in archive /path/to/ExoPlayer/extensions/ffmpeg/src/main/jni/ffmpeg/android-libs/arm64-v8a/libavcodec.a
Previously, I was using Android NDK 21.0.6113669 and CMake 3.10.2.4988404 (installed with sdkmanager
), which worked fine.