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
diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp
index 988e8a8..2a28a05 100644
--- a/libnativeloader/native_loader.cpp
+++ b/libnativeloader/native_loader.cpp
@@ -45,27 +45,15 @@
 #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;