From 048c8ed16f0e1ef745f697cbafb3578926b29795 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Tue, 9 Jul 2024 13:39:09 +0200 Subject: [PATCH] [android] Don't include `JNI_OnLoad` in `libSystem.Security.Cryptography.Native.Android.a` (#103231) I'm working on a feature in .NET For Android which will allow us to link all the native bits into a single shared library at application build time. In order to make it possible, no archive (`.a`) may contain any `JNI_OnLoad` functions (called by `JavaVM` when initializing a Java extension DSO), because our runtime already contains one and there Can be Only One(tm). `libSystem.Security.Cryptography.Native.Android` is currently the only BCL support native library which contains `JNI_OnLoad` and thus it prevents us from linking it into our runtime. This PR changes things a bit my moving the initialization code to a separate function (`AndroidCryptoNative_InitLibraryOnLoad `) which remains in the `.a` archive and can be called by `.NET For Android` runtime from its own `JNI_OnLoad` as well as by the `libSystem.Security.Cryptography.Native.Android.so` from its `JNI_OnLoad`, which this PR moves to a separate source file that is compiled only into the shared version of the crypto support library. --- .../CMakeLists.txt | 2 +- .../pal_jni.c | 5 ++--- .../pal_jni.h | 5 +++++ .../pal_jni_onload.c | 10 ++++++++++ 4 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 src/native/libs/System.Security.Cryptography.Native.Android/pal_jni_onload.c diff --git a/src/native/libs/System.Security.Cryptography.Native.Android/CMakeLists.txt b/src/native/libs/System.Security.Cryptography.Native.Android/CMakeLists.txt index a277d5df3e5bd..f87db8a8c75b6 100644 --- a/src/native/libs/System.Security.Cryptography.Native.Android/CMakeLists.txt +++ b/src/native/libs/System.Security.Cryptography.Native.Android/CMakeLists.txt @@ -33,7 +33,7 @@ set(NATIVECRYPTO_SOURCES add_library(System.Security.Cryptography.Native.Android SHARED - ${NATIVECRYPTO_SOURCES} + ${NATIVECRYPTO_SOURCES} pal_jni_onload.c ${VERSION_FILE_PATH} ) diff --git a/src/native/libs/System.Security.Cryptography.Native.Android/pal_jni.c b/src/native/libs/System.Security.Cryptography.Native.Android/pal_jni.c index 243dbd1d9466d..ee31a3ac58d64 100644 --- a/src/native/libs/System.Security.Cryptography.Native.Android/pal_jni.c +++ b/src/native/libs/System.Security.Cryptography.Native.Android/pal_jni.c @@ -689,11 +689,10 @@ int GetEnumAsInt(JNIEnv *env, jobject enumObj) return value; } -JNIEXPORT jint JNICALL -JNI_OnLoad(JavaVM *vm, void *reserved) +jint AndroidCryptoNative_InitLibraryOnLoad (JavaVM *vm, void *reserved) { (void)reserved; - LOG_INFO("JNI_OnLoad in pal_jni.c"); + LOG_DEBUG("%s in %s", __PRETTY_FUNCTION__, __FILE__); gJvm = vm; JNIEnv* env = GetJNIEnv(); diff --git a/src/native/libs/System.Security.Cryptography.Native.Android/pal_jni.h b/src/native/libs/System.Security.Cryptography.Native.Android/pal_jni.h index 79bc888224629..5f7d7c002c414 100644 --- a/src/native/libs/System.Security.Cryptography.Native.Android/pal_jni.h +++ b/src/native/libs/System.Security.Cryptography.Native.Android/pal_jni.h @@ -605,6 +605,11 @@ jfieldID GetField(JNIEnv *env, bool isStatic, jclass klass, const char* name, co jfieldID GetOptionalField(JNIEnv *env, bool isStatic, jclass klass, const char* name, const char* sig) ARGS_NON_NULL_ALL; JNIEnv* GetJNIEnv(void); +// This is supposed to be called by embedders who link the **static** archive of this library. +// The function must be called from the embedder's `JNI_OnLoad` function prior to using any +// APIs in this library. +jint AndroidCryptoNative_InitLibraryOnLoad (JavaVM *vm, void *reserved); + int GetEnumAsInt(JNIEnv *env, jobject enumObj) ARGS_NON_NULL_ALL; void* xmalloc (size_t size) __mallocfunc __BIONIC_ALLOC_SIZE(1) __wur; diff --git a/src/native/libs/System.Security.Cryptography.Native.Android/pal_jni_onload.c b/src/native/libs/System.Security.Cryptography.Native.Android/pal_jni_onload.c new file mode 100644 index 0000000000000..e2ecc9f3b8aa5 --- /dev/null +++ b/src/native/libs/System.Security.Cryptography.Native.Android/pal_jni_onload.c @@ -0,0 +1,10 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#include "pal_jni.h" + +JNIEXPORT jint JNICALL +JNI_OnLoad(JavaVM *vm, void *reserved) +{ + return AndroidCryptoNative_InitLibraryOnLoad (vm, reserved); +}