From 538f99ab285c1440969b9b3331fc0ce750c0d316 Mon Sep 17 00:00:00 2001 From: Jooyung Han Date: Tue, 3 Mar 2020 00:46:50 +0900 Subject: Loading JNI libraries in an APEX To load JNI libraries in an APEX, libnativeloader relies on jni.config.txt file which contains available JNI libraries for APEX namespaces: com_android_foo libfoo_jni.so:... com_android_bar libbar_jni.so:... This file is generated by linkerconfig. Bug: 143733063 Test: cuttlestone boots (For now, no behavioral changes because jni.config.txt is empty) Change-Id: I066de90a73875118be53972e50d076061922d762 --- libnativeloader/native_loader.cpp | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) (limited to 'libnativeloader/native_loader.cpp') diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp index 988e8a841c..2a28a05c01 100644 --- a/libnativeloader/native_loader.cpp +++ b/libnativeloader/native_loader.cpp @@ -45,27 +45,15 @@ namespace { #if defined(__ANDROID__) using android::nativeloader::LibraryNamespaces; -constexpr const char* kApexPath = "/apex/"; - std::mutex g_namespaces_mutex; LibraryNamespaces* g_namespaces = new LibraryNamespaces; android_namespace_t* FindExportedNamespace(const char* caller_location) { - std::string location = caller_location; - // Lots of implicit assumptions here: we expect `caller_location` to be of the form: - // /apex/modulename/... - // - // And we extract from it 'modulename', which is the name of the linker namespace. - if (android::base::StartsWith(location, kApexPath)) { - size_t start_index = strlen(kApexPath); - size_t slash_index = location.find_first_of('/', start_index); - LOG_ALWAYS_FATAL_IF((slash_index == std::string::npos), - "Error finding namespace of apex: no slash in path %s", caller_location); - std::string name = location.substr(start_index, slash_index - start_index); - std::replace(name.begin(), name.end(), '.', '_'); - android_namespace_t* boot_namespace = android_get_exported_namespace(name.c_str()); + auto name = nativeloader::FindApexNamespaceName(caller_location); + if (name.ok()) { + android_namespace_t* boot_namespace = android_get_exported_namespace(name->c_str()); LOG_ALWAYS_FATAL_IF((boot_namespace == nullptr), - "Error finding namespace of apex: no namespace called %s", name.c_str()); + "Error finding namespace of apex: no namespace called %s", name->c_str()); return boot_namespace; } return nullptr; -- cgit v1.2.3-59-g8ed1b