diff options
| author | Dimitry Ivanov <dimitry@google.com> | 2016-05-17 23:06:21 +0000 |
|---|---|---|
| committer | android-build-merger <android-build-merger@google.com> | 2016-05-17 23:06:21 +0000 |
| commit | e17c2efc4c6a49c5c02061d90b9d5384c94eddce (patch) | |
| tree | 9f23d8f2f73ab9ff03da5ab56f8bc047e62660ae /libnativeloader/native_loader.cpp | |
| parent | 666d9aa507a8118a54146f08c6a4dad02773868d (diff) | |
| parent | 3457aba39480e85d582dd6890c4c72e418958782 (diff) | |
| download | system_core-e17c2efc4c6a49c5c02061d90b9d5384c94eddce.tar.gz system_core-e17c2efc4c6a49c5c02061d90b9d5384c94eddce.tar.bz2 system_core-e17c2efc4c6a49c5c02061d90b9d5384c94eddce.zip | |
Merge "Set parent namespace for linker-namespaces" am: ac50d0cc57
am: 3457aba394
* commit '3457aba39480e85d582dd6890c4c72e418958782':
Set parent namespace for linker-namespaces
Change-Id: I20ea9239e95377894f477c33cf65bc7da7ad1e5a
Diffstat (limited to 'libnativeloader/native_loader.cpp')
| -rw-r--r-- | libnativeloader/native_loader.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp index f1858904a..3c929d8c1 100644 --- a/libnativeloader/native_loader.cpp +++ b/libnativeloader/native_loader.cpp @@ -97,11 +97,14 @@ class LibraryNamespaces { namespace_type |= ANDROID_NAMESPACE_TYPE_SHARED; } + android_namespace_t* parent_ns = FindParentNamespaceByClassLoader(env, class_loader); + ns = android_create_namespace("classloader-namespace", nullptr, library_path.c_str(), namespace_type, - permitted_path.c_str()); + permitted_path.c_str(), + parent_ns); if (ns != nullptr) { namespaces_.push_back(std::make_pair(env->NewWeakGlobalRef(class_loader), ns)); @@ -205,6 +208,29 @@ class LibraryNamespaces { return initialized_; } + jobject GetParentClassLoader(JNIEnv* env, jobject class_loader) { + jclass class_loader_class = env->FindClass("java/lang/ClassLoader"); + jmethodID get_parent = env->GetMethodID(class_loader_class, + "getParent", + "()Ljava/lang/ClassLoader;"); + + return env->CallObjectMethod(class_loader, get_parent); + } + + android_namespace_t* FindParentNamespaceByClassLoader(JNIEnv* env, jobject class_loader) { + jobject parent_class_loader = GetParentClassLoader(env, class_loader); + + while (parent_class_loader != nullptr) { + android_namespace_t* ns = FindNamespaceByClassLoader(env, parent_class_loader); + if (ns != nullptr) { + return ns; + } + + parent_class_loader = GetParentClassLoader(env, parent_class_loader); + } + return nullptr; + } + bool initialized_; std::vector<std::pair<jweak, android_namespace_t*>> namespaces_; std::string public_libraries_; |
