Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d836ab00 authored by Dimitry Ivanov's avatar Dimitry Ivanov
Browse files

Allow different namespace types for different classloaders

An app should be able to make cross-arch calls to different apps
via other app's Context.getClassLoader()

Bug: 32542970
Test: Boot fugu. Check that there are no linker-namespace
      related errors in the log.

Change-Id: I1593f4688bcde0121a5e24a707441a4935fa7dc4
parent 8d339e94
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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.
  //
+3 −3
Original line number Diff line number Diff line
@@ -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) {
+1 −1
Original line number Diff line number Diff line
@@ -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;
}

+11 −7
Original line number Diff line number Diff line
@@ -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);
    initialized_ = android_init_namespaces(public_libraries_.c_str(),
                                           is_native_bridge ? nullptr : library_path);
    if (!initialized_) {
      *error_msg = dlerror();
      return false;
    }
    } else {
      initialized_ = NativeBridgeInitNamespace(public_libraries_.c_str(), library_path);

    // 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();
      }