diff options
author | Dimitry Ivanov <dimitry@google.com> | 2016-02-22 11:27:48 -0800 |
---|---|---|
committer | Dimitry Ivanov <dimitry@google.com> | 2016-02-24 16:45:26 -0800 |
commit | 6f80022908e79cb64b95828beb2883c7c3ce2a2c (patch) | |
tree | b0083ebbc7a1e829a76943f77a0b11c3449cc44c /libnativeloader | |
parent | d458730b649a044268807d1458867e3c1d0577b2 (diff) | |
download | system_core-6f80022908e79cb64b95828beb2883c7c3ce2a2c.tar.gz system_core-6f80022908e79cb64b95828beb2883c7c3ce2a2c.tar.bz2 system_core-6f80022908e79cb64b95828beb2883c7c3ce2a2c.zip |
Add PreloadPublicNativeLibraries function
Shift responsibility of preloading native libraries to the user
of the library. This lets applications that do not use jni but
depend on libnative_loader.so to avoid unnecessary preloads of
public libraries which could be expensive.
Bug: http://b/27245894
Change-Id: I12a8100de5da639c068769bca21ecebff2b2d538
(cherry picked from commit 426799d77014888315233253e96277bef13158eb)
Diffstat (limited to 'libnativeloader')
-rw-r--r-- | libnativeloader/include/nativeloader/native_loader.h | 3 | ||||
-rw-r--r-- | libnativeloader/native_loader.cpp | 12 |
2 files changed, 11 insertions, 4 deletions
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 @@ -26,6 +26,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, jstring permitted_path); diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp index a64b9720c..f8bb5fdd1 100644 --- a/libnativeloader/native_loader.cpp +++ b/libnativeloader/native_loader.cpp @@ -57,9 +57,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, @@ -111,7 +109,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. @@ -121,6 +118,7 @@ class LibraryNamespaces { } } + private: bool InitPublicNamespace(const char* library_path) { // Some apps call dlopen from generated code unknown to linker in which // case linker uses anonymous namespace. See b/25844435 for details. @@ -139,6 +137,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, |