diff options
| author | Brian Carlstrom <bdc@google.com> | 2013-10-31 15:18:56 -0700 |
|---|---|---|
| committer | Brian Carlstrom <bdc@google.com> | 2013-10-31 16:05:00 -0700 |
| commit | feeb36c2bd4adfe285f98f5de92e0f3771b2c115 (patch) | |
| tree | abb998782b2c9c00d554fc3f03421a03675c5b99 | |
| parent | a77f3a243aad5632832fa822e1ac07bb4b5d5668 (diff) | |
| download | platform_libnativehelper-kitkat-mr1-release.tar.gz platform_libnativehelper-kitkat-mr1-release.tar.bz2 platform_libnativehelper-kitkat-mr1-release.zip | |
Fallback to a known good runtime if requested one is not availableandroid-sdk-4.4.2_r1.0.1android-sdk-4.4.2_r1android-4.4w_r1android-4.4.4_r2.0.1android-4.4.4_r2android-4.4.4_r1.0.1android-4.4.4_r1android-4.4.3_r1.1.0.1android-4.4.3_r1.1android-4.4.3_r1.0.1android-4.4.3_r1android-4.4.2_r2.0.1android-4.4.2_r2android-4.4.2_r1.0.1android-4.4.2_r1android-4.4.1_r1.0.1android-4.4.1_r1kitkat-wearkitkat-mr2.2-releasekitkat-mr2.1-releasekitkat-mr2-releasekitkat-mr1.1-releasekitkat-mr1-releasekitkat-dev
Bug: 11463182
Change-Id: I478e7ab9eaee179114b7fa6afe660233e66b0614
| -rw-r--r-- | JniInvocation.cpp | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/JniInvocation.cpp b/JniInvocation.cpp index e78cff8..acd019a 100644 --- a/JniInvocation.cpp +++ b/JniInvocation.cpp @@ -18,6 +18,7 @@ #include <dlfcn.h> #include <stdlib.h> +#include <string.h> #include <cstddef> @@ -47,12 +48,17 @@ JniInvocation::~JniInvocation() { } } +#ifdef HAVE_ANDROID_OS +static const char* kLibrarySystemProperty = "persist.sys.dalvik.vm.lib"; +#endif +static const char* kLibraryFallback = "libdvm.so"; + bool JniInvocation::Init(const char* library) { #ifdef HAVE_ANDROID_OS char default_library[PROPERTY_VALUE_MAX]; - property_get("persist.sys.dalvik.vm.lib", default_library, "libdvm.so"); + property_get(kLibrarySystemProperty, default_library, kLibraryFallback); #else - const char* default_library = "libdvm.so"; + const char* default_library = kLibraryFallback; #endif if (library == NULL) { library = default_library; @@ -60,8 +66,24 @@ bool JniInvocation::Init(const char* library) { handle_ = dlopen(library, RTLD_NOW); if (handle_ == NULL) { - ALOGE("Failed to dlopen %s: %s", library, dlerror()); - return false; + if (strcmp(library, kLibraryFallback) == 0) { + // Nothing else to try. + ALOGE("Failed to dlopen %s: %s", library, dlerror()); + return false; + } + // Note that this is enough to get something like the zygote + // running, we can't property_set here to fix this for the future + // because we are root and not the system user. See + // RuntimeInit.commonInit for where we fix up the property to + // avoid future fallbacks. http://b/11463182 + ALOGW("Falling back from %s to %s after dlopen error: %s", + library, kLibraryFallback, dlerror()); + library = kLibraryFallback; + handle_ = dlopen(library, RTLD_NOW); + if (handle_ == NULL) { + ALOGE("Failed to dlopen %s: %s", library, dlerror()); + return false; + } } if (!FindSymbol(reinterpret_cast<void**>(&JNI_GetDefaultJavaVMInitArgs_), "JNI_GetDefaultJavaVMInitArgs")) { |
