NativeBridge: add "linked namespace" semantic corresponding to linker

For dynamic linking perspective, semantics of NativeBridge needs to
align with dynamic linker. This patch adds "linked namespace" semantic
which shares some libraries from one namespace to another.

Bug: 37123321
Test: Fugu: netflix, play movies, youtube
Test: make test-art-host-run-test-115-native-bridge

cherry picked from commit e8fb11dfa1b376124d0a1a349c8800799f25606a

Change-Id: I71ce1dde19d61363d5eb9731fd4795a8c315b3a0
diff --git a/libnativebridge/native_bridge.cc b/libnativebridge/native_bridge.cc
index 83f35b1..7976f67 100644
--- a/libnativebridge/native_bridge.cc
+++ b/libnativebridge/native_bridge.cc
@@ -573,17 +573,17 @@
   return false;
 }
 
-bool NativeBridgeInitNamespace(const char* public_ns_sonames,
-                               const char* anon_ns_library_path) {
-  if (NativeBridgeInitialized()) {
-    if (isCompatibleWith(NAMESPACE_VERSION)) {
-      return callbacks->initNamespace(public_ns_sonames, anon_ns_library_path);
-    } else {
-      ALOGE("not compatible with version %d, cannot init namespace", NAMESPACE_VERSION);
+bool NativeBridgeInitAnonymousNamespace(const char* public_ns_sonames,
+                                        const char* anon_ns_library_path) {
+    if (NativeBridgeInitialized()) {
+        if (isCompatibleWith(NAMESPACE_VERSION)) {
+            return callbacks->initAnonymousNamespace(public_ns_sonames, anon_ns_library_path);
+        } else {
+            ALOGE("not compatible with version %d, cannot init namespace", NAMESPACE_VERSION);
+        }
     }
-  }
 
-  return false;
+    return false;
 }
 
 native_bridge_namespace_t* NativeBridgeCreateNamespace(const char* name,
@@ -608,6 +608,19 @@
   return nullptr;
 }
 
+bool NativeBridgeLinkNamespaces(native_bridge_namespace_t* from, native_bridge_namespace_t* to,
+                                const char* shared_libs_sonames) {
+    if (NativeBridgeInitialized()) {
+        if (isCompatibleWith(NAMESPACE_VERSION)) {
+            return callbacks->linkNamespaces(from, to, shared_libs_sonames);
+        } else {
+            ALOGE("not compatible with version %d, cannot init namespace", NAMESPACE_VERSION);
+        }
+    }
+
+    return false;
+}
+
 void* NativeBridgeLoadLibraryExt(const char* libpath, int flag, native_bridge_namespace_t* ns) {
   if (NativeBridgeInitialized()) {
     if (isCompatibleWith(NAMESPACE_VERSION)) {