diff --git a/libraries/common/src/main/java/androidx/media3/common/util/LibraryLoader.java b/libraries/common/src/main/java/androidx/media3/common/util/LibraryLoader.java index 5e0c7ee60f..449e684fea 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/LibraryLoader.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/LibraryLoader.java @@ -19,7 +19,7 @@ import java.util.Arrays; /** Configurable loader for native libraries. */ @UnstableApi -public final class LibraryLoader { +public abstract class LibraryLoader { private static final String TAG = "LibraryLoader"; @@ -49,7 +49,7 @@ public final class LibraryLoader { loadAttempted = true; try { for (String lib : nativeLibraries) { - System.loadLibrary(lib); + loadLibrary(lib); } isAvailable = true; } catch (UnsatisfiedLinkError exception) { @@ -59,4 +59,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); } diff --git a/libraries/decoder_av1/src/main/java/androidx/media3/decoder/av1/Gav1Library.java b/libraries/decoder_av1/src/main/java/androidx/media3/decoder/av1/Gav1Library.java index 735c382fa0..7a85882c6a 100644 --- a/libraries/decoder_av1/src/main/java/androidx/media3/decoder/av1/Gav1Library.java +++ b/libraries/decoder_av1/src/main/java/androidx/media3/decoder/av1/Gav1Library.java @@ -27,7 +27,13 @@ public final class Gav1Library { MediaLibraryInfo.registerModule("media3.decoder.av1"); } - 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/libraries/decoder_ffmpeg/src/main/java/androidx/media3/decoder/ffmpeg/FfmpegLibrary.java b/libraries/decoder_ffmpeg/src/main/java/androidx/media3/decoder/ffmpeg/FfmpegLibrary.java index ff067daf0a..bc86776cac 100644 --- a/libraries/decoder_ffmpeg/src/main/java/androidx/media3/decoder/ffmpeg/FfmpegLibrary.java +++ b/libraries/decoder_ffmpeg/src/main/java/androidx/media3/decoder/ffmpeg/FfmpegLibrary.java @@ -34,7 +34,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/libraries/decoder_flac/src/main/java/androidx/media3/decoder/flac/FlacLibrary.java b/libraries/decoder_flac/src/main/java/androidx/media3/decoder/flac/FlacLibrary.java index a9b14cc3cc..7a398ae3ad 100644 --- a/libraries/decoder_flac/src/main/java/androidx/media3/decoder/flac/FlacLibrary.java +++ b/libraries/decoder_flac/src/main/java/androidx/media3/decoder/flac/FlacLibrary.java @@ -27,7 +27,13 @@ public final class FlacLibrary { MediaLibraryInfo.registerModule("media3.decoder.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/libraries/decoder_opus/src/main/java/androidx/media3/decoder/opus/OpusLibrary.java b/libraries/decoder_opus/src/main/java/androidx/media3/decoder/opus/OpusLibrary.java index 7c0b9cb543..4016ae1866 100644 --- a/libraries/decoder_opus/src/main/java/androidx/media3/decoder/opus/OpusLibrary.java +++ b/libraries/decoder_opus/src/main/java/androidx/media3/decoder/opus/OpusLibrary.java @@ -29,7 +29,14 @@ public final class OpusLibrary { MediaLibraryInfo.registerModule("media3.decoder.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/libraries/decoder_opus/src/test/java/androidx/media3/decoder/opus/OpusDecoderTest.java b/libraries/decoder_opus/src/test/java/androidx/media3/decoder/opus/OpusDecoderTest.java index 63cc0d072c..261ec3febd 100644 --- a/libraries/decoder_opus/src/test/java/androidx/media3/decoder/opus/OpusDecoderTest.java +++ b/libraries/decoder_opus/src/test/java/androidx/media3/decoder/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/libraries/decoder_vp9/src/main/java/androidx/media3/decoder/vp9/VpxLibrary.java b/libraries/decoder_vp9/src/main/java/androidx/media3/decoder/vp9/VpxLibrary.java index f4fe5d37e6..360bdc71c8 100644 --- a/libraries/decoder_vp9/src/main/java/androidx/media3/decoder/vp9/VpxLibrary.java +++ b/libraries/decoder_vp9/src/main/java/androidx/media3/decoder/vp9/VpxLibrary.java @@ -29,7 +29,14 @@ public final class VpxLibrary { MediaLibraryInfo.registerModule("media3.decoder.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() {}