Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(903)

Unified Diff: base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java

Issue 200753002: [Android] Workaround of an android platform bug. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix a build error. Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
diff --git a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
index 9dc77fc8c006cfdb5c1c5c9d40327833f75f7cd2..0649db9e5af0a3eb69ec46545d211abe3506a32c 100644
--- a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
+++ b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
@@ -4,6 +4,7 @@
package org.chromium.base.library_loader;
+import android.content.Context;
import android.os.SystemClock;
import android.util.Log;
@@ -41,6 +42,11 @@ public class LibraryLoader {
// library_loader_hooks.cc).
private static boolean sInitialized = false;
+ // One-way switch becomes true if the system library loading failed,
+ // and the right native library was found and loaded by the hack.
+ // The flag is used to report UMA stats later.
+ public static boolean sNativeLibraryHack = false;
+
// TODO(cjhopman): Remove this once it's unused.
/**
* Doesn't do anything.
@@ -52,13 +58,14 @@ public class LibraryLoader {
/**
* This method blocks until the library is fully loaded and initialized.
*/
- public static void ensureInitialized() throws ProcessInitException {
+ public static void ensureInitialized(Context context, boolean isBrowserProcess)
+ throws ProcessInitException {
synchronized (sLock) {
if (sInitialized) {
// Already initialized, nothing to do.
return;
}
- loadAlreadyLocked();
+ loadAlreadyLocked(context, isBrowserProcess);
initializeAlreadyLocked(CommandLine.getJavaSwitchesOrNull());
}
}
@@ -81,9 +88,10 @@ public class LibraryLoader {
*
* @throws ProcessInitException if the native library failed to load.
*/
- public static void loadNow() throws ProcessInitException {
+ public static void loadNow(Context context, boolean isBrowserProcess)
+ throws ProcessInitException {
synchronized (sLock) {
- loadAlreadyLocked();
+ loadAlreadyLocked(context, isBrowserProcess);
}
}
@@ -103,7 +111,8 @@ public class LibraryLoader {
// Invoke System.loadLibrary(...), triggering JNI_OnLoad in native code
- private static void loadAlreadyLocked() throws ProcessInitException {
+ private static void loadAlreadyLocked(Context context, boolean isBrowserProcess)
+ throws ProcessInitException {
try {
if (!sLoaded) {
assert !sInitialized;
@@ -118,8 +127,19 @@ public class LibraryLoader {
Log.i(TAG, "Loading: " + library);
if (useChromiumLinker)
Linker.loadLibrary(library);
- else
- System.loadLibrary(library);
+ else {
+ try {
+ System.loadLibrary(library);
+ } catch (UnsatisfiedLinkError e) {
+ // Try to load from backup directory.
+ if (LibraryLoaderHelper.tryLoadLibraryUsingWorkaround(
+ context, library, isBrowserProcess)) {
+ sNativeLibraryHack = true;
+ } else {
+ throw e;
+ }
+ }
+ }
}
if (useChromiumLinker)
Linker.finishLibraryLoad();
@@ -143,9 +163,11 @@ public class LibraryLoader {
throw new ProcessInitException(LoaderErrors.LOADER_ERROR_NATIVE_LIBRARY_WRONG_VERSION);
}
+ if (isBrowserProcess) {
+ LibraryLoaderHelper.cleanupOldLibraries(context, !sNativeLibraryHack);
+ }
}
-
// Invoke base::android::LibraryLoaded in library_loader_hooks.cc
private static void initializeAlreadyLocked(String[] initCommandLine)
throws ProcessInitException {

Powered by Google App Engine
This is Rietveld 408576698