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 7907fa4623b..84e14ac8d21 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 abd184b59e3..53bea643c62 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 6ce93ef56d5..9dd97059e0e 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 3fa874ff910..d7096ff7e87 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/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 5f9102a7fd4..ebeeb013b0d 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 f46f7a223b7..e09d41b1832 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 @@ 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 synchronized boolean isAvailable() { loadAttempted = true; try { for (String lib : nativeLibraries) { - System.loadLibrary(lib); + loadLibrary(lib); } isAvailable = true; } catch (UnsatisfiedLinkError exception) { @@ -58,4 +58,17 @@ public synchronized boolean isAvailable() { } 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); }