diff options
| author | Treehugger Robot <treehugger-gerrit@google.com> | 2018-01-08 09:40:50 +0000 |
|---|---|---|
| committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-01-08 09:40:50 +0000 |
| commit | 01ccde321f01a3acc7f61954861759b150aa9639 (patch) | |
| tree | e31241d774bf5feeb788aab0b804e51eb1c3fbab /libnativeloader | |
| parent | fcec40de0b4f265a600b77688085d823b7f65d12 (diff) | |
| parent | 5c7d582be4054eaf846a5b1cf49a41ff83f52232 (diff) | |
| download | system_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.cpp | 49 |
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 } |
