diff options
| author | Zhenhua WANG <zhenhua.wang@intel.com> | 2017-02-27 10:14:45 +0800 |
|---|---|---|
| committer | Calin Juravle <calin@google.com> | 2017-03-29 17:34:11 -0700 |
| commit | e8fb11dfa1b376124d0a1a349c8800799f25606a (patch) | |
| tree | 6b10f653cd6c76db1966a007aaea26498509a3fa /libnativebridge | |
| parent | c169b2018fb72ea31da68616548dcf6582cb0a93 (diff) | |
| download | system_core-e8fb11dfa1b376124d0a1a349c8800799f25606a.tar.gz system_core-e8fb11dfa1b376124d0a1a349c8800799f25606a.tar.bz2 system_core-e8fb11dfa1b376124d0a1a349c8800799f25606a.zip | |
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.
Test: make test-art-host-run-test-115-native-bridge
Change-Id: I71ce1dde19d61363d5eb9731fd4795a8c315b3a0
Diffstat (limited to 'libnativebridge')
| -rw-r--r-- | libnativebridge/native_bridge.cc | 19 | ||||
| -rw-r--r-- | libnativebridge/tests/Android.mk | 2 | ||||
| -rw-r--r-- | libnativebridge/tests/DummyNativeBridge3.cpp | 50 | ||||
| -rw-r--r-- | libnativebridge/tests/NativeBridge3InitAnonymousNamespace_test.cpp (renamed from libnativebridge/tests/NativeBridge3InitNamespace_test.cpp) | 24 |
4 files changed, 56 insertions, 39 deletions
diff --git a/libnativebridge/native_bridge.cc b/libnativebridge/native_bridge.cc index 83f35b1e8..050373ae5 100644 --- a/libnativebridge/native_bridge.cc +++ b/libnativebridge/native_bridge.cc @@ -573,11 +573,11 @@ bool NativeBridgeIsPathSupported(const char* path) { return false; } -bool NativeBridgeInitNamespace(const char* public_ns_sonames, - const char* anon_ns_library_path) { +bool NativeBridgeInitAnonymousNamespace(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); + return callbacks->initAnonymousNamespace(public_ns_sonames, anon_ns_library_path); } else { ALOGE("not compatible with version %d, cannot init namespace", NAMESPACE_VERSION); } @@ -608,6 +608,19 @@ native_bridge_namespace_t* NativeBridgeCreateNamespace(const char* name, 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)) { diff --git a/libnativebridge/tests/Android.mk b/libnativebridge/tests/Android.mk index 4c3e86298..c9468f033 100644 --- a/libnativebridge/tests/Android.mk +++ b/libnativebridge/tests/Android.mk @@ -24,7 +24,7 @@ test_src_files := \ NativeBridge3UnloadLibrary_test.cpp \ NativeBridge3GetError_test.cpp \ NativeBridge3IsPathSupported_test.cpp \ - NativeBridge3InitNamespace_test.cpp \ + NativeBridge3InitAnonymousNamespace_test.cpp \ NativeBridge3CreateNamespace_test.cpp \ NativeBridge3LoadLibraryExt_test.cpp diff --git a/libnativebridge/tests/DummyNativeBridge3.cpp b/libnativebridge/tests/DummyNativeBridge3.cpp index 13fce8599..4ef1c8273 100644 --- a/libnativebridge/tests/DummyNativeBridge3.cpp +++ b/libnativebridge/tests/DummyNativeBridge3.cpp @@ -76,8 +76,8 @@ extern "C" bool native_bridge3_isPathSupported(const char* /* path */) { return true; } -extern "C" bool native_bridge3_initNamespace(const char* /* public_ns_sonames */, - const char* /* anon_ns_library_path */) { +extern "C" bool native_bridge3_initAnonymousNamespace(const char* /* public_ns_sonames */, + const char* /* anon_ns_library_path */) { return true; } @@ -91,30 +91,34 @@ native_bridge3_createNamespace(const char* /* name */, return nullptr; } +extern "C" bool native_bridge3_linkNamespaces(android::native_bridge_namespace_t* /* from */, + android::native_bridge_namespace_t* /* to */, + const char* /* shared_libs_soname */) { + return true; +} + extern "C" void* native_bridge3_loadLibraryExt(const char* /* libpath */, int /* flag */, android::native_bridge_namespace_t* /* ns */) { return nullptr; } - -android::NativeBridgeCallbacks NativeBridgeItf { - // v1 - .version = 3, - .initialize = &native_bridge3_initialize, - .loadLibrary = &native_bridge3_loadLibrary, - .getTrampoline = &native_bridge3_getTrampoline, - .isSupported = &native_bridge3_isSupported, - .getAppEnv = &native_bridge3_getAppEnv, - // v2 - .isCompatibleWith = &native_bridge3_isCompatibleWith, - .getSignalHandler = &native_bridge3_getSignalHandler, - // v3 - .unloadLibrary = &native_bridge3_unloadLibrary, - .getError = &native_bridge3_getError, - .isPathSupported = &native_bridge3_isPathSupported, - .initNamespace = &native_bridge3_initNamespace, - .createNamespace = &native_bridge3_createNamespace, - .loadLibraryExt = &native_bridge3_loadLibraryExt -}; - +android::NativeBridgeCallbacks NativeBridgeItf{ + // v1 + .version = 3, + .initialize = &native_bridge3_initialize, + .loadLibrary = &native_bridge3_loadLibrary, + .getTrampoline = &native_bridge3_getTrampoline, + .isSupported = &native_bridge3_isSupported, + .getAppEnv = &native_bridge3_getAppEnv, + // v2 + .isCompatibleWith = &native_bridge3_isCompatibleWith, + .getSignalHandler = &native_bridge3_getSignalHandler, + // v3 + .unloadLibrary = &native_bridge3_unloadLibrary, + .getError = &native_bridge3_getError, + .isPathSupported = &native_bridge3_isPathSupported, + .initAnonymousNamespace = &native_bridge3_initAnonymousNamespace, + .createNamespace = &native_bridge3_createNamespace, + .linkNamespaces = &native_bridge3_linkNamespaces, + .loadLibraryExt = &native_bridge3_loadLibraryExt}; diff --git a/libnativebridge/tests/NativeBridge3InitNamespace_test.cpp b/libnativebridge/tests/NativeBridge3InitAnonymousNamespace_test.cpp index ae0fd2b02..b0d6b09d1 100644 --- a/libnativebridge/tests/NativeBridge3InitNamespace_test.cpp +++ b/libnativebridge/tests/NativeBridge3InitAnonymousNamespace_test.cpp @@ -20,20 +20,20 @@ namespace android { constexpr const char* kNativeBridgeLibrary3 = "libnativebridge3-dummy.so"; -TEST_F(NativeBridgeTest, V3_InitNamespace) { - // Init - ASSERT_TRUE(LoadNativeBridge(kNativeBridgeLibrary3, nullptr)); - ASSERT_TRUE(NativeBridgeAvailable()); - ASSERT_TRUE(PreInitializeNativeBridge(".", "isa")); - ASSERT_TRUE(NativeBridgeAvailable()); - ASSERT_TRUE(InitializeNativeBridge(nullptr, nullptr)); - ASSERT_TRUE(NativeBridgeAvailable()); +TEST_F(NativeBridgeTest, V3_InitAnonymousNamespace) { + // Init + ASSERT_TRUE(LoadNativeBridge(kNativeBridgeLibrary3, nullptr)); + ASSERT_TRUE(NativeBridgeAvailable()); + ASSERT_TRUE(PreInitializeNativeBridge(".", "isa")); + ASSERT_TRUE(NativeBridgeAvailable()); + ASSERT_TRUE(InitializeNativeBridge(nullptr, nullptr)); + ASSERT_TRUE(NativeBridgeAvailable()); - ASSERT_EQ(3U, NativeBridgeGetVersion()); - ASSERT_EQ(true, NativeBridgeInitNamespace(nullptr, nullptr)); + ASSERT_EQ(3U, NativeBridgeGetVersion()); + ASSERT_EQ(true, NativeBridgeInitAnonymousNamespace(nullptr, nullptr)); - // Clean-up code_cache - ASSERT_EQ(0, rmdir(kCodeCache)); + // Clean-up code_cache + ASSERT_EQ(0, rmdir(kCodeCache)); } } // namespace android |
