From 2ad5f0d94db6686eca71b180056da69bcec1c882 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Tue, 19 Nov 2024 16:38:05 +0100 Subject: [PATCH] [NDK] Add loadNativeLibraries method to allow pre-loading .so files (#1082) * Add loadNativeLibraries method to allow pre-loading .so files * Update Changelog --- CHANGELOG.md | 6 ++++ ndk/lib/api/sentry-native-ndk.api | 1 + .../main/java/io/sentry/ndk/SentryNdk.java | 31 +++++++++++++------ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7095ab642..b044ca3d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +**Features**: + +- Android NDK: Add `.loadNativeLibraries()` method to allow pre-loading .so files ([#1082](https://github.com/getsentry/sentry-native/pull/1082)) + ## 0.7.13 **Features**: diff --git a/ndk/lib/api/sentry-native-ndk.api b/ndk/lib/api/sentry-native-ndk.api index 8dca41c08..81e777306 100644 --- a/ndk/lib/api/sentry-native-ndk.api +++ b/ndk/lib/api/sentry-native-ndk.api @@ -79,5 +79,6 @@ public final class io/sentry/ndk/NdkOptions { public final class io/sentry/ndk/SentryNdk { public static fun close ()V public static fun init (Lio/sentry/ndk/NdkOptions;)V + public static fun loadNativeLibraries ()V } diff --git a/ndk/lib/src/main/java/io/sentry/ndk/SentryNdk.java b/ndk/lib/src/main/java/io/sentry/ndk/SentryNdk.java index 6011910db..d43ac268a 100644 --- a/ndk/lib/src/main/java/io/sentry/ndk/SentryNdk.java +++ b/ndk/lib/src/main/java/io/sentry/ndk/SentryNdk.java @@ -6,16 +6,7 @@ @ApiStatus.Internal public final class SentryNdk { - static { - // On older Android versions, it was necessary to manually call "`System.loadLibrary` on all - // transitive dependencies before loading [the] main library." - // The dependencies of `libsentry.so` are currently `lib{c,m,dl,log}.so`. - // See - // https://android.googlesource.com/platform/bionic/+/master/android-changes-for-ndk-developers.md#changes-to-library-dependency-resolution - System.loadLibrary("log"); - System.loadLibrary("sentry"); - System.loadLibrary("sentry-android"); - } + private static volatile boolean nativeLibrariesLoaded; private SentryNdk() {} @@ -29,11 +20,31 @@ private SentryNdk() {} * @param options the SentryAndroidOptions */ public static void init(@NotNull final NdkOptions options) { + loadNativeLibraries(); initSentryNative(options); } /** Closes the NDK integration */ public static void close() { + loadNativeLibraries(); shutdown(); } + + /** + * Loads all required native libraries. This is automatically done by {@link #init(NdkOptions)}, + * but can be called manually in case you want to preload the libraries before calling #init. + */ + public static synchronized void loadNativeLibraries() { + if (!nativeLibrariesLoaded) { + // On older Android versions, it was necessary to manually call "`System.loadLibrary` on all + // transitive dependencies before loading [the] main library." + // The dependencies of `libsentry.so` are currently `lib{c,m,dl,log}.so`. + // See + // https://android.googlesource.com/platform/bionic/+/master/android-changes-for-ndk-developers.md#changes-to-library-dependency-resolution + System.loadLibrary("log"); + System.loadLibrary("sentry"); + System.loadLibrary("sentry-android"); + nativeLibrariesLoaded = true; + } + } }