diff --git a/libnativebridge/include/nativebridge/native_bridge.h b/libnativebridge/include/nativebridge/native_bridge.h index 5aea9670b..e9c950025 100644 --- a/libnativebridge/include/nativebridge/native_bridge.h +++ b/libnativebridge/include/nativebridge/native_bridge.h @@ -164,8 +164,9 @@ bool NativeBridgeLinkNamespaces(struct native_bridge_namespace_t* from, void* NativeBridgeLoadLibraryExt(const char* libpath, int flag, struct native_bridge_namespace_t* ns); -// Returns vendor namespace if it is enabled for the device and null otherwise -struct native_bridge_namespace_t* NativeBridgeGetVendorNamespace(); +// Returns exported namespace by the name. This is a reflection of +// android_get_exported_namespace function. Introduced in v5. +struct native_bridge_namespace_t* NativeBridgeGetExportedNamespace(const char* name); // Native bridge interfaces to runtime. struct NativeBridgeCallbacks { @@ -362,7 +363,17 @@ struct NativeBridgeCallbacks { // // Returns: // vendor namespace or null if it was not set up for the device + // + // Starting with v5 (Android Q) this function is no longer used. + // Use getExportedNamespace() below. struct native_bridge_namespace_t* (*getVendorNamespace)(); + + // Get native bridge version of exported namespace. Peer of + // android_get_exported_namespace(const char*) function. + // + // Returns: + // exported namespace or null if it was not set up for the device + struct native_bridge_namespace_t* (*getExportedNamespace)(const char* name); }; // Runtime interfaces to native bridge. diff --git a/libnativebridge/libnativebridge.map.txt b/libnativebridge/libnativebridge.map.txt index a616b8526..a6841a3a8 100644 --- a/libnativebridge/libnativebridge.map.txt +++ b/libnativebridge/libnativebridge.map.txt @@ -24,7 +24,7 @@ LIBNATIVEBRIDGE_1 { NativeBridgeGetError; NativeBridgeIsPathSupported; NativeBridgeCreateNamespace; - NativeBridgeGetVendorNamespace; + NativeBridgeGetExportedNamespace; NativeBridgeLinkNamespaces; NativeBridgeLoadLibraryExt; NativeBridgeInitAnonymousNamespace; diff --git a/libnativebridge/native_bridge.cc b/libnativebridge/native_bridge.cc index a2d8d81ef..9adba9a50 100644 --- a/libnativebridge/native_bridge.cc +++ b/libnativebridge/native_bridge.cc @@ -101,6 +101,8 @@ enum NativeBridgeImplementationVersion { NAMESPACE_VERSION = 3, // The version with vendor namespaces VENDOR_NAMESPACE_VERSION = 4, + // The version with runtime namespaces + RUNTIME_NAMESPACE_VERSION = 5, }; // Whether we had an error at some point. @@ -610,12 +612,22 @@ bool NativeBridgeLinkNamespaces(native_bridge_namespace_t* from, native_bridge_n return false; } -native_bridge_namespace_t* NativeBridgeGetVendorNamespace() { - if (!NativeBridgeInitialized() || !isCompatibleWith(VENDOR_NAMESPACE_VERSION)) { +native_bridge_namespace_t* NativeBridgeGetExportedNamespace(const char* name) { + if (!NativeBridgeInitialized()) { return nullptr; } - return callbacks->getVendorNamespace(); + if (isCompatibleWith(RUNTIME_NAMESPACE_VERSION)) { + return callbacks->getExportedNamespace(name); + } + + // sphal is vendor namespace name -> use v4 callback in the case NB callbacks + // are not compatible with v5 + if (isCompatibleWith(VENDOR_NAMESPACE_VERSION) && name != nullptr && strcmp("sphal", name) == 0) { + return callbacks->getVendorNamespace(); + } + + return nullptr; } void* NativeBridgeLoadLibraryExt(const char* libpath, int flag, native_bridge_namespace_t* ns) { diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp index ad967dbee..47af90d9a 100644 --- a/libnativeloader/native_loader.cpp +++ b/libnativeloader/native_loader.cpp @@ -300,7 +300,7 @@ class LibraryNamespaces { return nullptr; } - native_bridge_namespace_t* vendor_ns = NativeBridgeGetVendorNamespace(); + native_bridge_namespace_t* vendor_ns = NativeBridgeGetExportedNamespace(kVendorNamespaceName); if (!NativeBridgeLinkNamespaces(ns, nullptr, system_exposed_libraries.c_str())) { *error_msg = NativeBridgeGetError();