Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6f800229 authored by Dimitry Ivanov's avatar Dimitry Ivanov
Browse files

Add PreloadPublicNativeLibraries function

Shift responsibility of preloading native libraries to the user
of the library. This lets applications that do not use jni but
depend on libnative_loader.so to avoid unnecessary preloads of
public libraries which could be expensive.

Bug: http://b/27245894
Change-Id: I12a8100de5da639c068769bca21ecebff2b2d538
(cherry picked from commit 426799d7)
parent d458730b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -25,6 +25,9 @@

namespace android {

__attribute__((visibility("default")))
void PreloadPublicNativeLibraries();

__attribute__((visibility("default")))
void* OpenNativeLibrary(JNIEnv* env, int32_t target_sdk_version, const char* path,
                        jobject class_loader, bool is_shared, jstring library_path,
+8 −4
Original line number Diff line number Diff line
@@ -57,9 +57,7 @@ static const char* kPublicNativeLibraries = "libandroid.so:"

class LibraryNamespaces {
 public:
  LibraryNamespaces() : initialized_(false) {
    PreloadPublicLibraries();
  }
  LibraryNamespaces() : initialized_(false) { }

  android_namespace_t* GetOrCreate(JNIEnv* env, jobject class_loader,
                                   bool is_shared,
@@ -111,7 +109,6 @@ class LibraryNamespaces {
    return it != namespaces_.end() ? it->second : nullptr;
  }

 private:
  void PreloadPublicLibraries() {
    // android_init_namespaces() expects all the public libraries
    // to be loaded so that they can be found by soname alone.
@@ -121,6 +118,7 @@ class LibraryNamespaces {
    }
  }

 private:
  bool InitPublicNamespace(const char* library_path) {
    // Some apps call dlopen from generated code unknown to linker in which
    // case linker uses anonymous namespace. See b/25844435 for details.
@@ -139,6 +137,12 @@ class LibraryNamespaces {
static LibraryNamespaces* g_namespaces = new LibraryNamespaces;
#endif

void PreloadPublicNativeLibraries() {
#if defined(__ANDROID__)
  g_namespaces->PreloadPublicLibraries();
#endif
}


void* OpenNativeLibrary(JNIEnv* env, int32_t target_sdk_version, const char* path,
                        jobject class_loader, bool is_shared, jstring java_library_path,