Change some well-known methods to `ArtMethod*`.

Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Change-Id: I8a92108f8dc8b206f239c1f1a1e35b4472bf294a
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index 8882966..bc0ac6b 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -1141,6 +1141,8 @@
       WellKnownClasses::java_lang_Integer_valueOf,
       WellKnownClasses::java_lang_Long_valueOf,
       WellKnownClasses::java_lang_Short_valueOf,
+      // Ensure `DirectByteBuffer` class is initialized (avoid check at runtime).
+      WellKnownClasses::java_nio_DirectByteBuffer_init,
       // Ensure reflection annotation classes are initialized (avoid check at runtime).
       WellKnownClasses::libcore_reflect_AnnotationFactory_createAnnotation,
       WellKnownClasses::libcore_reflect_AnnotationMember_init,
@@ -1152,6 +1154,8 @@
     EnsureRootInitialized(this, self, method->GetDeclaringClass());
   }
   ArtField* static_fields_of_classes_to_initialize[] = {
+      // Ensure `VMRuntime` is initialized (avoid check at runtime).
+      WellKnownClasses::dalvik_system_VMRuntime_nonSdkApiUsageConsumer,
       // Initialize empty arrays needed by `StackOverflowError`.
       WellKnownClasses::java_util_Collections_EMPTY_LIST,
       WellKnownClasses::libcore_util_EmptyArray_STACK_TRACE_ELEMENT,
diff --git a/runtime/hidden_api.cc b/runtime/hidden_api.cc
index de567f9..ba317c8 100644
--- a/runtime/hidden_api.cc
+++ b/runtime/hidden_api.cc
@@ -366,30 +366,35 @@
   if (runtime->IsAotCompiler()) {
     return;
   }
-  JNIEnvExt* env = Thread::Current()->GetJniEnv();
-  const std::string& package_name = Runtime::Current()->GetProcessPackageName();
-  ScopedLocalRef<jstring> package_str(env, env->NewStringUTF(package_name.c_str()));
-  if (env->ExceptionCheck()) {
-    env->ExceptionClear();
-    LOG(ERROR) << "Unable to allocate string for package name which called hidden api";
-  }
+
+  const std::string& package_name = runtime->GetProcessPackageName();
   std::ostringstream signature_str;
   Dump(signature_str);
-  ScopedLocalRef<jstring> signature_jstr(env,
-      env->NewStringUTF(signature_str.str().c_str()));
-  if (env->ExceptionCheck()) {
-    env->ExceptionClear();
+
+  ScopedObjectAccess soa(Thread::Current());
+  StackHandleScope<2u> hs(soa.Self());
+  Handle<mirror::String> package_str = hs.NewHandle(
+      mirror::String::AllocFromModifiedUtf8(soa.Self(), package_name.c_str()));
+  if (soa.Self()->IsExceptionPending()) {
+    soa.Self()->ClearException();
+    LOG(ERROR) << "Unable to allocate string for package name which called hidden api";
+  }
+  Handle<mirror::String> signature_jstr = hs.NewHandle(
+      mirror::String::AllocFromModifiedUtf8(soa.Self(), signature_str.str().c_str()));
+  if (soa.Self()->IsExceptionPending()) {
+    soa.Self()->ClearException();
     LOG(ERROR) << "Unable to allocate string for hidden api method signature";
   }
-  env->CallStaticVoidMethod(WellKnownClasses::dalvik_system_VMRuntime,
-      WellKnownClasses::dalvik_system_VMRuntime_hiddenApiUsed,
-      sampled_value,
-      package_str.get(),
-      signature_jstr.get(),
-      static_cast<jint>(access_method),
-      access_denied);
-  if (env->ExceptionCheck()) {
-    env->ExceptionClear();
+  WellKnownClasses::dalvik_system_VMRuntime_hiddenApiUsed
+      ->InvokeStatic<'V', 'I', 'L', 'L', 'I', 'Z'>(
+          soa.Self(),
+          static_cast<jint>(sampled_value),
+          package_str.Get(),
+          signature_jstr.Get(),
+          static_cast<jint>(access_method),
+          static_cast<uint8_t>(access_denied ? 1u : 0u));
+  if (soa.Self()->IsExceptionPending()) {
+    soa.Self()->ClearException();
     LOG(ERROR) << "Unable to report hidden api usage";
   }
 #else
@@ -408,11 +413,12 @@
   Runtime* runtime = Runtime::Current();
   if (!runtime->IsAotCompiler()) {
     ScopedObjectAccess soa(Thread::Current());
+    StackHandleScope<2u> hs(soa.Self());
 
     ArtField* consumer_field = WellKnownClasses::dalvik_system_VMRuntime_nonSdkApiUsageConsumer;
-    ScopedLocalRef<jobject> consumer_object(soa.Env(),
-        soa.AddLocalReference<jobject>(
-            consumer_field->GetObject(consumer_field->GetDeclaringClass())));
+    DCHECK(consumer_field->GetDeclaringClass()->IsInitialized());
+    Handle<mirror::Object> consumer_object =
+        hs.NewHandle(consumer_field->GetObject(consumer_field->GetDeclaringClass()));
 
     // If the consumer is non-null, we call back to it to let it know that we
     // have encountered an API that's in one of our lists.
@@ -420,14 +426,16 @@
       std::ostringstream member_signature_str;
       Dump(member_signature_str);
 
-      ScopedLocalRef<jobject> signature_str(
-          soa.Env(),
-          soa.Env()->NewStringUTF(member_signature_str.str().c_str()));
+      Handle<mirror::String> signature_str = hs.NewHandle(
+          mirror::String::AllocFromModifiedUtf8(soa.Self(), member_signature_str.str().c_str()));
+      // FIXME: Handle OOME. For now, crash immediatelly (do not continue with a pending exception).
+      CHECK(signature_str != nullptr);
 
       // Call through to Consumer.accept(String memberSignature);
-      soa.Env()->CallVoidMethod(consumer_object.get(),
-                                WellKnownClasses::java_util_function_Consumer_accept,
-                                signature_str.get());
+      ArtMethod* accept_method = consumer_object->GetClass()->FindVirtualMethodForInterface(
+          WellKnownClasses::java_util_function_Consumer_accept, kRuntimePointerSize);
+      accept_method->InvokeInstance<'V', 'L'>(
+          soa.Self(), consumer_object.Get(), signature_str.Get());
     }
   }
 }
diff --git a/runtime/jni/jni_internal.cc b/runtime/jni/jni_internal.cc
index 33b6e04..4d0b7aa 100644
--- a/runtime/jni/jni_internal.cc
+++ b/runtime/jni/jni_internal.cc
@@ -2776,10 +2776,18 @@
     jlong address_arg = reinterpret_cast<jlong>(address);
     jint capacity_arg = static_cast<jint>(capacity);
 
-    jobject result = env->NewObject(WellKnownClasses::java_nio_DirectByteBuffer,
-                                    WellKnownClasses::java_nio_DirectByteBuffer_init,
-                                    address_arg, capacity_arg);
-    return static_cast<JNIEnvExt*>(env)->self_->IsExceptionPending() ? nullptr : result;
+    ScopedObjectAccess soa(env);
+    DCHECK(WellKnownClasses::java_nio_DirectByteBuffer_init->GetDeclaringClass()->IsInitialized());
+    Thread* self = soa.Self();
+    StackHandleScope<1u> hs(self);
+    Handle<mirror::Object> result = hs.NewHandle(
+        WellKnownClasses::java_nio_DirectByteBuffer_init->GetDeclaringClass()->AllocObject(self));
+    DCHECK_EQ(result == nullptr, self->IsExceptionPending());
+    if (result != nullptr) {
+      WellKnownClasses::java_nio_DirectByteBuffer_init->InvokeInstance<'V', 'J', 'I'>(
+          self, result.Get(), address_arg, capacity_arg);
+    }
+    return self->IsExceptionPending() ? nullptr : soa.AddLocalReference<jobject>(result.Get());
   }
 
   static void* GetDirectBufferAddress(JNIEnv* env, jobject java_buffer) {
@@ -2790,18 +2798,14 @@
 
     ScopedObjectAccess soa(env);
     ObjPtr<mirror::Object> buffer = soa.Decode<mirror::Object>(java_buffer);
-    ObjPtr<mirror::Class> java_nio_Buffer =
-       soa.Decode<mirror::Class>(WellKnownClasses::java_nio_Buffer);
-    DCHECK(java_nio_Buffer != nullptr);
 
     // Return null if |java_buffer| is not a java.nio.Buffer instance.
-    if (!buffer->InstanceOf(java_nio_Buffer)) {
+    if (!buffer->InstanceOf(WellKnownClasses::java_nio_Buffer_address->GetDeclaringClass())) {
       return nullptr;
     }
 
     // Buffer.address is non-null when the |java_buffer| is direct.
-    return reinterpret_cast<void*>(
-        WellKnownClasses::java_nio_Buffer_address->GetLong(buffer));
+    return reinterpret_cast<void*>(WellKnownClasses::java_nio_Buffer_address->GetLong(buffer));
   }
 
   static jlong GetDirectBufferCapacity(JNIEnv* env, jobject java_buffer) {
@@ -2810,13 +2814,9 @@
     }
 
     ScopedObjectAccess soa(env);
-    StackHandleScope<2u> hs(soa.Self());
+    StackHandleScope<1u> hs(soa.Self());
     Handle<mirror::Object> buffer = hs.NewHandle(soa.Decode<mirror::Object>(java_buffer));
-    Handle<mirror::Class> java_nio_Buffer =
-       hs.NewHandle(soa.Decode<mirror::Class>(WellKnownClasses::java_nio_Buffer));
-    DCHECK(java_nio_Buffer != nullptr);
-
-    if (!buffer->InstanceOf(java_nio_Buffer.Get())) {
+    if (!buffer->InstanceOf(WellKnownClasses::java_nio_Buffer_capacity->GetDeclaringClass())) {
       return -1;
     }
 
@@ -2827,9 +2827,10 @@
     //
     // NB GetDirectBufferAddress() does not need to call Buffer.isDirect() since it is only
     // able return a valid address if the Buffer address field is not-null.
-    jboolean direct = env->CallBooleanMethod(java_buffer,
-                                             WellKnownClasses::java_nio_Buffer_isDirect);
-    if (!direct) {
+    ArtMethod* is_direct_method = buffer->GetClass()->FindVirtualMethodForVirtual(
+        WellKnownClasses::java_nio_Buffer_isDirect, kRuntimePointerSize);
+    uint8_t direct = is_direct_method->InvokeInstance<'Z'>(soa.Self(), buffer.Get());
+    if (direct == 0u) {
       return -1;
     }
 
diff --git a/runtime/runtime_callbacks_test.cc b/runtime/runtime_callbacks_test.cc
index 40194cb..b345641 100644
--- a/runtime/runtime_callbacks_test.cc
+++ b/runtime/runtime_callbacks_test.cc
@@ -516,11 +516,11 @@
     {
       ScopedObjectAccess soa(self);
       cb_.SetInterestingObject(
-          soa.Decode<mirror::Class>(WellKnownClasses::java_util_Collections));
+          WellKnownClasses::java_util_Collections_EMPTY_LIST->GetDeclaringClass());
       Monitor::Wait(
           self,
           // Just a random class
-          soa.Decode<mirror::Class>(WellKnownClasses::java_util_Collections),
+          WellKnownClasses::java_util_Collections_EMPTY_LIST->GetDeclaringClass(),
           /*ms=*/0,
           /*ns=*/0,
           /*interruptShouldThrow=*/false,
diff --git a/runtime/well_known_classes.cc b/runtime/well_known_classes.cc
index 3008b59..4f2b2ac 100644
--- a/runtime/well_known_classes.cc
+++ b/runtime/well_known_classes.cc
@@ -56,7 +56,6 @@
 jclass WellKnownClasses::dalvik_system_EmulatedStackFrame;
 jclass WellKnownClasses::dalvik_system_InMemoryDexClassLoader;
 jclass WellKnownClasses::dalvik_system_PathClassLoader;
-jclass WellKnownClasses::dalvik_system_VMRuntime;
 jclass WellKnownClasses::java_lang_annotation_Annotation__array;
 jclass WellKnownClasses::java_lang_BootClassLoader;
 jclass WellKnownClasses::java_lang_ClassLoader;
@@ -80,15 +79,10 @@
 jclass WellKnownClasses::java_lang_ThreadGroup;
 jclass WellKnownClasses::java_lang_Throwable;
 jclass WellKnownClasses::java_lang_Void;
-jclass WellKnownClasses::java_nio_Buffer;
-jclass WellKnownClasses::java_nio_ByteBuffer;
-jclass WellKnownClasses::java_nio_DirectByteBuffer;
-jclass WellKnownClasses::java_util_Collections;
-jclass WellKnownClasses::java_util_function_Consumer;
 jclass WellKnownClasses::libcore_reflect_AnnotationMember__array;
 
 jmethodID WellKnownClasses::dalvik_system_BaseDexClassLoader_getLdLibraryPath;
-jmethodID WellKnownClasses::dalvik_system_VMRuntime_hiddenApiUsed;
+ArtMethod* WellKnownClasses::dalvik_system_VMRuntime_hiddenApiUsed;
 ArtMethod* WellKnownClasses::java_lang_Boolean_valueOf;
 ArtMethod* WellKnownClasses::java_lang_Byte_valueOf;
 ArtMethod* WellKnownClasses::java_lang_Character_valueOf;
@@ -121,9 +115,9 @@
 jmethodID WellKnownClasses::java_lang_Thread_run;
 jmethodID WellKnownClasses::java_lang_ThreadGroup_add;
 jmethodID WellKnownClasses::java_lang_ThreadGroup_removeThread;
-jmethodID WellKnownClasses::java_nio_Buffer_isDirect;
-jmethodID WellKnownClasses::java_nio_DirectByteBuffer_init;
-jmethodID WellKnownClasses::java_util_function_Consumer_accept;
+ArtMethod* WellKnownClasses::java_nio_Buffer_isDirect;
+ArtMethod* WellKnownClasses::java_nio_DirectByteBuffer_init;
+ArtMethod* WellKnownClasses::java_util_function_Consumer_accept;
 ArtMethod* WellKnownClasses::libcore_reflect_AnnotationFactory_createAnnotation;
 ArtMethod* WellKnownClasses::libcore_reflect_AnnotationMember_init;
 ArtMethod* WellKnownClasses::org_apache_harmony_dalvik_ddmc_DdmServer_broadcast;
@@ -245,9 +239,9 @@
                               const char* name,
                               const char* signature,
                               PointerSize pointer_size) REQUIRES_SHARED(Locks::mutator_lock_) {
-  // There are no well known interface methods.
-  DCHECK(!klass->IsInterface());
-  ArtMethod* method = klass->FindClassMethod(name, signature, pointer_size);
+  ArtMethod* method = klass->IsInterface()
+      ? klass->FindInterfaceMethod(name, signature, pointer_size)
+      : klass->FindClassMethod(name, signature, pointer_size);
   if (UNLIKELY(method == nullptr) || UNLIKELY(is_static != method->IsStatic())) {
     std::ostringstream os;
     klass->DumpClass(os, mirror::Class::kDumpClassFullDetail);
@@ -377,7 +371,6 @@
   dalvik_system_EmulatedStackFrame = CacheClass(env, "dalvik/system/EmulatedStackFrame");
   dalvik_system_InMemoryDexClassLoader = CacheClass(env, "dalvik/system/InMemoryDexClassLoader");
   dalvik_system_PathClassLoader = CacheClass(env, "dalvik/system/PathClassLoader");
-  dalvik_system_VMRuntime = CacheClass(env, "dalvik/system/VMRuntime");
 
   java_lang_annotation_Annotation__array = CacheClass(env, "[Ljava/lang/annotation/Annotation;");
   java_lang_BootClassLoader = CacheClass(env, "java/lang/BootClassLoader");
@@ -402,11 +395,6 @@
   java_lang_ThreadGroup = CacheClass(env, "java/lang/ThreadGroup");
   java_lang_Throwable = CacheClass(env, "java/lang/Throwable");
   java_lang_Void = CacheClass(env, "java/lang/Void");
-  java_nio_Buffer = CacheClass(env, "java/nio/Buffer");
-  java_nio_ByteBuffer = CacheClass(env, "java/nio/ByteBuffer");
-  java_nio_DirectByteBuffer = CacheClass(env, "java/nio/DirectByteBuffer");
-  java_util_Collections = CacheClass(env, "java/util/Collections");
-  java_util_function_Consumer = CacheClass(env, "java/util/function/Consumer");
   libcore_reflect_AnnotationMember__array = CacheClass(env, "[Llibcore/reflect/AnnotationMember;");
 
   InitFieldsAndMethodsOnly(env);
@@ -438,7 +426,6 @@
       CachePrimitiveBoxingMethod(class_linker, self, 'S', "Ljava/lang/Short;");
 
   dalvik_system_BaseDexClassLoader_getLdLibraryPath = CacheMethod(env, dalvik_system_BaseDexClassLoader, false, "getLdLibraryPath", "()Ljava/lang/String;");
-  dalvik_system_VMRuntime_hiddenApiUsed = CacheMethod(env, dalvik_system_VMRuntime, true, "hiddenApiUsed", "(ILjava/lang/String;Ljava/lang/String;IZ)V");
 
   java_lang_ClassNotFoundException_init = CacheMethod(env, java_lang_ClassNotFoundException, false, "<init>", "(Ljava/lang/String;Ljava/lang/Throwable;)V");
   java_lang_ClassLoader_loadClass = CacheMethod(env, java_lang_ClassLoader, false, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;");
@@ -462,13 +449,22 @@
   java_lang_Thread_run = CacheMethod(env, java_lang_Thread, false, "run", "()V");
   java_lang_ThreadGroup_add = CacheMethod(env, java_lang_ThreadGroup, false, "add", "(Ljava/lang/Thread;)V");
   java_lang_ThreadGroup_removeThread = CacheMethod(env, java_lang_ThreadGroup, false, "threadTerminated", "(Ljava/lang/Thread;)V");
-  java_nio_Buffer_isDirect = CacheMethod(env, java_nio_Buffer, false, "isDirect", "()Z");
-  java_nio_DirectByteBuffer_init = CacheMethod(env, java_nio_DirectByteBuffer, false, "<init>", "(JI)V");
-  java_util_function_Consumer_accept = CacheMethod(env, java_util_function_Consumer, false, "accept", "(Ljava/lang/Object;)V");
 
-  StackHandleScope<6u> hs(self);
+  StackHandleScope<12u> hs(self);
+  Handle<mirror::Class> d_s_vmr =
+      hs.NewHandle(FindSystemClass(class_linker, self, "Ldalvik/system/VMRuntime;"));
   Handle<mirror::Class> j_i_fd =
       hs.NewHandle(FindSystemClass(class_linker, self, "Ljava/io/FileDescriptor;"));
+  Handle<mirror::Class> j_n_b =
+      hs.NewHandle(FindSystemClass(class_linker, self, "Ljava/nio/Buffer;"));
+  Handle<mirror::Class> j_n_bb =
+      hs.NewHandle(FindSystemClass(class_linker, self, "Ljava/nio/ByteBuffer;"));
+  Handle<mirror::Class> j_n_dbb =
+      hs.NewHandle(FindSystemClass(class_linker, self, "Ljava/nio/DirectByteBuffer;"));
+  Handle<mirror::Class> j_u_c =
+      hs.NewHandle(FindSystemClass(class_linker, self, "Ljava/util/Collections;"));
+  Handle<mirror::Class> j_u_f_c =
+      hs.NewHandle(FindSystemClass(class_linker, self, "Ljava/util/function/Consumer;"));
   Handle<mirror::Class> l_r_af =
       hs.NewHandle(FindSystemClass(class_linker, self, "Llibcore/reflect/AnnotationFactory;"));
   Handle<mirror::Class> l_r_am =
@@ -483,6 +479,13 @@
   ScopedAssertNoThreadSuspension sants(__FUNCTION__);
   PointerSize pointer_size = class_linker->GetImagePointerSize();
 
+  dalvik_system_VMRuntime_hiddenApiUsed = CacheMethod(
+      d_s_vmr.Get(),
+      /*is_static=*/ true,
+      "hiddenApiUsed",
+      "(ILjava/lang/String;Ljava/lang/String;IZ)V",
+      pointer_size);
+
   ObjPtr<mirror::Class> j_l_Double = java_lang_Double_valueOf->GetDeclaringClass();
   java_lang_Double_doubleToRawLongBits =
       CacheMethod(j_l_Double, /*is_static=*/ true, "doubleToRawLongBits", "(D)J", pointer_size);
@@ -490,6 +493,14 @@
   java_lang_Float_floatToRawIntBits =
       CacheMethod(j_l_Float, /*is_static=*/ true, "floatToRawIntBits", "(F)I", pointer_size);
 
+  java_nio_Buffer_isDirect =
+      CacheMethod(j_n_b.Get(), /*is_static=*/ false, "isDirect", "()Z", pointer_size);
+  java_nio_DirectByteBuffer_init =
+      CacheMethod(j_n_dbb.Get(), /*is_static=*/ false, "<init>", "(JI)V", pointer_size);
+
+  java_util_function_Consumer_accept = CacheMethod(
+      j_u_f_c.Get(), /*is_static=*/ false, "accept", "(Ljava/lang/Object;)V", pointer_size);
+
   libcore_reflect_AnnotationFactory_createAnnotation = CacheMethod(
       l_r_af.Get(),
       /*is_static=*/ true,
@@ -505,12 +516,12 @@
 
   org_apache_harmony_dalvik_ddmc_DdmServer_broadcast =
       CacheMethod(o_a_h_d_d_ds.Get(), /*is_static=*/ true, "broadcast", "(I)V", pointer_size);
-  org_apache_harmony_dalvik_ddmc_DdmServer_dispatch =
-      CacheMethod(o_a_h_d_d_ds.Get(),
-                  /*is_static=*/ true,
-                  "dispatch",
-                  "(I[BII)Lorg/apache/harmony/dalvik/ddmc/Chunk;",
-                  pointer_size);
+  org_apache_harmony_dalvik_ddmc_DdmServer_dispatch = CacheMethod(
+      o_a_h_d_d_ds.Get(),
+      /*is_static=*/ true,
+      "dispatch",
+      "(I[BII)Lorg/apache/harmony/dalvik/ddmc/Chunk;",
+      pointer_size);
 
   ObjPtr<mirror::Class> d_s_bdcl = soa.Decode<mirror::Class>(dalvik_system_BaseDexClassLoader);
   dalvik_system_BaseDexClassLoader_pathList = CacheField(
@@ -531,9 +542,11 @@
   dalvik_system_DexPathList__Element_dexFile = CacheField(
       d_s_dpl_e, /*is_static=*/ false, "dexFile", "Ldalvik/system/DexFile;");
 
-  ObjPtr<mirror::Class> d_s_vmr = soa.Decode<mirror::Class>(dalvik_system_VMRuntime);
   dalvik_system_VMRuntime_nonSdkApiUsageConsumer = CacheField(
-      d_s_vmr, /*is_static=*/ true, "nonSdkApiUsageConsumer", "Ljava/util/function/Consumer;");
+      d_s_vmr.Get(),
+      /*is_static=*/ true,
+      "nonSdkApiUsageConsumer",
+      "Ljava/util/function/Consumer;");
 
   java_io_FileDescriptor_descriptor = CacheField(
       j_i_fd.Get(), /*is_static=*/ false, "descriptor", "I");
@@ -584,22 +597,20 @@
   java_lang_Throwable_suppressedExceptions = CacheField(
       j_l_Throwable, /*is_static=*/ false, "suppressedExceptions", "Ljava/util/List;");
 
-  ObjPtr<mirror::Class> j_n_b = soa.Decode<mirror::Class>(java_nio_Buffer);
-  java_nio_Buffer_address = CacheField(j_n_b, /*is_static=*/ false, "address", "J");
-  java_nio_Buffer_capacity = CacheField(j_n_b, /*is_static=*/ false, "capacity", "I");
+  java_nio_Buffer_address = CacheField(j_n_b.Get(), /*is_static=*/ false, "address", "J");
+  java_nio_Buffer_capacity = CacheField(j_n_b.Get(), /*is_static=*/ false, "capacity", "I");
   java_nio_Buffer_elementSizeShift =
-      CacheField(j_n_b, /*is_static=*/ false, "_elementSizeShift", "I");
-  java_nio_Buffer_limit = CacheField(j_n_b, /*is_static=*/ false, "limit", "I");
-  java_nio_Buffer_position = CacheField(j_n_b, /*is_static=*/ false, "position", "I");
+      CacheField(j_n_b.Get(), /*is_static=*/ false, "_elementSizeShift", "I");
+  java_nio_Buffer_limit = CacheField(j_n_b.Get(), /*is_static=*/ false, "limit", "I");
+  java_nio_Buffer_position = CacheField(j_n_b.Get(), /*is_static=*/ false, "position", "I");
 
-  ObjPtr<mirror::Class> j_n_bb = soa.Decode<mirror::Class>(java_nio_ByteBuffer);
-  java_nio_ByteBuffer_hb = CacheField(j_n_bb, /*is_static=*/ false, "hb", "[B");
-  java_nio_ByteBuffer_isReadOnly = CacheField(j_n_bb, /*is_static=*/ false, "isReadOnly", "Z");
-  java_nio_ByteBuffer_offset = CacheField(j_n_bb, /*is_static=*/ false, "offset", "I");
+  java_nio_ByteBuffer_hb = CacheField(j_n_bb.Get(), /*is_static=*/ false, "hb", "[B");
+  java_nio_ByteBuffer_isReadOnly =
+      CacheField(j_n_bb.Get(), /*is_static=*/ false, "isReadOnly", "Z");
+  java_nio_ByteBuffer_offset = CacheField(j_n_bb.Get(), /*is_static=*/ false, "offset", "I");
 
-  ObjPtr<mirror::Class> j_u_c = soa.Decode<mirror::Class>(java_util_Collections);
   java_util_Collections_EMPTY_LIST =
-      CacheField(j_u_c, /*is_static=*/ true, "EMPTY_LIST", "Ljava/util/List;");
+      CacheField(j_u_c.Get(), /*is_static=*/ true, "EMPTY_LIST", "Ljava/util/List;");
 
   libcore_util_EmptyArray_STACK_TRACE_ELEMENT = CacheField(
       l_u_ea.Get(), /*is_static=*/ true, "STACK_TRACE_ELEMENT", "[Ljava/lang/StackTraceElement;");
@@ -655,7 +666,6 @@
   dalvik_system_DexPathList__Element = nullptr;
   dalvik_system_EmulatedStackFrame = nullptr;
   dalvik_system_PathClassLoader = nullptr;
-  dalvik_system_VMRuntime = nullptr;
   java_lang_annotation_Annotation__array = nullptr;
   java_lang_BootClassLoader = nullptr;
   java_lang_ClassLoader = nullptr;
@@ -679,11 +689,6 @@
   java_lang_ThreadGroup = nullptr;
   java_lang_Throwable = nullptr;
   java_lang_Void = nullptr;
-  java_nio_Buffer = nullptr;
-  java_nio_ByteBuffer = nullptr;
-  java_nio_DirectByteBuffer = nullptr;
-  java_util_Collections = nullptr;
-  java_util_function_Consumer = nullptr;
   libcore_reflect_AnnotationMember__array = nullptr;
 
   dalvik_system_BaseDexClassLoader_getLdLibraryPath = nullptr;
diff --git a/runtime/well_known_classes.h b/runtime/well_known_classes.h
index ef8997c..14962a8 100644
--- a/runtime/well_known_classes.h
+++ b/runtime/well_known_classes.h
@@ -68,7 +68,6 @@
   static jclass dalvik_system_EmulatedStackFrame;
   static jclass dalvik_system_InMemoryDexClassLoader;
   static jclass dalvik_system_PathClassLoader;
-  static jclass dalvik_system_VMRuntime;
   static jclass java_lang_annotation_Annotation__array;
   static jclass java_lang_BootClassLoader;
   static jclass java_lang_ClassLoader;
@@ -92,15 +91,10 @@
   static jclass java_lang_ThreadGroup;
   static jclass java_lang_Throwable;
   static jclass java_lang_Void;
-  static jclass java_nio_Buffer;
-  static jclass java_nio_ByteBuffer;
-  static jclass java_nio_DirectByteBuffer;
-  static jclass java_util_Collections;
-  static jclass java_util_function_Consumer;
   static jclass libcore_reflect_AnnotationMember__array;
 
   static jmethodID dalvik_system_BaseDexClassLoader_getLdLibraryPath;
-  static jmethodID dalvik_system_VMRuntime_hiddenApiUsed;
+  static ArtMethod* dalvik_system_VMRuntime_hiddenApiUsed;
   static ArtMethod* java_lang_Boolean_valueOf;
   static ArtMethod* java_lang_Byte_valueOf;
   static ArtMethod* java_lang_Character_valueOf;
@@ -133,9 +127,9 @@
   static jmethodID java_lang_Thread_run;
   static jmethodID java_lang_ThreadGroup_add;
   static jmethodID java_lang_ThreadGroup_removeThread;
-  static jmethodID java_nio_Buffer_isDirect;
-  static jmethodID java_nio_DirectByteBuffer_init;
-  static jmethodID java_util_function_Consumer_accept;
+  static ArtMethod* java_nio_Buffer_isDirect;
+  static ArtMethod* java_nio_DirectByteBuffer_init;
+  static ArtMethod* java_util_function_Consumer_accept;
   static ArtMethod* libcore_reflect_AnnotationFactory_createAnnotation;
   static ArtMethod* libcore_reflect_AnnotationMember_init;
   static ArtMethod* org_apache_harmony_dalvik_ddmc_DdmServer_broadcast;