Chromium Code Reviews| Index: components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java |
| diff --git a/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java b/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..975cfbf733fd7ab097aef2c0ca29ba64f5b5674c |
| --- /dev/null |
| +++ b/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java |
| @@ -0,0 +1,66 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +package org.chromium.net; |
| + |
| +import android.content.Context; |
| +import android.os.Handler; |
| +import android.os.Looper; |
| + |
| +import org.chromium.base.JNINamespace; |
| + |
| +/** |
| + * CronetLibraryLoader loads and initializes native library on main thread. |
| + */ |
| +@JNINamespace("cronet") |
| +public class CronetLibraryLoader { |
|
mmenke
2015/01/23 20:41:41
Do we need to expose this externally?
mef
2015/01/28 21:32:28
Good point. Done.
|
| + /** |
| + * Synchronize access to sLoadComplete and initialization routine. |
| + */ |
| + private static final Object sLoadLock = new Object(); |
| + private static boolean sLoadComplete = false; |
|
mmenke
2015/01/23 20:41:41
sLoadComplete doesn't seem like a great name. sI
mef
2015/01/28 21:32:28
Done.
|
| + |
| + /** |
| + * Ensure that native library is loaded and initialized. Can be called from |
| + * any thread, the load and initialization is performed on main thread. |
| + */ |
| + public static void ensureInitialized( |
| + final Context context, final UrlRequestContextConfig config) { |
| + synchronized (sLoadLock) { |
| + if (sLoadComplete) { |
| + return; |
| + } |
| + System.loadLibrary(config.libraryName()); |
| + // Init native Chromium URLRequestContext on Main UI thread. |
| + Runnable task = new Runnable() { |
| + public void run() { |
| + initOnMainThread(context); |
| + } |
| + }; |
| + // Run task immediately or post it to the UI thread. |
| + if (Looper.getMainLooper() == Looper.myLooper()) { |
| + task.run(); |
| + } else { |
| + // The initOnMainThread will complete on the main thread prior |
| + // to other tasks posted to the main thread. |
| + new Handler(Looper.getMainLooper()).post(task); |
| + } |
| + sLoadComplete = true; |
| + } |
| + } |
| + |
| + private static void initOnMainThread(final Context context) { |
| + NetworkChangeNotifier.init(context); |
| + // Registers to always receive network notifications. Note |
| + // that this call is fine for Cronet because Cronet |
| + // embedders do not have API access to create network change |
| + // observers. Existing observers in the net stack do not |
| + // perform expensive work. |
| + NetworkChangeNotifier.registerToReceiveNotificationsAlways(); |
| + nativeCronetInitOnMainThread(context); |
| + } |
| + |
| + // Native methods are implemented in cronet_loader.cc. |
| + private static native long nativeCronetInitOnMainThread(Context context); |
| +} |