Merge "Preload public native libraries"
diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp
index 209ff1c..a7a0713 100644
--- a/libnativeloader/native_loader.cpp
+++ b/libnativeloader/native_loader.cpp
@@ -57,7 +57,9 @@
class LibraryNamespaces {
public:
- LibraryNamespaces() : initialized_(false) { }
+ LibraryNamespaces() : initialized_(false) {
+ PreloadPublicLibraries();
+ }
android_namespace_t* GetOrCreate(JNIEnv* env, jobject class_loader,
bool is_shared,
@@ -103,15 +105,16 @@
}
private:
- bool InitPublicNamespace(const char* library_path) {
- // Make sure all the public libraries are loaded
+ void PreloadPublicLibraries() {
+ // android_init_namespaces() expects all the public libraries
+ // to be loaded so that they can be found by soname alone.
std::vector<std::string> sonames = android::base::Split(kPublicNativeLibraries, ":");
for (const auto& soname : sonames) {
- if (dlopen(soname.c_str(), RTLD_NOW | RTLD_NODELETE) == nullptr) {
- return false;
- }
+ dlopen(soname.c_str(), RTLD_NOW | RTLD_NODELETE);
}
+ }
+ 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.
initialized_ = android_init_namespaces(kPublicNativeLibraries, library_path);