Revert of https://codereview.webrtc.org/2889183002/
And also revert https://codereview.webrtc.org/2888093005/ (Chromium roll) which has a dependency on 2889183002

BUG=webrtc:7707

Review-Url: https://codereview.webrtc.org/2897423002
Cr-Commit-Position: refs/heads/master@{#18263}
diff --git a/DEPS b/DEPS
index b04c56b..52886ed 100644
--- a/DEPS
+++ b/DEPS
@@ -2,7 +2,7 @@
 
 vars = {
   'chromium_git': 'https://chromium.googlesource.com',
-  'chromium_revision': 'c1878a272a87bd797949717bebdfdbc1e6f0c143',
+  'chromium_revision': 'b4155a0bbd8b968baa44f8c9656e86e351b4e50a',
   'boringssl_git': 'https://boringssl.googlesource.com',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
@@ -15,7 +15,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
-  'boringssl_revision': '467d3220f86c2fd26107783f1e3762ba5ecad9da',
+  'boringssl_revision': '1e5cb820de99c754b57ab4321e1456ac6bdc1a78',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling lss
   # and whatever else without interference from each other.
@@ -23,26 +23,25 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '6bd7ec034804d7ece286366393fab685e91595c1',
+  'catapult_revision': '9e7bc18ce70595be32d8534b4309aff83ac78434',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
   'libfuzzer_revision': '16f5f743c188c836d32cdaf349d5d3effb8a3518',
 }
-
 deps = {
   # TODO(kjellander): Move this to be Android-only once the libevent dependency
   # in base/third_party/libevent is solved.
   'src/base':
-    Var('chromium_git') + '/chromium/src/base' + '@' + 'b05612a7f430f5cd0573b35a151a0cd013b20ded',
+    Var('chromium_git') + '/chromium/src/base' + '@' + '4545fc1f631d4259ee10a9b2972160831cd08a53',
   'src/build':
-    Var('chromium_git') + '/chromium/src/build' + '@' + '4763c94e5e5696e8db6a755c163ff251de728348',
+    Var('chromium_git') + '/chromium/src/build' + '@' + 'f671d3baeb64d9dba628ad582e867cf1aebc0207',
   'src/buildtools':
     Var('chromium_git') + '/chromium/buildtools.git' + '@' + '98f00fa10dbad2cdbb2e297a66c3d6d5bc3994f3',
   'src/testing':
-    Var('chromium_git') + '/chromium/src/testing' + '@' + '5fef37b05e0b251bfa7bd428405a4db9c5957139',
+    Var('chromium_git') + '/chromium/src/testing' + '@' + 'dbbebc0d545834b83dbacf6b20188c7ed2ba45fe',
   'src/third_party':
-    Var('chromium_git') + '/chromium/src/third_party' + '@' + '9577054f45a7102b259c16560ea22191893b9bb6',
+    Var('chromium_git') + '/chromium/src/third_party' + '@' + '744b88f9a83ead5dd946581462acd3c8b289113a',
   'src/third_party/boringssl/src':
    Var('boringssl_git') + '/boringssl.git' + '@' +  Var('boringssl_revision'),
   'src/third_party/catapult':
@@ -52,20 +51,18 @@
   'src/third_party/ffmpeg':
     Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + '28a5cdde5c32bcf66715343c10f74e85713f7aaf',
   'src/third_party/googletest/src':
-    Var('chromium_git') + '/external/github.com/google/googletest.git' + '@' + '42bc671f47b122fad36db5eccbc06868afdf7862',
+    Var('chromium_git') + '/external/github.com/google/googletest.git' + '@' + '8c7f93fedaca1b0158e67af0f5dd63a044066eab',
   'src/third_party/jsoncpp/source':
     Var('chromium_git') + '/external/github.com/open-source-parsers/jsoncpp.git' + '@' + 'f572e8e42e22cfcf5ab0aea26574f408943edfa4', # from svn 248
-
   # Used for building libFuzzers (only supports Linux).
   'src/third_party/libFuzzer/src':
     Var('chromium_git') + '/chromium/llvm-project/llvm/lib/Fuzzer.git' + '@' +  Var('libfuzzer_revision'),
-
   'src/third_party/libjpeg_turbo':
     Var('chromium_git') + '/chromium/deps/libjpeg_turbo.git' + '@' + 'a1750dbc79a8792dde3d3f7d7d8ac28ba01ac9dd',
   'src/third_party/libsrtp':
    Var('chromium_git') + '/chromium/deps/libsrtp.git' + '@' + 'ccf84786f8ef803cb9c75e919e5a3976b9f5a672',
   'src/third_party/libvpx/source/libvpx':
-    Var('chromium_git') + '/webm/libvpx.git' + '@' +  'b3bf91bdc60220c004a22d21c867cc392e684b81',
+    Var('chromium_git') + '/webm/libvpx.git' + '@' +  'ac8f58f6ab73fea7948f40eaf608f832964d8a58',
   'src/third_party/libyuv':
     Var('chromium_git') + '/libyuv/libyuv.git' + '@' + '945ea1b7463004581502ebbcfc5a0b2f54ff6867',
   'src/third_party/openh264/src':
@@ -77,21 +74,19 @@
   'src/third_party/yasm/source/patched-yasm':
     Var('chromium_git') + '/chromium/deps/yasm/patched-yasm.git' + '@' + '7da28c6c7c6a1387217352ce02b31754deb54d2a',
   'src/tools':
-    Var('chromium_git') + '/chromium/src/tools' + '@' + '352772c07f1ab117bbb228ec8e857870cb123e0f',
+    Var('chromium_git') + '/chromium/src/tools' + '@' + 'e095601b862720c85a699c2ce05e78a1b890df35',
   'src/tools/gyp':
     Var('chromium_git') + '/external/gyp.git' + '@' + 'eb296f67da078ec01f5e3a9ea9cdc6d26d680161',
    'src/tools/swarming_client':
      Var('chromium_git') + '/external/swarming.client.git' + '@' +  Var('swarming_revision'),
-
   # WebRTC-only dependencies (not present in Chromium).
   'src/third_party/gflags':
     Var('chromium_git') + '/external/webrtc/deps/third_party/gflags' + '@' + '892576179b45861b53e04a112996a738309cf364',
   'src/third_party/gflags/src':
     Var('chromium_git') + '/external/github.com/gflags/gflags' + '@' + '03bebcb065c83beff83d50ae025a55a4bf94dfca',
   'src/third_party/gtest-parallel':
-    Var('chromium_git') + '/external/github.com/google/gtest-parallel' + '@' + '21b383f81a2214307a5cece839206418a2ba820b',
+    Var('chromium_git') + '/external/github.com/google/gtest-parallel' + '@' + 'c95bf7d82c30e57560be91890aa968d9bc4cedae',
 }
-
 deps_os = {
   'android': {
     'src/third_party/android_tools':
@@ -99,7 +94,7 @@
     'src/third_party/ced/src':
       Var('chromium_git') + '/external/github.com/google/compact_enc_det.git' + '@' + 'e21eb6aed10b9f6e2727f136c52420033214d458',
     'src/third_party/icu':
-      Var('chromium_git') + '/chromium/deps/icu.git' + '@' + 'c844075aa0f1758d04f9192825f1b1e7e607992e',
+      Var('chromium_git') + '/chromium/deps/icu.git' + '@' + '87232d8d763692d4b8303f0194472a82c829a6a9',
     'src/third_party/jsr-305/src':
       Var('chromium_git') + '/external/jsr-305.git' + '@' + '642c508235471f7220af6d5df2d3210e3bfc0919',
     'src/third_party/junit/src':
@@ -114,7 +109,6 @@
       Var('chromium_git') + '/external/robolectric.git' + '@' + '2a0b6ba221c14f3371813a676ce06143353e448d',
     'src/third_party/ub-uiautomator/lib':
       Var('chromium_git') + '/chromium/third_party/ub-uiautomator.git' + '@' + '00270549ce3161ae72ceb24712618ea28b4f9434',
-
     # Gradle 3.5.0. Used for testing Android Studio project generation for WebRTC.
     'src/webrtc/examples/androidtests/third_party/gradle':
       Var('chromium_git') + '/external/github.com/gradle/gradle.git' + '@' +
@@ -122,7 +116,7 @@
   },
   'ios': {
     'src/ios':
-      Var('chromium_git') + '/chromium/src/ios' + '@' + 'ecec75065b2b62f57b9ba0c14cac5dc8a51ad515',
+      Var('chromium_git') + '/chromium/src/ios' + '@' + '411732c0b91e4116dc6123c20042891ed4619e55',
   },
   'unix': {
     'src/third_party/lss':
@@ -132,13 +126,11 @@
     # Dependencies used by libjpeg-turbo
     'src/third_party/yasm/binaries':
       Var('chromium_git') + '/chromium/deps/yasm/binaries.git' + '@' + '52f9b3f4b0aa06da24ef8b123058bb61ee468881',
-
     # WebRTC-only dependency (not present in Chromium).
     'src/third_party/winsdk_samples':
       Var('chromium_git') + '/external/webrtc/deps/third_party/winsdk_samples_v71' + '@' + '2d31a1cbecc86359e6ec041fb9ff6c082babd073',
   },
 }
-
 pre_deps_hooks = [
   {
     # Remove any symlinks from before 177567c518b121731e507e9b9c4049c4dc96e4c8.
@@ -148,7 +140,6 @@
     'action': ['python', 'src/cleanup_links.py'],
   },
 ]
-
 hooks = [
   {
     # Check for legacy named top-level dir (named 'trunk').
@@ -526,11 +517,9 @@
                'src/resources'],
   },
 ]
-
 recursedeps = [
   # buildtools provides clang_format, libc++, and libc++abi.
   'src/buildtools',
   # android_tools manages the NDK.
   'src/third_party/android_tools',
 ]
-
diff --git a/webrtc/modules/audio_device/android/audio_manager.cc b/webrtc/modules/audio_device/android/audio_manager.cc
index d56e9c1..6925c3d 100644
--- a/webrtc/modules/audio_device/android/audio_manager.cc
+++ b/webrtc/modules/audio_device/android/audio_manager.cc
@@ -83,10 +83,11 @@
   j_native_registration_ = j_environment_->RegisterNatives(
       "org/webrtc/voiceengine/WebRtcAudioManager", native_methods,
       arraysize(native_methods));
-  j_audio_manager_.reset(
-      new JavaAudioManager(j_native_registration_.get(),
-                           j_native_registration_->NewObject(
-                               "<init>", "(J)V", PointerTojlong(this))));
+  j_audio_manager_.reset(new JavaAudioManager(
+      j_native_registration_.get(),
+      j_native_registration_->NewObject(
+          "<init>", "(Landroid/content/Context;J)V",
+          JVM::GetInstance()->context(), PointerTojlong(this))));
 }
 
 AudioManager::~AudioManager() {
diff --git a/webrtc/modules/audio_device/android/audio_record_jni.cc b/webrtc/modules/audio_device/android/audio_record_jni.cc
index 2a9eacf..b826ef6 100644
--- a/webrtc/modules/audio_device/android/audio_record_jni.cc
+++ b/webrtc/modules/audio_device/android/audio_record_jni.cc
@@ -90,10 +90,11 @@
   j_native_registration_ = j_environment_->RegisterNatives(
       "org/webrtc/voiceengine/WebRtcAudioRecord", native_methods,
       arraysize(native_methods));
-  j_audio_record_.reset(
-      new JavaAudioRecord(j_native_registration_.get(),
-                          j_native_registration_->NewObject(
-                              "<init>", "(J)V", PointerTojlong(this))));
+  j_audio_record_.reset(new JavaAudioRecord(
+      j_native_registration_.get(),
+      j_native_registration_->NewObject(
+          "<init>", "(Landroid/content/Context;J)V",
+          JVM::GetInstance()->context(), PointerTojlong(this))));
   // Detach from this thread since we want to use the checker to verify calls
   // from the Java based audio thread.
   thread_checker_java_.DetachFromThread();
diff --git a/webrtc/modules/audio_device/android/audio_track_jni.cc b/webrtc/modules/audio_device/android/audio_track_jni.cc
index 83c01c9..72e056f 100644
--- a/webrtc/modules/audio_device/android/audio_track_jni.cc
+++ b/webrtc/modules/audio_device/android/audio_track_jni.cc
@@ -89,10 +89,11 @@
   j_native_registration_ = j_environment_->RegisterNatives(
       "org/webrtc/voiceengine/WebRtcAudioTrack", native_methods,
       arraysize(native_methods));
-  j_audio_track_.reset(
-      new JavaAudioTrack(j_native_registration_.get(),
-                         j_native_registration_->NewObject(
-                             "<init>", "(J)V", PointerTojlong(this))));
+  j_audio_track_.reset(new JavaAudioTrack(
+      j_native_registration_.get(),
+      j_native_registration_->NewObject(
+          "<init>", "(Landroid/content/Context;J)V",
+          JVM::GetInstance()->context(), PointerTojlong(this))));
   // Detach from this thread since we want to use the checker to verify calls
   // from the Java based audio thread.
   thread_checker_java_.DetachFromThread();
diff --git a/webrtc/modules/audio_device/android/ensure_initialized.cc b/webrtc/modules/audio_device/android/ensure_initialized.cc
index b82d4b7..9bc08ab 100644
--- a/webrtc/modules/audio_device/android/ensure_initialized.cc
+++ b/webrtc/modules/audio_device/android/ensure_initialized.cc
@@ -17,6 +17,7 @@
 // Note: this dependency is dangerous since it reaches into Chromium's base.
 // There's a risk of e.g. macro clashes. This file may only be used in tests.
 RTC_PUSH_IGNORING_WUNDEF()
+#include "base/android/context_utils.h"
 #include "base/android/jni_android.h"
 RTC_POP_IGNORING_WUNDEF()
 #include "webrtc/base/checks.h"
@@ -34,9 +35,10 @@
   JNIEnv* jni = ::base::android::AttachCurrentThread();
   JavaVM* jvm = NULL;
   RTC_CHECK_EQ(0, jni->GetJavaVM(&jvm));
+  jobject context = ::base::android::GetApplicationContext().obj();
 
   // Initialize the Java environment (currently only used by the audio manager).
-  webrtc::JVM::Initialize(jvm);
+  webrtc::JVM::Initialize(jvm, context);
 }
 
 void EnsureInitialized() {
diff --git a/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioManager.java b/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioManager.java
index 76ec4c5..24b8ab8 100644
--- a/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioManager.java
+++ b/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioManager.java
@@ -20,7 +20,6 @@
 import android.os.Build;
 import java.util.Timer;
 import java.util.TimerTask;
-import org.webrtc.ContextUtils;
 import org.webrtc.Logging;
 
 // WebRtcAudioManager handles tasks that uses android.media.AudioManager.
@@ -136,6 +135,7 @@
   }
 
   private final long nativeAudioManager;
+  private final Context context;
   private final AudioManager audioManager;
 
   private boolean initialized = false;
@@ -156,11 +156,11 @@
 
   private final VolumeLogger volumeLogger;
 
-  WebRtcAudioManager(long nativeAudioManager) {
+  WebRtcAudioManager(Context context, long nativeAudioManager) {
     Logging.d(TAG, "ctor" + WebRtcAudioUtils.getThreadInfo());
+    this.context = context;
     this.nativeAudioManager = nativeAudioManager;
-    audioManager =
-        (AudioManager) ContextUtils.getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
+    audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
     if (DEBUG) {
       WebRtcAudioUtils.logDeviceInfo(TAG);
     }
@@ -224,14 +224,12 @@
 
   // Gets the current earpiece state.
   private boolean hasEarpiece() {
-    return ContextUtils.getApplicationContext().getPackageManager().hasSystemFeature(
-        PackageManager.FEATURE_TELEPHONY);
+    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
   }
 
   // Returns true if low-latency audio output is supported.
   private boolean isLowLatencyOutputSupported() {
-    return ContextUtils.getApplicationContext().getPackageManager().hasSystemFeature(
-        PackageManager.FEATURE_AUDIO_LOW_LATENCY);
+    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUDIO_LOW_LATENCY);
   }
 
   // Returns true if low-latency audio input is supported.
@@ -250,8 +248,7 @@
   @TargetApi(23)
   private boolean isProAudioSupported() {
     return WebRtcAudioUtils.runningOnMarshmallowOrHigher()
-        && ContextUtils.getApplicationContext().getPackageManager().hasSystemFeature(
-               PackageManager.FEATURE_AUDIO_PRO);
+        && context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUDIO_PRO);
   }
 
   // Returns the native output sample rate for this device's output stream.
diff --git a/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioRecord.java b/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioRecord.java
index ba93ea1..762a903 100644
--- a/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioRecord.java
+++ b/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioRecord.java
@@ -19,7 +19,6 @@
 import java.lang.System;
 import java.nio.ByteBuffer;
 import java.util.concurrent.TimeUnit;
-import org.webrtc.ContextUtils;
 import org.webrtc.Logging;
 import org.webrtc.ThreadUtils;
 
@@ -48,6 +47,7 @@
   private static final long AUDIO_RECORD_THREAD_JOIN_TIMEOUT_MS = 2000;
 
   private final long nativeAudioRecord;
+  private final Context context;
 
   private WebRtcAudioEffects effects = null;
 
@@ -139,8 +139,9 @@
     }
   }
 
-  WebRtcAudioRecord(long nativeAudioRecord) {
+  WebRtcAudioRecord(Context context, long nativeAudioRecord) {
     Logging.d(TAG, "ctor" + WebRtcAudioUtils.getThreadInfo());
+    this.context = context;
     this.nativeAudioRecord = nativeAudioRecord;
     if (DEBUG) {
       WebRtcAudioUtils.logDeviceInfo(TAG);
@@ -168,8 +169,7 @@
 
   private int initRecording(int sampleRate, int channels) {
     Logging.d(TAG, "initRecording(sampleRate=" + sampleRate + ", channels=" + channels + ")");
-    if (!WebRtcAudioUtils.hasPermission(
-            ContextUtils.getApplicationContext(), android.Manifest.permission.RECORD_AUDIO)) {
+    if (!WebRtcAudioUtils.hasPermission(context, android.Manifest.permission.RECORD_AUDIO)) {
       reportWebRtcAudioRecordInitError("RECORD_AUDIO permission is missing");
       return -1;
     }
diff --git a/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioTrack.java b/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioTrack.java
index 796a082..65c5207 100644
--- a/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioTrack.java
+++ b/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioTrack.java
@@ -19,7 +19,6 @@
 import android.os.Process;
 import java.lang.Thread;
 import java.nio.ByteBuffer;
-import org.webrtc.ContextUtils;
 import org.webrtc.Logging;
 
 public class WebRtcAudioTrack {
@@ -37,6 +36,7 @@
   // Average number of callbacks per second.
   private static final int BUFFERS_PER_SECOND = 1000 / CALLBACK_BUFFER_SIZE_MS;
 
+  private final Context context;
   private final long nativeAudioTrack;
   private final AudioManager audioManager;
 
@@ -165,11 +165,11 @@
     }
   }
 
-  WebRtcAudioTrack(long nativeAudioTrack) {
+  WebRtcAudioTrack(Context context, long nativeAudioTrack) {
     Logging.d(TAG, "ctor" + WebRtcAudioUtils.getThreadInfo());
+    this.context = context;
     this.nativeAudioTrack = nativeAudioTrack;
-    audioManager =
-        (AudioManager) ContextUtils.getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
+    audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
     if (DEBUG) {
       WebRtcAudioUtils.logDeviceInfo(TAG);
     }
diff --git a/webrtc/modules/utility/include/jvm_android.h b/webrtc/modules/utility/include/jvm_android.h
index 1fa5f9e..51a0bd8 100644
--- a/webrtc/modules/utility/include/jvm_android.h
+++ b/webrtc/modules/utility/include/jvm_android.h
@@ -118,7 +118,8 @@
 //   JNIEnv* jni = ::base::android::AttachCurrentThread();
 //   JavaVM* jvm = NULL;
 //   jni->GetJavaVM(&jvm);
-//   webrtc::JVM::Initialize(jvm);
+//   jobject context = ::base::android::GetApplicationContext();
+//   webrtc::JVM::Initialize(jvm, context);
 //
 //   // Header (.h) file of example class called User.
 //   std::unique_ptr<JNIEnvironment> env;
@@ -144,12 +145,9 @@
 //   JVM::Uninitialize();
 class JVM {
  public:
-  // Stores global handles to the Java VM interface.
+  // Stores global handles to the Java VM interface and the application context.
   // Should be called once on a thread that is attached to the JVM.
-  static void Initialize(JavaVM* jvm);
-  // TODO(sakal): Remove once downstream dependencies have been updated.
-  // Deprecated old signature with Android context.
-  static void Initialize(JavaVM* jvm, jobject context) { Initialize(jvm); }
+  static void Initialize(JavaVM* jvm, jobject context);
   // Clears handles stored in Initialize(). Must be called on same thread as
   // Initialize().
   static void Uninitialize();
@@ -170,9 +168,10 @@
 
   // TODO(henrika): can we make these private?
   JavaVM* jvm() const { return jvm_; }
+  jobject context() const { return context_; }
 
  protected:
-  JVM(JavaVM* jvm);
+  JVM(JavaVM* jvm, jobject context);
   ~JVM();
 
  private:
@@ -180,6 +179,7 @@
 
   rtc::ThreadChecker thread_checker_;
   JavaVM* const jvm_;
+  jobject context_;
 };
 
 }  // namespace webrtc
diff --git a/webrtc/modules/utility/source/jvm_android.cc b/webrtc/modules/utility/source/jvm_android.cc
index 2228d3a..9d08688 100644
--- a/webrtc/modules/utility/source/jvm_android.cc
+++ b/webrtc/modules/utility/source/jvm_android.cc
@@ -217,10 +217,10 @@
 }
 
 // static
-void JVM::Initialize(JavaVM* jvm) {
+void JVM::Initialize(JavaVM* jvm, jobject context) {
   ALOGD("JVM::Initialize%s", GetThreadInfo().c_str());
   RTC_CHECK(!g_jvm);
-  g_jvm = new JVM(jvm);
+  g_jvm = new JVM(jvm, context);
 }
 
 // static
@@ -237,9 +237,11 @@
   return g_jvm;
 }
 
-JVM::JVM(JavaVM* jvm) : jvm_(jvm) {
+JVM::JVM(JavaVM* jvm, jobject context)
+    : jvm_(jvm) {
   ALOGD("JVM::JVM%s", GetThreadInfo().c_str());
   RTC_CHECK(jni()) << "AttachCurrentThread() must be called on this thread.";
+  context_ = NewGlobalRef(jni(), context);
   LoadClasses(jni());
 }
 
@@ -247,6 +249,7 @@
   ALOGD("JVM::~JVM%s", GetThreadInfo().c_str());
   RTC_DCHECK(thread_checker_.CalledOnValidThread());
   FreeClassReferences(jni());
+  DeleteGlobalRef(jni(), context_);
 }
 
 std::unique_ptr<JNIEnvironment> JVM::environment() {
diff --git a/webrtc/pc/test/androidtestinitializer.cc b/webrtc/pc/test/androidtestinitializer.cc
index f070104..3f2ebd4 100644
--- a/webrtc/pc/test/androidtestinitializer.cc
+++ b/webrtc/pc/test/androidtestinitializer.cc
@@ -19,6 +19,7 @@
 // Since we use Chromes build system for creating the gtest binary, this should
 // be fine.
 RTC_PUSH_IGNORING_WUNDEF()
+#include "base/android/context_utils.h"
 #include "base/android/jni_android.h"
 RTC_POP_IGNORING_WUNDEF()
 
@@ -40,10 +41,11 @@
   JNIEnv* jni = ::base::android::AttachCurrentThread();
   JavaVM* jvm = NULL;
   RTC_CHECK_EQ(0, jni->GetJavaVM(&jvm));
+  jobject context = ::base::android::GetApplicationContext().obj();
 
   RTC_CHECK(rtc::InitializeSSL()) << "Failed to InitializeSSL()";
 
-  webrtc::JVM::Initialize(jvm);
+  webrtc::JVM::Initialize(jvm, context);
 }
 
 }  // anonymous namespace
diff --git a/webrtc/sdk/android/api/org/webrtc/PeerConnectionFactory.java b/webrtc/sdk/android/api/org/webrtc/PeerConnectionFactory.java
index b7d85f0..28b3ca7 100644
--- a/webrtc/sdk/android/api/org/webrtc/PeerConnectionFactory.java
+++ b/webrtc/sdk/android/api/org/webrtc/PeerConnectionFactory.java
@@ -10,7 +10,6 @@
 
 package org.webrtc;
 
-import android.content.Context;
 import java.util.List;
 
 /**
@@ -31,7 +30,6 @@
 
   private static final String TAG = "PeerConnectionFactory";
   private final long nativeFactory;
-  private static Context applicationContext;
   private static Thread networkThread;
   private static Thread workerThread;
   private static Thread signalingThread;
@@ -54,19 +52,14 @@
 
   // Must be called at least once before creating a PeerConnectionFactory
   // (for example, at application startup time).
-  public static native void nativeInitializeAndroidGlobals(
-      Context context, boolean videoHwAcceleration);
-
-  public static void initializeAndroidGlobals(Context context, boolean videoHwAcceleration) {
-    ContextUtils.initialize(context);
-    nativeInitializeAndroidGlobals(context, videoHwAcceleration);
-  }
+  public static native void initializeAndroidGlobals(
+      android.content.Context context, boolean videoHwAcceleration);
 
   // Older signature of initializeAndroidGlobals. The extra parameters are now meaningless.
   @Deprecated
   public static boolean initializeAndroidGlobals(Object context, boolean initializeAudio,
       boolean initializeVideo, boolean videoHwAcceleration) {
-    initializeAndroidGlobals((Context) context, videoHwAcceleration);
+    initializeAndroidGlobals((android.content.Context) context, videoHwAcceleration);
     return true;
   }
 
diff --git a/webrtc/sdk/android/src/jni/peerconnection_jni.cc b/webrtc/sdk/android/src/jni/peerconnection_jni.cc
index 8c20337..708e65d 100644
--- a/webrtc/sdk/android/src/jni/peerconnection_jni.cc
+++ b/webrtc/sdk/android/src/jni/peerconnection_jni.cc
@@ -1139,7 +1139,7 @@
   return (jlong)new PCOJava(jni, j_observer);
 }
 
-JOW(void, PeerConnectionFactory_nativeInitializeAndroidGlobals)
+JOW(void, PeerConnectionFactory_initializeAndroidGlobals)
 (JNIEnv* jni,
  jclass,
  jobject context,
@@ -1149,7 +1149,7 @@
   if (!factory_static_initialized) {
     RTC_DCHECK(j_application_context == nullptr);
     j_application_context = NewGlobalRef(jni, context);
-    webrtc::JVM::Initialize(GetJVM());
+    webrtc::JVM::Initialize(GetJVM(), context);
     factory_static_initialized = true;
   }
 }
diff --git a/webrtc/test/BUILD.gn b/webrtc/test/BUILD.gn
index 728269b..aa6f322 100644
--- a/webrtc/test/BUILD.gn
+++ b/webrtc/test/BUILD.gn
@@ -532,17 +532,3 @@
     "//testing/gmock",
   ]
 }
-
-if (!build_with_chromium && is_android) {
-  android_library("native_test_java") {
-    testonly = true
-    java_files = [
-      "android/org/webrtc/native_test/RTCNativeUnitTest.java",
-      "android/org/webrtc/native_test/RTCNativeUnitTestActivity.java",
-    ]
-    deps = [
-      "//testing/android/native_test:native_test_java",
-      "//webrtc/base:base_java",
-    ]
-  }
-}
diff --git a/webrtc/test/android/AndroidManifest.xml b/webrtc/test/android/AndroidManifest.xml
deleted file mode 100644
index b5157a7..0000000
--- a/webrtc/test/android/AndroidManifest.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright 2017 The WebRTC project authors. All Rights Reserved.
-
-Use of this source code is governed by a BSD-style license
-that can be found in the LICENSE file in the root of the source
-tree. An additional intellectual property rights grant can be found
-in the file PATENTS.  All contributing project authors may
-be found in the AUTHORS file in the root of the source tree.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="org.webrtc.native_test"
-      android:versionCode="1"
-      android:versionName="1.0">
-
-    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" />
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
-    <uses-permission android:name="android.permission.BLUETOOTH"/>
-    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
-    <uses-permission android:name="android.permission.CAMERA" />
-    <uses-permission android:name="android.permission.INTERNET"/>
-    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
-    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
-    <uses-permission android:name="android.permission.WAKE_LOCK"/>
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-
-    <application android:label="NativeTests"
-            android:name="org.chromium.base.BaseChromiumApplication">
-        <uses-library android:name="android.test.runner"/>
-        <activity android:name=".RTCNativeUnitTestActivity"
-                android:label="NativeTest"
-                android:configChanges="orientation|keyboardHidden"
-                android:process=":test_process">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-
-    <instrumentation android:name="org.chromium.native_test.NativeTestInstrumentationTestRunner"
-            android:targetPackage="org.webrtc.native_test"
-            android:label="Instrumentation entry point for org.webrtc.native_test"/>
-
-</manifest>
diff --git a/webrtc/test/android/org/webrtc/native_test/RTCNativeUnitTest.java b/webrtc/test/android/org/webrtc/native_test/RTCNativeUnitTest.java
deleted file mode 100644
index dede7ed..0000000
--- a/webrtc/test/android/org/webrtc/native_test/RTCNativeUnitTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-package org.webrtc.native_test;
-
-import android.app.Activity;
-import org.chromium.native_test.NativeUnitTest;
-import org.webrtc.ContextUtils;
-
-/**
- * Native unit test that calls ContextUtils.initialize for WebRTC.
- */
-public class RTCNativeUnitTest extends NativeUnitTest {
-  @Override
-  public void preCreate(Activity activity) {
-    super.preCreate(activity);
-    ContextUtils.initialize(activity.getApplicationContext());
-  }
-}
diff --git a/webrtc/test/android/org/webrtc/native_test/RTCNativeUnitTestActivity.java b/webrtc/test/android/org/webrtc/native_test/RTCNativeUnitTestActivity.java
deleted file mode 100644
index 2a41368..0000000
--- a/webrtc/test/android/org/webrtc/native_test/RTCNativeUnitTestActivity.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-package org.webrtc.native_test;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * Activity that uses RTCNativeUnitTest to run the tests.
- */
-public class RTCNativeUnitTestActivity extends Activity {
-  private RTCNativeUnitTest mTest = new RTCNativeUnitTest();
-
-  @Override
-  public void onCreate(Bundle savedInstanceState) {
-    mTest.preCreate(this);
-    super.onCreate(savedInstanceState);
-    mTest.postCreate(this);
-  }
-
-  @Override
-  public void onStart() {
-    super.onStart();
-    mTest.postStart(this, false);
-  }
-}
diff --git a/webrtc/webrtc.gni b/webrtc/webrtc.gni
index d4acaf5..745a665 100644
--- a/webrtc/webrtc.gni
+++ b/webrtc/webrtc.gni
@@ -266,10 +266,6 @@
     if (defined(invoker.public_configs)) {
       public_configs += invoker.public_configs
     }
-    if (!build_with_chromium && is_android) {
-      android_manifest = "//webrtc/test/android/AndroidManifest.xml"
-      deps += [ "//webrtc/test:native_test_java" ]
-    }
   }
 }