From 63104064cac8606ec98fed8fa169985af3f76754 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 17 Feb 2022 10:33:57 +0000 Subject: [PATCH] Make sure native library loads use correct class loader Merge of https://github.com/google/ExoPlayer/pull/9934 #minor-release PiperOrigin-RevId: 429259055 --- .../android/exoplayer2/ext/av1/Gav1Library.java | 8 +++++++- .../exoplayer2/ext/ffmpeg/FfmpegLibrary.java | 8 +++++++- .../exoplayer2/ext/flac/FlacLibrary.java | 8 +++++++- .../exoplayer2/ext/opus/OpusLibrary.java | 9 ++++++++- .../exoplayer2/ext/opus/OpusDecoderTest.java | 8 +++++++- .../android/exoplayer2/ext/vp9/VpxLibrary.java | 9 ++++++++- .../android/exoplayer2/util/LibraryLoader.java | 17 +++++++++++++++-- 7 files changed, 59 insertions(+), 8 deletions(-) diff --git a/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Gav1Library.java b/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Gav1Library.java index 7907fa4623..84e14ac8d2 100644 --- a/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Gav1Library.java +++ b/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Gav1Library.java @@ -25,7 +25,13 @@ public final class Gav1Library { ExoPlayerLibraryInfo.registerModule("goog.exo.gav1"); } - private static final LibraryLoader LOADER = new LibraryLoader("gav1JNI"); + private static final LibraryLoader LOADER = + new LibraryLoader("gav1JNI") { + @Override + protected void loadLibrary(String name) { + System.loadLibrary(name); + } + }; private Gav1Library() {} diff --git a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegLibrary.java b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegLibrary.java index 97f11225bb..2bd5b97aca 100644 --- a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegLibrary.java +++ b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegLibrary.java @@ -32,7 +32,13 @@ public final class FfmpegLibrary { private static final String TAG = "FfmpegLibrary"; - private static final LibraryLoader LOADER = new LibraryLoader("ffmpegJNI"); + private static final LibraryLoader LOADER = + new LibraryLoader("ffmpegJNI") { + @Override + protected void loadLibrary(String name) { + System.loadLibrary(name); + } + }; private static @MonotonicNonNull String version; private static int inputBufferPaddingSize = C.LENGTH_UNSET; diff --git a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacLibrary.java b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacLibrary.java index 6ce93ef56d..9dd97059e0 100644 --- a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacLibrary.java +++ b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacLibrary.java @@ -25,7 +25,13 @@ public final class FlacLibrary { ExoPlayerLibraryInfo.registerModule("goog.exo.flac"); } - private static final LibraryLoader LOADER = new LibraryLoader("flacJNI"); + private static final LibraryLoader LOADER = + new LibraryLoader("flacJNI") { + @Override + protected void loadLibrary(String name) { + System.loadLibrary(name); + } + }; private FlacLibrary() {} diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusLibrary.java b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusLibrary.java index 3fa874ff91..d7096ff7e8 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusLibrary.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusLibrary.java @@ -27,7 +27,14 @@ public final class OpusLibrary { ExoPlayerLibraryInfo.registerModule("goog.exo.opus"); } - private static final LibraryLoader LOADER = new LibraryLoader("opusV2JNI"); + private static final LibraryLoader LOADER = + new LibraryLoader("opusV2JNI") { + @Override + protected void loadLibrary(String name) { + System.loadLibrary(name); + } + }; + private static @C.CryptoType int cryptoType = C.CRYPTO_TYPE_UNSUPPORTED; private OpusLibrary() {} diff --git a/extensions/opus/src/test/java/com/google/android/exoplayer2/ext/opus/OpusDecoderTest.java b/extensions/opus/src/test/java/com/google/android/exoplayer2/ext/opus/OpusDecoderTest.java index 4177480801..474e8f46d9 100644 --- a/extensions/opus/src/test/java/com/google/android/exoplayer2/ext/opus/OpusDecoderTest.java +++ b/extensions/opus/src/test/java/com/google/android/exoplayer2/ext/opus/OpusDecoderTest.java @@ -34,7 +34,13 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public final class OpusDecoderTest { - private static final LibraryLoader LOADER = new LibraryLoader("opusV2JNI"); + private static final LibraryLoader LOADER = + new LibraryLoader("opusV2JNI") { + @Override + protected void loadLibrary(String name) { + System.loadLibrary(name); + } + }; private static final byte[] HEADER = new byte[] {79, 112, 117, 115, 72, 101, 97, 100, 0, 2, 1, 56, 0, 0, -69, -128, 0, 0, 0}; diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxLibrary.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxLibrary.java index 5f9102a7fd..ebeeb013b0 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxLibrary.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxLibrary.java @@ -27,7 +27,14 @@ public final class VpxLibrary { ExoPlayerLibraryInfo.registerModule("goog.exo.vpx"); } - private static final LibraryLoader LOADER = new LibraryLoader("vpx", "vpxV2JNI"); + private static final LibraryLoader LOADER = + new LibraryLoader("vpx", "vpxV2JNI") { + @Override + protected void loadLibrary(String name) { + System.loadLibrary(name); + } + }; + private static @C.CryptoType int cryptoType = C.CRYPTO_TYPE_UNSUPPORTED; private VpxLibrary() {} diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/LibraryLoader.java b/library/common/src/main/java/com/google/android/exoplayer2/util/LibraryLoader.java index f46f7a223b..e09d41b183 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/LibraryLoader.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/LibraryLoader.java @@ -18,7 +18,7 @@ package com.google.android.exoplayer2.util; import java.util.Arrays; /** Configurable loader for native libraries. */ -public final class LibraryLoader { +public abstract class LibraryLoader { private static final String TAG = "LibraryLoader"; @@ -48,7 +48,7 @@ public final class LibraryLoader { loadAttempted = true; try { for (String lib : nativeLibraries) { - System.loadLibrary(lib); + loadLibrary(lib); } isAvailable = true; } catch (UnsatisfiedLinkError exception) { @@ -58,4 +58,17 @@ public final class LibraryLoader { } return isAvailable; } + + /** + * Should be implemented to call {@code System.loadLibrary(name)}. + * + *

It's necessary for each subclass to implement this method because {@link + * System#loadLibrary(String)} uses reflection to obtain the calling class, which is then used to + * obtain the class loader to use when loading the native library. If this class were to implement + * the method directly, and if a subclass were to have a different class loader, then loading of + * the native library would fail. + * + * @param name The name of the library to load. + */ + protected abstract void loadLibrary(String name); }