summaryrefslogtreecommitdiffstats
path: root/libnativeloader
diff options
context:
space:
mode:
authorDimitry Ivanov <dimitry@google.com>2016-02-22 11:27:48 -0800
committerDimitry Ivanov <dimitry@google.com>2016-02-24 16:45:26 -0800
commit6f80022908e79cb64b95828beb2883c7c3ce2a2c (patch)
treeb0083ebbc7a1e829a76943f77a0b11c3449cc44c /libnativeloader
parentd458730b649a044268807d1458867e3c1d0577b2 (diff)
downloadsystem_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.h3
-rw-r--r--libnativeloader/native_loader.cpp12
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,