diff --git a/libnativeloader/include/nativeloader/native_loader.h b/libnativeloader/include/nativeloader/native_loader.h index 2dec71f1e..5644aa637 100644 --- a/libnativeloader/include/nativeloader/native_loader.h +++ b/libnativeloader/include/nativeloader/native_loader.h @@ -25,6 +25,9 @@ namespace android { +__attribute__((visibility("default"))) +void PreloadPublicNativeLibraries(); + __attribute__((visibility("default"))) void* OpenNativeLibrary(JNIEnv* env, int32_t target_sdk_version, const char* path, jobject class_loader, bool is_shared, jstring library_path, diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp index e06be234c..b763631be 100644 --- a/libnativeloader/native_loader.cpp +++ b/libnativeloader/native_loader.cpp @@ -59,9 +59,7 @@ static const char* kPublicNativeLibraries = "libandroid.so:" class LibraryNamespaces { public: - LibraryNamespaces() : initialized_(false) { - PreloadPublicLibraries(); - } + LibraryNamespaces() : initialized_(false) { } android_namespace_t* GetOrCreate(JNIEnv* env, jobject class_loader, bool is_shared, @@ -114,7 +112,6 @@ class LibraryNamespaces { return it != namespaces_.end() ? it->second : nullptr; } - private: void PreloadPublicLibraries() { // android_init_namespaces() expects all the public libraries // to be loaded so that they can be found by soname alone. @@ -124,6 +121,7 @@ class LibraryNamespaces { } } + private: bool InitPublicNamespace(const char* library_path, int32_t target_sdk_version) { // Some apps call dlopen from generated code unknown to linker in which // case linker uses anonymous namespace. See b/25844435 for details. @@ -151,6 +149,12 @@ class LibraryNamespaces { static LibraryNamespaces* g_namespaces = new LibraryNamespaces; #endif +void PreloadPublicNativeLibraries() { +#if defined(__ANDROID__) + g_namespaces->PreloadPublicLibraries(); +#endif +} + void* OpenNativeLibrary(JNIEnv* env, int32_t target_sdk_version, const char* path, jobject class_loader, bool is_shared, jstring java_library_path,