Merge changes Ib80dcce9,Ifef3de75
am: 51c38147f8
* commit '51c38147f85598132068b7b29353b7d24212c7e9':
nativeloader: Export FindNamespaceByClassLoader
nativeloader: refactor FindNamespaceByClassLoader method
This commit is contained in:
commit
3ef0a43d65
2 changed files with 34 additions and 19 deletions
|
|
@ -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_
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue