Merge "Allow different namespace types for different classloaders"

This commit is contained in:
Dimitry Ivanov 2016-11-07 18:00:39 +00:00 committed by Gerrit Code Review
commit a61c48d5fd
4 changed files with 17 additions and 13 deletions

View File

@ -104,7 +104,7 @@ int NativeBridgeUnloadLibrary(void* handle);
// Get last error message of native bridge when fail to load library or search symbol.
// This is reflection of dlerror() for native bridge.
char* NativeBridgeGetError();
const char* NativeBridgeGetError();
struct native_bridge_namespace_t;
@ -244,7 +244,7 @@ struct NativeBridgeCallbacks {
// Returns:
// A string describing the most recent error that occurred when load library
// or lookup symbol via native bridge.
char* (*getError)();
const char* (*getError)();
// Check whether library paths are supported by native bridge.
//

View File

@ -551,15 +551,15 @@ int NativeBridgeUnloadLibrary(void* handle) {
return -1;
}
char* NativeBridgeGetError() {
const char* NativeBridgeGetError() {
if (NativeBridgeInitialized()) {
if (isCompatibleWith(NAMESPACE_VERSION)) {
return callbacks->getError();
} else {
ALOGE("not compatible with version %d, cannot get message", NAMESPACE_VERSION);
return "native bridge implementation is not compatible with version 3, cannot get message";
}
}
return nullptr;
return "native bridge is not initialized";
}
bool NativeBridgeIsPathSupported(const char* path) {

View File

@ -68,7 +68,7 @@ extern "C" int native_bridge3_unloadLibrary(void* /* handle */) {
return 0;
}
extern "C" char* native_bridge3_getError() {
extern "C" const char* native_bridge3_getError() {
return nullptr;
}

View File

@ -308,13 +308,17 @@ class LibraryNamespaces {
// code is one example) unknown to linker in which case linker uses anonymous
// namespace. The second argument specifies the search path for the anonymous
// namespace which is the library_path of the classloader.
if (!is_native_bridge) {
initialized_ = android_init_namespaces(public_libraries_.c_str(), library_path);
if (!initialized_) {
*error_msg = dlerror();
}
} else {
initialized_ = NativeBridgeInitNamespace(public_libraries_.c_str(), library_path);
initialized_ = android_init_namespaces(public_libraries_.c_str(),
is_native_bridge ? nullptr : library_path);
if (!initialized_) {
*error_msg = dlerror();
return false;
}
// and now initialize native bridge namespaces if necessary.
if (NativeBridgeInitialized()) {
initialized_ = NativeBridgeInitNamespace(public_libraries_.c_str(),
is_native_bridge ? library_path : nullptr);
if (!initialized_) {
*error_msg = NativeBridgeGetError();
}