| 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..eb5428cf1f904bc933b39bf9bf9a4f7c565d42f0
|
| --- /dev/null
|
| +++ b/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java
|
| @@ -0,0 +1,70 @@
|
| +// Copyright 2015 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")
|
| +class CronetLibraryLoader {
|
| + /**
|
| + * Synchronize access to sInitTaskPosted and initialization routine.
|
| + */
|
| + private static final Object sLoadLock = new Object();
|
| + private static boolean sInitTaskPosted = false;
|
| +
|
| + /**
|
| + * 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 (sInitTaskPosted) {
|
| + 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);
|
| + }
|
| + sInitTaskPosted = 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();
|
| + // registerToReceiveNotificationsAlways() is called before the native
|
| + // NetworkChangeNotifierAndroid is created, so as to avoid receiving
|
| + // the undesired initial network change observer notification, which
|
| + // will cause active requests to fail with ERR_NETWORK_CHANGED.
|
| + nativeCronetInitOnMainThread(context);
|
| + }
|
| +
|
| + // Native methods are implemented in cronet_loader.cc.
|
| + private static native void nativeCronetInitOnMainThread(Context context);
|
| +}
|
|
|