summaryrefslogtreecommitdiffstats
path: root/libnativeloader
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2018-01-08 09:40:50 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2018-01-08 09:40:50 +0000
commit01ccde321f01a3acc7f61954861759b150aa9639 (patch)
treee31241d774bf5feeb788aab0b804e51eb1c3fbab /libnativeloader
parentfcec40de0b4f265a600b77688085d823b7f65d12 (diff)
parent5c7d582be4054eaf846a5b1cf49a41ff83f52232 (diff)
downloadsystem_core-01ccde321f01a3acc7f61954861759b150aa9639.tar.gz
system_core-01ccde321f01a3acc7f61954861759b150aa9639.tar.bz2
system_core-01ccde321f01a3acc7f61954861759b150aa9639.zip
Merge "Nativeloader: Add minimal effort for host library path"
Diffstat (limited to 'libnativeloader')
-rw-r--r--libnativeloader/native_loader.cpp49
1 files changed, 39 insertions, 10 deletions
diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp
index e9f0c0fca..6ddec4d8a 100644
--- a/libnativeloader/native_loader.cpp
+++ b/libnativeloader/native_loader.cpp
@@ -662,22 +662,51 @@ void* OpenNativeLibrary(JNIEnv* env,
return handle;
}
#else
- UNUSED(env, target_sdk_version, class_loader, library_path);
- *needs_native_bridge = false;
- void* handle = dlopen(path, RTLD_NOW);
- if (handle == nullptr) {
- if (NativeBridgeIsSupported(path)) {
+ UNUSED(env, target_sdk_version, class_loader);
+
+ // Do some best effort to emulate library-path support. It will not
+ // work for dependencies.
+ //
+ // Note: null has a special meaning and must be preserved.
+ std::string c_library_path; // Empty string by default.
+ if (library_path != nullptr && path != nullptr && path[0] != '/') {
+ ScopedUtfChars library_path_utf_chars(env, library_path);
+ c_library_path = library_path_utf_chars.c_str();
+ }
+
+ std::vector<std::string> library_paths = base::Split(c_library_path, ":");
+
+ for (const std::string& lib_path : library_paths) {
+ *needs_native_bridge = false;
+ const char* path_arg;
+ std::string complete_path;
+ if (path == nullptr) {
+ // Preserve null.
+ path_arg = nullptr;
+ } else {
+ complete_path = lib_path;
+ if (!complete_path.empty()) {
+ complete_path.append("/");
+ }
+ complete_path.append(path);
+ path_arg = complete_path.c_str();
+ }
+ void* handle = dlopen(path_arg, RTLD_NOW);
+ if (handle != nullptr) {
+ return handle;
+ }
+ if (NativeBridgeIsSupported(path_arg)) {
*needs_native_bridge = true;
- handle = NativeBridgeLoadLibrary(path, RTLD_NOW);
- if (handle == nullptr) {
- *error_msg = NativeBridgeGetError();
+ handle = NativeBridgeLoadLibrary(path_arg, RTLD_NOW);
+ if (handle != nullptr) {
+ return handle;
}
+ *error_msg = NativeBridgeGetError();
} else {
- *needs_native_bridge = false;
*error_msg = dlerror();
}
}
- return handle;
+ return nullptr;
#endif
}