From 34fa704df45c5f74aeb5230e4bf3930585cf32fb Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Mon, 22 Feb 2016 13:02:35 -0800 Subject: [PATCH 1/2] nativeloader: refactor FindNamespaceByClassLoader method FindNamespaceByClassLoader returns android_namespace_t* to make it suitable for exporting this functionality. Bug: http://b/27189432 Change-Id: Ifef3de753192178e0184fb114596fe956fde2826 --- libnativeloader/native_loader.cpp | 33 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp index a7a071387..5d35523f2 100644 --- a/libnativeloader/native_loader.cpp +++ b/libnativeloader/native_loader.cpp @@ -79,10 +79,10 @@ class LibraryNamespaces { std::lock_guard guard(mutex_); - auto it = FindNamespaceByClassLoader(env, class_loader); + android_namespace_t* ns = FindNamespaceByClassLoader(env, class_loader); - if (it != namespaces_.end()) { - return it->second; + if (ns != nullptr) { + return ns; } uint64_t namespace_type = ANDROID_NAMESPACE_TYPE_ISOLATED; @@ -90,14 +90,13 @@ class LibraryNamespaces { namespace_type |= ANDROID_NAMESPACE_TYPE_SHARED; } - android_namespace_t* ns = - android_create_namespace("classloader-namespace", - nullptr, - library_path.c_str(), - namespace_type, - java_permitted_path != nullptr ? - permitted_path.c_str() : - nullptr); + ns = android_create_namespace("classloader-namespace", + nullptr, + library_path.c_str(), + namespace_type, + java_permitted_path != nullptr ? + permitted_path.c_str() : + nullptr); namespaces_.push_back(std::make_pair(env->NewWeakGlobalRef(class_loader), ns)); @@ -122,12 +121,12 @@ class LibraryNamespaces { return initialized_; } - std::vector>::const_iterator - FindNamespaceByClassLoader(JNIEnv* env, jobject class_loader) { - return std::find_if(namespaces_.begin(), namespaces_.end(), - [&](const std::pair& value) { - return env->IsSameObject(value.first, class_loader); - }); + android_namespace_t* FindNamespaceByClassLoader(JNIEnv* env, jobject class_loader) { + auto it = std::find_if(namespaces_.begin(), namespaces_.end(), + [&](const std::pair& value) { + return env->IsSameObject(value.first, class_loader); + }); + return it != namespaces_.end() ? it->second : nullptr; } bool initialized_; From 0cd10d83e4e14300d03a60f28547b90d0c805579 Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Mon, 22 Feb 2016 13:48:22 -0800 Subject: [PATCH 2/2] nativeloader: Export FindNamespaceByClassLoader Bug: http://b/27189432 Change-Id: Ib80dcce949276ee620f601c47b20f783708e8e85 --- .../include/nativeloader/native_loader.h | 10 +++++++++ libnativeloader/native_loader.cpp | 22 ++++++++++++------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/libnativeloader/include/nativeloader/native_loader.h b/libnativeloader/include/nativeloader/native_loader.h index da072530e..2dec71f1e 100644 --- a/libnativeloader/include/nativeloader/native_loader.h +++ b/libnativeloader/include/nativeloader/native_loader.h @@ -19,6 +19,9 @@ #include "jni.h" #include +#if defined(__ANDROID__) +#include +#endif namespace android { @@ -27,6 +30,13 @@ void* OpenNativeLibrary(JNIEnv* env, int32_t target_sdk_version, const char* pat jobject class_loader, bool is_shared, jstring library_path, jstring permitted_path); +#if defined(__ANDROID__) +// Look up linker namespace by class_loader. Returns nullptr if +// there is no namespace associated with the class_loader. +__attribute__((visibility("default"))) +android_namespace_t* FindNamespaceByClassLoader(JNIEnv* env, jobject class_loader); +#endif + }; // namespace android #endif // NATIVE_BRIDGE_H_ diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp index 5d35523f2..a64b9720c 100644 --- a/libnativeloader/native_loader.cpp +++ b/libnativeloader/native_loader.cpp @@ -103,6 +103,14 @@ class LibraryNamespaces { return ns; } + android_namespace_t* FindNamespaceByClassLoader(JNIEnv* env, jobject class_loader) { + auto it = std::find_if(namespaces_.begin(), namespaces_.end(), + [&](const std::pair& value) { + return env->IsSameObject(value.first, class_loader); + }); + return it != namespaces_.end() ? it->second : nullptr; + } + private: void PreloadPublicLibraries() { // android_init_namespaces() expects all the public libraries @@ -121,14 +129,6 @@ class LibraryNamespaces { return initialized_; } - android_namespace_t* FindNamespaceByClassLoader(JNIEnv* env, jobject class_loader) { - auto it = std::find_if(namespaces_.begin(), namespaces_.end(), - [&](const std::pair& value) { - return env->IsSameObject(value.first, class_loader); - }); - return it != namespaces_.end() ? it->second : nullptr; - } - bool initialized_; std::mutex mutex_; std::vector> namespaces_; @@ -168,4 +168,10 @@ void* OpenNativeLibrary(JNIEnv* env, int32_t target_sdk_version, const char* pat #endif } +#if defined(__ANDROID__) +android_namespace_t* FindNamespaceByClassLoader(JNIEnv* env, jobject class_loader) { + return g_namespaces->FindNamespaceByClassLoader(env, class_loader); +} +#endif + }; // android namespace