Merge changes Ib80dcce9,Ifef3de75

am: 51c38147f8

* commit '51c38147f85598132068b7b29353b7d24212c7e9':
  nativeloader: Export FindNamespaceByClassLoader
  nativeloader: refactor FindNamespaceByClassLoader method
This commit is contained in:
Dimitry Ivanov 2016-02-23 05:39:51 +00:00 committed by android-build-merger
commit 3ef0a43d65
2 changed files with 34 additions and 19 deletions

View file

@ -19,6 +19,9 @@
#include "jni.h" #include "jni.h"
#include <stdint.h> #include <stdint.h>
#if defined(__ANDROID__)
#include <android/dlext.h>
#endif
namespace android { 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, jobject class_loader, bool is_shared, jstring library_path,
jstring permitted_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 }; // namespace android
#endif // NATIVE_BRIDGE_H_ #endif // NATIVE_BRIDGE_H_

View file

@ -79,10 +79,10 @@ class LibraryNamespaces {
std::lock_guard<std::mutex> guard(mutex_); std::lock_guard<std::mutex> guard(mutex_);
auto it = FindNamespaceByClassLoader(env, class_loader); android_namespace_t* ns = FindNamespaceByClassLoader(env, class_loader);
if (it != namespaces_.end()) { if (ns != nullptr) {
return it->second; return ns;
} }
uint64_t namespace_type = ANDROID_NAMESPACE_TYPE_ISOLATED; uint64_t namespace_type = ANDROID_NAMESPACE_TYPE_ISOLATED;
@ -90,20 +90,27 @@ class LibraryNamespaces {
namespace_type |= ANDROID_NAMESPACE_TYPE_SHARED; namespace_type |= ANDROID_NAMESPACE_TYPE_SHARED;
} }
android_namespace_t* ns = ns = android_create_namespace("classloader-namespace",
android_create_namespace("classloader-namespace", nullptr,
nullptr, library_path.c_str(),
library_path.c_str(), namespace_type,
namespace_type, java_permitted_path != nullptr ?
java_permitted_path != nullptr ? permitted_path.c_str() :
permitted_path.c_str() : nullptr);
nullptr);
namespaces_.push_back(std::make_pair(env->NewWeakGlobalRef(class_loader), ns)); namespaces_.push_back(std::make_pair(env->NewWeakGlobalRef(class_loader), ns));
return ns; return ns;
} }
android_namespace_t* FindNamespaceByClassLoader(JNIEnv* env, jobject class_loader) {
auto it = std::find_if(namespaces_.begin(), namespaces_.end(),
[&](const std::pair<jweak, android_namespace_t*>& value) {
return env->IsSameObject(value.first, class_loader);
});
return it != namespaces_.end() ? it->second : nullptr;
}
private: private:
void PreloadPublicLibraries() { void PreloadPublicLibraries() {
// android_init_namespaces() expects all the public libraries // android_init_namespaces() expects all the public libraries
@ -122,14 +129,6 @@ class LibraryNamespaces {
return initialized_; return initialized_;
} }
std::vector<std::pair<jweak, android_namespace_t*>>::const_iterator
FindNamespaceByClassLoader(JNIEnv* env, jobject class_loader) {
return std::find_if(namespaces_.begin(), namespaces_.end(),
[&](const std::pair<jweak, android_namespace_t*>& value) {
return env->IsSameObject(value.first, class_loader);
});
}
bool initialized_; bool initialized_;
std::mutex mutex_; std::mutex mutex_;
std::vector<std::pair<jweak, android_namespace_t*>> namespaces_; std::vector<std::pair<jweak, android_namespace_t*>> namespaces_;
@ -169,4 +168,10 @@ void* OpenNativeLibrary(JNIEnv* env, int32_t target_sdk_version, const char* pat
#endif #endif
} }
#if defined(__ANDROID__)
android_namespace_t* FindNamespaceByClassLoader(JNIEnv* env, jobject class_loader) {
return g_namespaces->FindNamespaceByClassLoader(env, class_loader);
}
#endif
}; // android namespace }; // android namespace