Home | History | Annotate | Download | only in runtime
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "jni_internal.h"
     18 
     19 #include <dlfcn.h>
     20 
     21 #include <cstdarg>
     22 #include <memory>
     23 #include <utility>
     24 #include <vector>
     25 
     26 #include "art_field-inl.h"
     27 #include "art_method-inl.h"
     28 #include "atomic.h"
     29 #include "base/allocator.h"
     30 #include "base/logging.h"
     31 #include "base/mutex.h"
     32 #include "base/stl_util.h"
     33 #include "class_linker-inl.h"
     34 #include "dex_file-inl.h"
     35 #include "fault_handler.h"
     36 #include "gc_root.h"
     37 #include "gc/accounting/card_table-inl.h"
     38 #include "indirect_reference_table-inl.h"
     39 #include "interpreter/interpreter.h"
     40 #include "jni_env_ext.h"
     41 #include "java_vm_ext.h"
     42 #include "mirror/class-inl.h"
     43 #include "mirror/class_loader.h"
     44 #include "mirror/field-inl.h"
     45 #include "mirror/method.h"
     46 #include "mirror/object-inl.h"
     47 #include "mirror/object_array-inl.h"
     48 #include "mirror/string-inl.h"
     49 #include "mirror/throwable.h"
     50 #include "parsed_options.h"
     51 #include "reflection.h"
     52 #include "runtime.h"
     53 #include "safe_map.h"
     54 #include "scoped_thread_state_change.h"
     55 #include "ScopedLocalRef.h"
     56 #include "thread.h"
     57 #include "utf.h"
     58 #include "well_known_classes.h"
     59 
     60 namespace art {
     61 
     62 // Consider turning this on when there is errors which could be related to JNI array copies such as
     63 // things not rendering correctly. E.g. b/16858794
     64 static constexpr bool kWarnJniAbort = false;
     65 
     66 // Section 12.3.2 of the JNI spec describes JNI class descriptors. They're
     67 // separated with slashes but aren't wrapped with "L;" like regular descriptors
     68 // (i.e. "a/b/C" rather than "La/b/C;"). Arrays of reference types are an
     69 // exception; there the "L;" must be present ("[La/b/C;"). Historically we've
     70 // supported names with dots too (such as "a.b.C").
     71 static std::string NormalizeJniClassDescriptor(const char* name) {
     72   std::string result;
     73   // Add the missing "L;" if necessary.
     74   if (name[0] == '[') {
     75     result = name;
     76   } else {
     77     result += 'L';
     78     result += name;
     79     result += ';';
     80   }
     81   // Rewrite '.' as '/' for backwards compatibility.
     82   if (result.find('.') != std::string::npos) {
     83     LOG(WARNING) << "Call to JNI FindClass with dots in name: "
     84                  << "\"" << name << "\"";
     85     std::replace(result.begin(), result.end(), '.', '/');
     86   }
     87   return result;
     88 }
     89 
     90 static void ThrowNoSuchMethodError(ScopedObjectAccess& soa, mirror::Class* c,
     91                                    const char* name, const char* sig, const char* kind)
     92     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
     93   std::string temp;
     94   soa.Self()->ThrowNewExceptionF("Ljava/lang/NoSuchMethodError;",
     95                                  "no %s method \"%s.%s%s\"",
     96                                  kind, c->GetDescriptor(&temp), name, sig);
     97 }
     98 
     99 static void ReportInvalidJNINativeMethod(const ScopedObjectAccess& soa, mirror::Class* c,
    100                                          const char* kind, jint idx, bool return_errors)
    101     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    102   LOG(return_errors ? ERROR : FATAL) << "Failed to register native method in "
    103       << PrettyDescriptor(c) << " in " << c->GetDexCache()->GetLocation()->ToModifiedUtf8()
    104       << ": " << kind << " is null at index " << idx;
    105   soa.Self()->ThrowNewExceptionF("Ljava/lang/NoSuchMethodError;",
    106                                  "%s is null at index %d", kind, idx);
    107 }
    108 
    109 static mirror::Class* EnsureInitialized(Thread* self, mirror::Class* klass)
    110     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    111   if (LIKELY(klass->IsInitialized())) {
    112     return klass;
    113   }
    114   StackHandleScope<1> hs(self);
    115   Handle<mirror::Class> h_klass(hs.NewHandle(klass));
    116   if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(self, h_klass, true, true)) {
    117     return nullptr;
    118   }
    119   return h_klass.Get();
    120 }
    121 
    122 static jmethodID FindMethodID(ScopedObjectAccess& soa, jclass jni_class,
    123                               const char* name, const char* sig, bool is_static)
    124     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    125   mirror::Class* c = EnsureInitialized(soa.Self(), soa.Decode<mirror::Class*>(jni_class));
    126   if (c == nullptr) {
    127     return nullptr;
    128   }
    129   ArtMethod* method = nullptr;
    130   auto pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
    131   if (is_static) {
    132     method = c->FindDirectMethod(name, sig, pointer_size);
    133   } else if (c->IsInterface()) {
    134     method = c->FindInterfaceMethod(name, sig, pointer_size);
    135   } else {
    136     method = c->FindVirtualMethod(name, sig, pointer_size);
    137     if (method == nullptr) {
    138       // No virtual method matching the signature.  Search declared
    139       // private methods and constructors.
    140       method = c->FindDeclaredDirectMethod(name, sig, pointer_size);
    141     }
    142   }
    143   if (method == nullptr || method->IsStatic() != is_static) {
    144     ThrowNoSuchMethodError(soa, c, name, sig, is_static ? "static" : "non-static");
    145     return nullptr;
    146   }
    147   return soa.EncodeMethod(method);
    148 }
    149 
    150 static mirror::ClassLoader* GetClassLoader(const ScopedObjectAccess& soa)
    151     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    152   ArtMethod* method = soa.Self()->GetCurrentMethod(nullptr);
    153   // If we are running Runtime.nativeLoad, use the overriding ClassLoader it set.
    154   if (method == soa.DecodeMethod(WellKnownClasses::java_lang_Runtime_nativeLoad)) {
    155     return soa.Decode<mirror::ClassLoader*>(soa.Self()->GetClassLoaderOverride());
    156   }
    157   // If we have a method, use its ClassLoader for context.
    158   if (method != nullptr) {
    159     return method->GetDeclaringClass()->GetClassLoader();
    160   }
    161   // We don't have a method, so try to use the system ClassLoader.
    162   mirror::ClassLoader* class_loader =
    163       soa.Decode<mirror::ClassLoader*>(Runtime::Current()->GetSystemClassLoader());
    164   if (class_loader != nullptr) {
    165     return class_loader;
    166   }
    167   // See if the override ClassLoader is set for gtests.
    168   class_loader = soa.Decode<mirror::ClassLoader*>(soa.Self()->GetClassLoaderOverride());
    169   if (class_loader != nullptr) {
    170     // If so, CommonCompilerTest should have marked the runtime as a compiler not compiling an
    171     // image.
    172     CHECK(Runtime::Current()->IsAotCompiler());
    173     CHECK(!Runtime::Current()->IsCompilingBootImage());
    174     return class_loader;
    175   }
    176   // Use the BOOTCLASSPATH.
    177   return nullptr;
    178 }
    179 
    180 static jfieldID FindFieldID(const ScopedObjectAccess& soa, jclass jni_class, const char* name,
    181                             const char* sig, bool is_static)
    182     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    183   StackHandleScope<2> hs(soa.Self());
    184   Handle<mirror::Class> c(
    185       hs.NewHandle(EnsureInitialized(soa.Self(), soa.Decode<mirror::Class*>(jni_class))));
    186   if (c.Get() == nullptr) {
    187     return nullptr;
    188   }
    189   ArtField* field = nullptr;
    190   mirror::Class* field_type;
    191   ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
    192   if (sig[1] != '\0') {
    193     Handle<mirror::ClassLoader> class_loader(hs.NewHandle(c->GetClassLoader()));
    194     field_type = class_linker->FindClass(soa.Self(), sig, class_loader);
    195   } else {
    196     field_type = class_linker->FindPrimitiveClass(*sig);
    197   }
    198   if (field_type == nullptr) {
    199     // Failed to find type from the signature of the field.
    200     DCHECK(soa.Self()->IsExceptionPending());
    201     StackHandleScope<1> hs2(soa.Self());
    202     Handle<mirror::Throwable> cause(hs2.NewHandle(soa.Self()->GetException()));
    203     soa.Self()->ClearException();
    204     std::string temp;
    205     soa.Self()->ThrowNewExceptionF("Ljava/lang/NoSuchFieldError;",
    206                                    "no type \"%s\" found and so no field \"%s\" "
    207                                    "could be found in class \"%s\" or its superclasses", sig, name,
    208                                    c->GetDescriptor(&temp));
    209     soa.Self()->GetException()->SetCause(cause.Get());
    210     return nullptr;
    211   }
    212   std::string temp;
    213   if (is_static) {
    214     field = mirror::Class::FindStaticField(soa.Self(), c, name,
    215                                            field_type->GetDescriptor(&temp));
    216   } else {
    217     field = c->FindInstanceField(name, field_type->GetDescriptor(&temp));
    218   }
    219   if (field == nullptr) {
    220     soa.Self()->ThrowNewExceptionF("Ljava/lang/NoSuchFieldError;",
    221                                    "no \"%s\" field \"%s\" in class \"%s\" or its superclasses",
    222                                    sig, name, c->GetDescriptor(&temp));
    223     return nullptr;
    224   }
    225   return soa.EncodeField(field);
    226 }
    227 
    228 static void ThrowAIOOBE(ScopedObjectAccess& soa, mirror::Array* array, jsize start,
    229                         jsize length, const char* identifier)
    230     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    231   std::string type(PrettyTypeOf(array));
    232   soa.Self()->ThrowNewExceptionF("Ljava/lang/ArrayIndexOutOfBoundsException;",
    233                                  "%s offset=%d length=%d %s.length=%d",
    234                                  type.c_str(), start, length, identifier, array->GetLength());
    235 }
    236 
    237 static void ThrowSIOOBE(ScopedObjectAccess& soa, jsize start, jsize length,
    238                         jsize array_length)
    239     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    240   soa.Self()->ThrowNewExceptionF("Ljava/lang/StringIndexOutOfBoundsException;",
    241                                  "offset=%d length=%d string.length()=%d", start, length,
    242                                  array_length);
    243 }
    244 
    245 int ThrowNewException(JNIEnv* env, jclass exception_class, const char* msg, jobject cause)
    246     LOCKS_EXCLUDED(Locks::mutator_lock_) {
    247   // Turn the const char* into a java.lang.String.
    248   ScopedLocalRef<jstring> s(env, env->NewStringUTF(msg));
    249   if (msg != nullptr && s.get() == nullptr) {
    250     return JNI_ERR;
    251   }
    252 
    253   // Choose an appropriate constructor and set up the arguments.
    254   jvalue args[2];
    255   const char* signature;
    256   if (msg == nullptr && cause == nullptr) {
    257     signature = "()V";
    258   } else if (msg != nullptr && cause == nullptr) {
    259     signature = "(Ljava/lang/String;)V";
    260     args[0].l = s.get();
    261   } else if (msg == nullptr && cause != nullptr) {
    262     signature = "(Ljava/lang/Throwable;)V";
    263     args[0].l = cause;
    264   } else {
    265     signature = "(Ljava/lang/String;Ljava/lang/Throwable;)V";
    266     args[0].l = s.get();
    267     args[1].l = cause;
    268   }
    269   jmethodID mid = env->GetMethodID(exception_class, "<init>", signature);
    270   if (mid == nullptr) {
    271     ScopedObjectAccess soa(env);
    272     LOG(ERROR) << "No <init>" << signature << " in "
    273         << PrettyClass(soa.Decode<mirror::Class*>(exception_class));
    274     return JNI_ERR;
    275   }
    276 
    277   ScopedLocalRef<jthrowable> exception(
    278       env, reinterpret_cast<jthrowable>(env->NewObjectA(exception_class, mid, args)));
    279   if (exception.get() == nullptr) {
    280     return JNI_ERR;
    281   }
    282   ScopedObjectAccess soa(env);
    283   soa.Self()->SetException(soa.Decode<mirror::Throwable*>(exception.get()));
    284   return JNI_OK;
    285 }
    286 
    287 static JavaVMExt* JavaVmExtFromEnv(JNIEnv* env) {
    288   return reinterpret_cast<JNIEnvExt*>(env)->vm;
    289 }
    290 
    291 #define CHECK_NON_NULL_ARGUMENT(value) \
    292     CHECK_NON_NULL_ARGUMENT_FN_NAME(__FUNCTION__, value, nullptr)
    293 
    294 #define CHECK_NON_NULL_ARGUMENT_RETURN_VOID(value) \
    295     CHECK_NON_NULL_ARGUMENT_FN_NAME(__FUNCTION__, value, )
    296 
    297 #define CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(value) \
    298     CHECK_NON_NULL_ARGUMENT_FN_NAME(__FUNCTION__, value, 0)
    299 
    300 #define CHECK_NON_NULL_ARGUMENT_RETURN(value, return_val) \
    301     CHECK_NON_NULL_ARGUMENT_FN_NAME(__FUNCTION__, value, return_val)
    302 
    303 #define CHECK_NON_NULL_ARGUMENT_FN_NAME(name, value, return_val) \
    304   if (UNLIKELY(value == nullptr)) { \
    305     JavaVmExtFromEnv(env)->JniAbortF(name, #value " == null"); \
    306     return return_val; \
    307   }
    308 
    309 #define CHECK_NON_NULL_MEMCPY_ARGUMENT(length, value) \
    310   if (UNLIKELY(length != 0 && value == nullptr)) { \
    311     JavaVmExtFromEnv(env)->JniAbortF(__FUNCTION__, #value " == null"); \
    312     return; \
    313   }
    314 
    315 template <bool kNative>
    316 static ArtMethod* FindMethod(mirror::Class* c, const StringPiece& name, const StringPiece& sig)
    317     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
    318   auto pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
    319   for (auto& method : c->GetDirectMethods(pointer_size)) {
    320     if (kNative == method.IsNative() && name == method.GetName() && method.GetSignature() == sig) {
    321       return &method;
    322     }
    323   }
    324   for (auto& method : c->GetVirtualMethods(pointer_size)) {
    325     if (kNative == method.IsNative() && name == method.GetName() && method.GetSignature() == sig) {
    326       return &method;
    327     }
    328   }
    329   return nullptr;
    330 }
    331 
    332 class JNI {
    333  public:
    334   static jint GetVersion(JNIEnv*) {
    335     return JNI_VERSION_1_6;
    336   }
    337 
    338   static jclass DefineClass(JNIEnv*, const char*, jobject, const jbyte*, jsize) {
    339     LOG(WARNING) << "JNI DefineClass is not supported";
    340     return nullptr;
    341   }
    342 
    343   static jclass FindClass(JNIEnv* env, const char* name) {
    344     CHECK_NON_NULL_ARGUMENT(name);
    345     Runtime* runtime = Runtime::Current();
    346     ClassLinker* class_linker = runtime->GetClassLinker();
    347     std::string descriptor(NormalizeJniClassDescriptor(name));
    348     ScopedObjectAccess soa(env);
    349     mirror::Class* c = nullptr;
    350     if (runtime->IsStarted()) {
    351       StackHandleScope<1> hs(soa.Self());
    352       Handle<mirror::ClassLoader> class_loader(hs.NewHandle(GetClassLoader(soa)));
    353       c = class_linker->FindClass(soa.Self(), descriptor.c_str(), class_loader);
    354     } else {
    355       c = class_linker->FindSystemClass(soa.Self(), descriptor.c_str());
    356     }
    357     return soa.AddLocalReference<jclass>(c);
    358   }
    359 
    360   static jmethodID FromReflectedMethod(JNIEnv* env, jobject jlr_method) {
    361     CHECK_NON_NULL_ARGUMENT(jlr_method);
    362     ScopedObjectAccess soa(env);
    363     return soa.EncodeMethod(ArtMethod::FromReflectedMethod(soa, jlr_method));
    364   }
    365 
    366   static jfieldID FromReflectedField(JNIEnv* env, jobject jlr_field) {
    367     CHECK_NON_NULL_ARGUMENT(jlr_field);
    368     ScopedObjectAccess soa(env);
    369     mirror::Object* obj_field = soa.Decode<mirror::Object*>(jlr_field);
    370     if (obj_field->GetClass() != mirror::Field::StaticClass()) {
    371       // Not even a java.lang.reflect.Field, return null. TODO, is this check necessary?
    372       return nullptr;
    373     }
    374     auto* field = static_cast<mirror::Field*>(obj_field);
    375     return soa.EncodeField(field->GetArtField());
    376   }
    377 
    378   static jobject ToReflectedMethod(JNIEnv* env, jclass, jmethodID mid, jboolean) {
    379     CHECK_NON_NULL_ARGUMENT(mid);
    380     ScopedObjectAccess soa(env);
    381     ArtMethod* m = soa.DecodeMethod(mid);
    382     mirror::AbstractMethod* method;
    383     if (m->IsConstructor()) {
    384       method = mirror::Constructor::CreateFromArtMethod(soa.Self(), m);
    385     } else {
    386       method = mirror::Method::CreateFromArtMethod(soa.Self(), m);
    387     }
    388     return soa.AddLocalReference<jobject>(method);
    389   }
    390 
    391   static jobject ToReflectedField(JNIEnv* env, jclass, jfieldID fid, jboolean) {
    392     CHECK_NON_NULL_ARGUMENT(fid);
    393     ScopedObjectAccess soa(env);
    394     ArtField* f = soa.DecodeField(fid);
    395     return soa.AddLocalReference<jobject>(mirror::Field::CreateFromArtField(soa.Self(), f, true));
    396   }
    397 
    398   static jclass GetObjectClass(JNIEnv* env, jobject java_object) {
    399     CHECK_NON_NULL_ARGUMENT(java_object);
    400     ScopedObjectAccess soa(env);
    401     mirror::Object* o = soa.Decode<mirror::Object*>(java_object);
    402     return soa.AddLocalReference<jclass>(o->GetClass());
    403   }
    404 
    405   static jclass GetSuperclass(JNIEnv* env, jclass java_class) {
    406     CHECK_NON_NULL_ARGUMENT(java_class);
    407     ScopedObjectAccess soa(env);
    408     mirror::Class* c = soa.Decode<mirror::Class*>(java_class);
    409     return soa.AddLocalReference<jclass>(c->GetSuperClass());
    410   }
    411 
    412   // Note: java_class1 should be safely castable to java_class2, and
    413   // not the other way around.
    414   static jboolean IsAssignableFrom(JNIEnv* env, jclass java_class1, jclass java_class2) {
    415     CHECK_NON_NULL_ARGUMENT_RETURN(java_class1, JNI_FALSE);
    416     CHECK_NON_NULL_ARGUMENT_RETURN(java_class2, JNI_FALSE);
    417     ScopedObjectAccess soa(env);
    418     mirror::Class* c1 = soa.Decode<mirror::Class*>(java_class1);
    419     mirror::Class* c2 = soa.Decode<mirror::Class*>(java_class2);
    420     return c2->IsAssignableFrom(c1) ? JNI_TRUE : JNI_FALSE;
    421   }
    422 
    423   static jboolean IsInstanceOf(JNIEnv* env, jobject jobj, jclass java_class) {
    424     CHECK_NON_NULL_ARGUMENT_RETURN(java_class, JNI_FALSE);
    425     if (jobj == nullptr) {
    426       // Note: JNI is different from regular Java instanceof in this respect
    427       return JNI_TRUE;
    428     } else {
    429       ScopedObjectAccess soa(env);
    430       mirror::Object* obj = soa.Decode<mirror::Object*>(jobj);
    431       mirror::Class* c = soa.Decode<mirror::Class*>(java_class);
    432       return obj->InstanceOf(c) ? JNI_TRUE : JNI_FALSE;
    433     }
    434   }
    435 
    436   static jint Throw(JNIEnv* env, jthrowable java_exception) {
    437     ScopedObjectAccess soa(env);
    438     mirror::Throwable* exception = soa.Decode<mirror::Throwable*>(java_exception);
    439     if (exception == nullptr) {
    440       return JNI_ERR;
    441     }
    442     soa.Self()->SetException(exception);
    443     return JNI_OK;
    444   }
    445 
    446   static jint ThrowNew(JNIEnv* env, jclass c, const char* msg) {
    447     CHECK_NON_NULL_ARGUMENT_RETURN(c, JNI_ERR);
    448     return ThrowNewException(env, c, msg, nullptr);
    449   }
    450 
    451   static jboolean ExceptionCheck(JNIEnv* env) {
    452     return static_cast<JNIEnvExt*>(env)->self->IsExceptionPending() ? JNI_TRUE : JNI_FALSE;
    453   }
    454 
    455   static void ExceptionClear(JNIEnv* env) {
    456     ScopedObjectAccess soa(env);
    457     soa.Self()->ClearException();
    458   }
    459 
    460   static void ExceptionDescribe(JNIEnv* env) {
    461     ScopedObjectAccess soa(env);
    462 
    463     // If we have no exception to describe, pass through.
    464     if (!soa.Self()->GetException()) {
    465       return;
    466     }
    467 
    468     StackHandleScope<1> hs(soa.Self());
    469     Handle<mirror::Throwable> old_exception(
    470         hs.NewHandle<mirror::Throwable>(soa.Self()->GetException()));
    471     soa.Self()->ClearException();
    472     ScopedLocalRef<jthrowable> exception(env,
    473                                          soa.AddLocalReference<jthrowable>(old_exception.Get()));
    474     ScopedLocalRef<jclass> exception_class(env, env->GetObjectClass(exception.get()));
    475     jmethodID mid = env->GetMethodID(exception_class.get(), "printStackTrace", "()V");
    476     if (mid == nullptr) {
    477       LOG(WARNING) << "JNI WARNING: no printStackTrace()V in "
    478                    << PrettyTypeOf(old_exception.Get());
    479     } else {
    480       env->CallVoidMethod(exception.get(), mid);
    481       if (soa.Self()->IsExceptionPending()) {
    482         LOG(WARNING) << "JNI WARNING: " << PrettyTypeOf(soa.Self()->GetException())
    483                      << " thrown while calling printStackTrace";
    484         soa.Self()->ClearException();
    485       }
    486     }
    487     soa.Self()->SetException(old_exception.Get());
    488   }
    489 
    490   static jthrowable ExceptionOccurred(JNIEnv* env) {
    491     ScopedObjectAccess soa(env);
    492     mirror::Object* exception = soa.Self()->GetException();
    493     return soa.AddLocalReference<jthrowable>(exception);
    494   }
    495 
    496   static void FatalError(JNIEnv*, const char* msg) {
    497     LOG(FATAL) << "JNI FatalError called: " << msg;
    498   }
    499 
    500   static jint PushLocalFrame(JNIEnv* env, jint capacity) {
    501     // TODO: SOA may not be necessary but I do it to please lock annotations.
    502     ScopedObjectAccess soa(env);
    503     if (EnsureLocalCapacityInternal(soa, capacity, "PushLocalFrame") != JNI_OK) {
    504       return JNI_ERR;
    505     }
    506     down_cast<JNIEnvExt*>(env)->PushFrame(capacity);
    507     return JNI_OK;
    508   }
    509 
    510   static jobject PopLocalFrame(JNIEnv* env, jobject java_survivor) {
    511     ScopedObjectAccess soa(env);
    512     mirror::Object* survivor = soa.Decode<mirror::Object*>(java_survivor);
    513     soa.Env()->PopFrame();
    514     return soa.AddLocalReference<jobject>(survivor);
    515   }
    516 
    517   static jint EnsureLocalCapacity(JNIEnv* env, jint desired_capacity) {
    518     // TODO: SOA may not be necessary but I do it to please lock annotations.
    519     ScopedObjectAccess soa(env);
    520     return EnsureLocalCapacityInternal(soa, desired_capacity, "EnsureLocalCapacity");
    521   }
    522 
    523   static jobject NewGlobalRef(JNIEnv* env, jobject obj) {
    524     ScopedObjectAccess soa(env);
    525     mirror::Object* decoded_obj = soa.Decode<mirror::Object*>(obj);
    526     return soa.Vm()->AddGlobalRef(soa.Self(), decoded_obj);
    527   }
    528 
    529   static void DeleteGlobalRef(JNIEnv* env, jobject obj) {
    530     JavaVMExt* vm = down_cast<JNIEnvExt*>(env)->vm;
    531     Thread* self = down_cast<JNIEnvExt*>(env)->self;
    532     vm->DeleteGlobalRef(self, obj);
    533   }
    534 
    535   static jweak NewWeakGlobalRef(JNIEnv* env, jobject obj) {
    536     ScopedObjectAccess soa(env);
    537     mirror::Object* decoded_obj = soa.Decode<mirror::Object*>(obj);
    538     return soa.Vm()->AddWeakGlobalRef(soa.Self(), decoded_obj);
    539   }
    540 
    541   static void DeleteWeakGlobalRef(JNIEnv* env, jweak obj) {
    542     JavaVMExt* vm = down_cast<JNIEnvExt*>(env)->vm;
    543     Thread* self = down_cast<JNIEnvExt*>(env)->self;
    544     vm->DeleteWeakGlobalRef(self, obj);
    545   }
    546 
    547   static jobject NewLocalRef(JNIEnv* env, jobject obj) {
    548     ScopedObjectAccess soa(env);
    549     mirror::Object* decoded_obj = soa.Decode<mirror::Object*>(obj);
    550     // Check for null after decoding the object to handle cleared weak globals.
    551     if (decoded_obj == nullptr) {
    552       return nullptr;
    553     }
    554     return soa.AddLocalReference<jobject>(decoded_obj);
    555   }
    556 
    557   static void DeleteLocalRef(JNIEnv* env, jobject obj) {
    558     if (obj == nullptr) {
    559       return;
    560     }
    561     // SOA is only necessary to have exclusion between GC root marking and removing.
    562     // We don't want to have the GC attempt to mark a null root if we just removed
    563     // it. b/22119403
    564     ScopedObjectAccess soa(env);
    565     auto* ext_env = down_cast<JNIEnvExt*>(env);
    566     if (!ext_env->locals.Remove(ext_env->local_ref_cookie, obj)) {
    567       // Attempting to delete a local reference that is not in the
    568       // topmost local reference frame is a no-op.  DeleteLocalRef returns
    569       // void and doesn't throw any exceptions, but we should probably
    570       // complain about it so the user will notice that things aren't
    571       // going quite the way they expect.
    572       LOG(WARNING) << "JNI WARNING: DeleteLocalRef(" << obj << ") "
    573                    << "failed to find entry";
    574     }
    575   }
    576 
    577   static jboolean IsSameObject(JNIEnv* env, jobject obj1, jobject obj2) {
    578     if (obj1 == obj2) {
    579       return JNI_TRUE;
    580     } else {
    581       ScopedObjectAccess soa(env);
    582       return (soa.Decode<mirror::Object*>(obj1) == soa.Decode<mirror::Object*>(obj2))
    583               ? JNI_TRUE : JNI_FALSE;
    584     }
    585   }
    586 
    587   static jobject AllocObject(JNIEnv* env, jclass java_class) {
    588     CHECK_NON_NULL_ARGUMENT(java_class);
    589     ScopedObjectAccess soa(env);
    590     mirror::Class* c = EnsureInitialized(soa.Self(), soa.Decode<mirror::Class*>(java_class));
    591     if (c == nullptr) {
    592       return nullptr;
    593     }
    594     if (c->IsStringClass()) {
    595       gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator();
    596       mirror::SetStringCountVisitor visitor(0);
    597       return soa.AddLocalReference<jobject>(mirror::String::Alloc<true>(soa.Self(), 0,
    598                                                                         allocator_type, visitor));
    599     }
    600     return soa.AddLocalReference<jobject>(c->AllocObject(soa.Self()));
    601   }
    602 
    603   static jobject NewObject(JNIEnv* env, jclass java_class, jmethodID mid, ...) {
    604     va_list args;
    605     va_start(args, mid);
    606     CHECK_NON_NULL_ARGUMENT(java_class);
    607     CHECK_NON_NULL_ARGUMENT(mid);
    608     jobject result = NewObjectV(env, java_class, mid, args);
    609     va_end(args);
    610     return result;
    611   }
    612 
    613   static jobject NewObjectV(JNIEnv* env, jclass java_class, jmethodID mid, va_list args) {
    614     CHECK_NON_NULL_ARGUMENT(java_class);
    615     CHECK_NON_NULL_ARGUMENT(mid);
    616     ScopedObjectAccess soa(env);
    617     mirror::Class* c = EnsureInitialized(soa.Self(), soa.Decode<mirror::Class*>(java_class));
    618     if (c == nullptr) {
    619       return nullptr;
    620     }
    621     if (c->IsStringClass()) {
    622       // Replace calls to String.<init> with equivalent StringFactory call.
    623       jmethodID sf_mid = WellKnownClasses::StringInitToStringFactoryMethodID(mid);
    624       return CallStaticObjectMethodV(env, WellKnownClasses::java_lang_StringFactory, sf_mid, args);
    625     }
    626     mirror::Object* result = c->AllocObject(soa.Self());
    627     if (result == nullptr) {
    628       return nullptr;
    629     }
    630     jobject local_result = soa.AddLocalReference<jobject>(result);
    631     CallNonvirtualVoidMethodV(env, local_result, java_class, mid, args);
    632     if (soa.Self()->IsExceptionPending()) {
    633       return nullptr;
    634     }
    635     return local_result;
    636   }
    637 
    638   static jobject NewObjectA(JNIEnv* env, jclass java_class, jmethodID mid, jvalue* args) {
    639     CHECK_NON_NULL_ARGUMENT(java_class);
    640     CHECK_NON_NULL_ARGUMENT(mid);
    641     ScopedObjectAccess soa(env);
    642     mirror::Class* c = EnsureInitialized(soa.Self(), soa.Decode<mirror::Class*>(java_class));
    643     if (c == nullptr) {
    644       return nullptr;
    645     }
    646     if (c->IsStringClass()) {
    647       // Replace calls to String.<init> with equivalent StringFactory call.
    648       jmethodID sf_mid = WellKnownClasses::StringInitToStringFactoryMethodID(mid);
    649       return CallStaticObjectMethodA(env, WellKnownClasses::java_lang_StringFactory, sf_mid, args);
    650     }
    651     mirror::Object* result = c->AllocObject(soa.Self());
    652     if (result == nullptr) {
    653       return nullptr;
    654     }
    655     jobject local_result = soa.AddLocalReference<jobjectArray>(result);
    656     CallNonvirtualVoidMethodA(env, local_result, java_class, mid, args);
    657     if (soa.Self()->IsExceptionPending()) {
    658       return nullptr;
    659     }
    660     return local_result;
    661   }
    662 
    663   static jmethodID GetMethodID(JNIEnv* env, jclass java_class, const char* name, const char* sig) {
    664     CHECK_NON_NULL_ARGUMENT(java_class);
    665     CHECK_NON_NULL_ARGUMENT(name);
    666     CHECK_NON_NULL_ARGUMENT(sig);
    667     ScopedObjectAccess soa(env);
    668     return FindMethodID(soa, java_class, name, sig, false);
    669   }
    670 
    671   static jmethodID GetStaticMethodID(JNIEnv* env, jclass java_class, const char* name,
    672                                      const char* sig) {
    673     CHECK_NON_NULL_ARGUMENT(java_class);
    674     CHECK_NON_NULL_ARGUMENT(name);
    675     CHECK_NON_NULL_ARGUMENT(sig);
    676     ScopedObjectAccess soa(env);
    677     return FindMethodID(soa, java_class, name, sig, true);
    678   }
    679 
    680   static jobject CallObjectMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
    681     va_list ap;
    682     va_start(ap, mid);
    683     CHECK_NON_NULL_ARGUMENT(obj);
    684     CHECK_NON_NULL_ARGUMENT(mid);
    685     ScopedObjectAccess soa(env);
    686     JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap));
    687     va_end(ap);
    688     return soa.AddLocalReference<jobject>(result.GetL());
    689   }
    690 
    691   static jobject CallObjectMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
    692     CHECK_NON_NULL_ARGUMENT(obj);
    693     CHECK_NON_NULL_ARGUMENT(mid);
    694     ScopedObjectAccess soa(env);
    695     JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args));
    696     return soa.AddLocalReference<jobject>(result.GetL());
    697   }
    698 
    699   static jobject CallObjectMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
    700     CHECK_NON_NULL_ARGUMENT(obj);
    701     CHECK_NON_NULL_ARGUMENT(mid);
    702     ScopedObjectAccess soa(env);
    703     JValue result(InvokeVirtualOrInterfaceWithJValues(soa, obj, mid, args));
    704     return soa.AddLocalReference<jobject>(result.GetL());
    705   }
    706 
    707   static jboolean CallBooleanMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
    708     va_list ap;
    709     va_start(ap, mid);
    710     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    711     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    712     ScopedObjectAccess soa(env);
    713     JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap));
    714     va_end(ap);
    715     return result.GetZ();
    716   }
    717 
    718   static jboolean CallBooleanMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
    719     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    720     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    721     ScopedObjectAccess soa(env);
    722     return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetZ();
    723   }
    724 
    725   static jboolean CallBooleanMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
    726     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    727     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    728     ScopedObjectAccess soa(env);
    729     return InvokeVirtualOrInterfaceWithJValues(soa, obj, mid, args).GetZ();
    730   }
    731 
    732   static jbyte CallByteMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
    733     va_list ap;
    734     va_start(ap, mid);
    735     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    736     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    737     ScopedObjectAccess soa(env);
    738     JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap));
    739     va_end(ap);
    740     return result.GetB();
    741   }
    742 
    743   static jbyte CallByteMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
    744     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    745     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    746     ScopedObjectAccess soa(env);
    747     return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetB();
    748   }
    749 
    750   static jbyte CallByteMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
    751     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    752     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    753     ScopedObjectAccess soa(env);
    754     return InvokeVirtualOrInterfaceWithJValues(soa, obj, mid, args).GetB();
    755   }
    756 
    757   static jchar CallCharMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
    758     va_list ap;
    759     va_start(ap, mid);
    760     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    761     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    762     ScopedObjectAccess soa(env);
    763     JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap));
    764     va_end(ap);
    765     return result.GetC();
    766   }
    767 
    768   static jchar CallCharMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
    769     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    770     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    771     ScopedObjectAccess soa(env);
    772     return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetC();
    773   }
    774 
    775   static jchar CallCharMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
    776     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    777     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    778     ScopedObjectAccess soa(env);
    779     return InvokeVirtualOrInterfaceWithJValues(soa, obj, mid, args).GetC();
    780   }
    781 
    782   static jdouble CallDoubleMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
    783     va_list ap;
    784     va_start(ap, mid);
    785     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    786     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    787     ScopedObjectAccess soa(env);
    788     JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap));
    789     va_end(ap);
    790     return result.GetD();
    791   }
    792 
    793   static jdouble CallDoubleMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
    794     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    795     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    796     ScopedObjectAccess soa(env);
    797     return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetD();
    798   }
    799 
    800   static jdouble CallDoubleMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
    801     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    802     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    803     ScopedObjectAccess soa(env);
    804     return InvokeVirtualOrInterfaceWithJValues(soa, obj, mid, args).GetD();
    805   }
    806 
    807   static jfloat CallFloatMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
    808     va_list ap;
    809     va_start(ap, mid);
    810     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    811     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    812     ScopedObjectAccess soa(env);
    813     JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap));
    814     va_end(ap);
    815     return result.GetF();
    816   }
    817 
    818   static jfloat CallFloatMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
    819     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    820     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    821     ScopedObjectAccess soa(env);
    822     return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetF();
    823   }
    824 
    825   static jfloat CallFloatMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
    826     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    827     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    828     ScopedObjectAccess soa(env);
    829     return InvokeVirtualOrInterfaceWithJValues(soa, obj, mid, args).GetF();
    830   }
    831 
    832   static jint CallIntMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
    833     va_list ap;
    834     va_start(ap, mid);
    835     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    836     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    837     ScopedObjectAccess soa(env);
    838     JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap));
    839     va_end(ap);
    840     return result.GetI();
    841   }
    842 
    843   static jint CallIntMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
    844     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    845     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    846     ScopedObjectAccess soa(env);
    847     return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetI();
    848   }
    849 
    850   static jint CallIntMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
    851     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    852     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    853     ScopedObjectAccess soa(env);
    854     return InvokeVirtualOrInterfaceWithJValues(soa, obj, mid, args).GetI();
    855   }
    856 
    857   static jlong CallLongMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
    858     va_list ap;
    859     va_start(ap, mid);
    860     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    861     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    862     ScopedObjectAccess soa(env);
    863     JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap));
    864     va_end(ap);
    865     return result.GetJ();
    866   }
    867 
    868   static jlong CallLongMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
    869     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    870     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    871     ScopedObjectAccess soa(env);
    872     return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetJ();
    873   }
    874 
    875   static jlong CallLongMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
    876     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    877     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    878     ScopedObjectAccess soa(env);
    879     return InvokeVirtualOrInterfaceWithJValues(soa, obj, mid, args).GetJ();
    880   }
    881 
    882   static jshort CallShortMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
    883     va_list ap;
    884     va_start(ap, mid);
    885     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    886     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    887     ScopedObjectAccess soa(env);
    888     JValue result(InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap));
    889     va_end(ap);
    890     return result.GetS();
    891   }
    892 
    893   static jshort CallShortMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
    894     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    895     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    896     ScopedObjectAccess soa(env);
    897     return InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args).GetS();
    898   }
    899 
    900   static jshort CallShortMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
    901     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    902     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    903     ScopedObjectAccess soa(env);
    904     return InvokeVirtualOrInterfaceWithJValues(soa, obj, mid, args).GetS();
    905   }
    906 
    907   static void CallVoidMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
    908     va_list ap;
    909     va_start(ap, mid);
    910     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(obj);
    911     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(mid);
    912     ScopedObjectAccess soa(env);
    913     InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, ap);
    914     va_end(ap);
    915   }
    916 
    917   static void CallVoidMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
    918     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(obj);
    919     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(mid);
    920     ScopedObjectAccess soa(env);
    921     InvokeVirtualOrInterfaceWithVarArgs(soa, obj, mid, args);
    922   }
    923 
    924   static void CallVoidMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
    925     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(obj);
    926     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(mid);
    927     ScopedObjectAccess soa(env);
    928     InvokeVirtualOrInterfaceWithJValues(soa, obj, mid, args);
    929   }
    930 
    931   static jobject CallNonvirtualObjectMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
    932     va_list ap;
    933     va_start(ap, mid);
    934     CHECK_NON_NULL_ARGUMENT(obj);
    935     CHECK_NON_NULL_ARGUMENT(mid);
    936     ScopedObjectAccess soa(env);
    937     JValue result(InvokeWithVarArgs(soa, obj, mid, ap));
    938     jobject local_result = soa.AddLocalReference<jobject>(result.GetL());
    939     va_end(ap);
    940     return local_result;
    941   }
    942 
    943   static jobject CallNonvirtualObjectMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid,
    944                                              va_list args) {
    945     CHECK_NON_NULL_ARGUMENT(obj);
    946     CHECK_NON_NULL_ARGUMENT(mid);
    947     ScopedObjectAccess soa(env);
    948     JValue result(InvokeWithVarArgs(soa, obj, mid, args));
    949     return soa.AddLocalReference<jobject>(result.GetL());
    950   }
    951 
    952   static jobject CallNonvirtualObjectMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid,
    953                                              jvalue* args) {
    954     CHECK_NON_NULL_ARGUMENT(obj);
    955     CHECK_NON_NULL_ARGUMENT(mid);
    956     ScopedObjectAccess soa(env);
    957     JValue result(InvokeWithJValues(soa, obj, mid, args));
    958     return soa.AddLocalReference<jobject>(result.GetL());
    959   }
    960 
    961   static jboolean CallNonvirtualBooleanMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid,
    962                                               ...) {
    963     va_list ap;
    964     va_start(ap, mid);
    965     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    966     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    967     ScopedObjectAccess soa(env);
    968     JValue result(InvokeWithVarArgs(soa, obj, mid, ap));
    969     va_end(ap);
    970     return result.GetZ();
    971   }
    972 
    973   static jboolean CallNonvirtualBooleanMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid,
    974                                                va_list args) {
    975     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    976     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    977     ScopedObjectAccess soa(env);
    978     return InvokeWithVarArgs(soa, obj, mid, args).GetZ();
    979   }
    980 
    981   static jboolean CallNonvirtualBooleanMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid,
    982                                                jvalue* args) {
    983     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    984     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    985     ScopedObjectAccess soa(env);
    986     return InvokeWithJValues(soa, obj, mid, args).GetZ();
    987   }
    988 
    989   static jbyte CallNonvirtualByteMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
    990     va_list ap;
    991     va_start(ap, mid);
    992     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
    993     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
    994     ScopedObjectAccess soa(env);
    995     JValue result(InvokeWithVarArgs(soa, obj, mid, ap));
    996     va_end(ap);
    997     return result.GetB();
    998   }
    999 
   1000   static jbyte CallNonvirtualByteMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1001                                          va_list args) {
   1002     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1003     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1004     ScopedObjectAccess soa(env);
   1005     return InvokeWithVarArgs(soa, obj, mid, args).GetB();
   1006   }
   1007 
   1008   static jbyte CallNonvirtualByteMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1009                                          jvalue* args) {
   1010     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1011     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1012     ScopedObjectAccess soa(env);
   1013     return InvokeWithJValues(soa, obj, mid, args).GetB();
   1014   }
   1015 
   1016   static jchar CallNonvirtualCharMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
   1017     va_list ap;
   1018     va_start(ap, mid);
   1019     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1020     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1021     ScopedObjectAccess soa(env);
   1022     JValue result(InvokeWithVarArgs(soa, obj, mid, ap));
   1023     va_end(ap);
   1024     return result.GetC();
   1025   }
   1026 
   1027   static jchar CallNonvirtualCharMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1028                                          va_list args) {
   1029     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1030     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1031     ScopedObjectAccess soa(env);
   1032     return InvokeWithVarArgs(soa, obj, mid, args).GetC();
   1033   }
   1034 
   1035   static jchar CallNonvirtualCharMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1036                                          jvalue* args) {
   1037     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1038     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1039     ScopedObjectAccess soa(env);
   1040     return InvokeWithJValues(soa, obj, mid, args).GetC();
   1041   }
   1042 
   1043   static jshort CallNonvirtualShortMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
   1044     va_list ap;
   1045     va_start(ap, mid);
   1046     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1047     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1048     ScopedObjectAccess soa(env);
   1049     JValue result(InvokeWithVarArgs(soa, obj, mid, ap));
   1050     va_end(ap);
   1051     return result.GetS();
   1052   }
   1053 
   1054   static jshort CallNonvirtualShortMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1055                                            va_list args) {
   1056     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1057     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1058     ScopedObjectAccess soa(env);
   1059     return InvokeWithVarArgs(soa, obj, mid, args).GetS();
   1060   }
   1061 
   1062   static jshort CallNonvirtualShortMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1063                                            jvalue* args) {
   1064     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1065     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1066     ScopedObjectAccess soa(env);
   1067     return InvokeWithJValues(soa, obj, mid, args).GetS();
   1068   }
   1069 
   1070   static jint CallNonvirtualIntMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
   1071     va_list ap;
   1072     va_start(ap, mid);
   1073     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1074     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1075     ScopedObjectAccess soa(env);
   1076     JValue result(InvokeWithVarArgs(soa, obj, mid, ap));
   1077     va_end(ap);
   1078     return result.GetI();
   1079   }
   1080 
   1081   static jint CallNonvirtualIntMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1082                                        va_list args) {
   1083     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1084     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1085     ScopedObjectAccess soa(env);
   1086     return InvokeWithVarArgs(soa, obj, mid, args).GetI();
   1087   }
   1088 
   1089   static jint CallNonvirtualIntMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1090                                        jvalue* args) {
   1091     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1092     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1093     ScopedObjectAccess soa(env);
   1094     return InvokeWithJValues(soa, obj, mid, args).GetI();
   1095   }
   1096 
   1097   static jlong CallNonvirtualLongMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
   1098     va_list ap;
   1099     va_start(ap, mid);
   1100     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1101     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1102     ScopedObjectAccess soa(env);
   1103     JValue result(InvokeWithVarArgs(soa, obj, mid, ap));
   1104     va_end(ap);
   1105     return result.GetJ();
   1106   }
   1107 
   1108   static jlong CallNonvirtualLongMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1109                                          va_list args) {
   1110     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1111     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1112     ScopedObjectAccess soa(env);
   1113     return InvokeWithVarArgs(soa, obj, mid, args).GetJ();
   1114   }
   1115 
   1116   static jlong CallNonvirtualLongMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1117                                          jvalue* args) {
   1118     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1119     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1120     ScopedObjectAccess soa(env);
   1121     return InvokeWithJValues(soa, obj, mid, args).GetJ();
   1122   }
   1123 
   1124   static jfloat CallNonvirtualFloatMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
   1125     va_list ap;
   1126     va_start(ap, mid);
   1127     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1128     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1129     ScopedObjectAccess soa(env);
   1130     JValue result(InvokeWithVarArgs(soa, obj, mid, ap));
   1131     va_end(ap);
   1132     return result.GetF();
   1133   }
   1134 
   1135   static jfloat CallNonvirtualFloatMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1136                                            va_list args) {
   1137     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1138     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1139     ScopedObjectAccess soa(env);
   1140     return InvokeWithVarArgs(soa, obj, mid, args).GetF();
   1141   }
   1142 
   1143   static jfloat CallNonvirtualFloatMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1144                                            jvalue* args) {
   1145     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1146     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1147     ScopedObjectAccess soa(env);
   1148     return InvokeWithJValues(soa, obj, mid, args).GetF();
   1149   }
   1150 
   1151   static jdouble CallNonvirtualDoubleMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
   1152     va_list ap;
   1153     va_start(ap, mid);
   1154     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1155     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1156     ScopedObjectAccess soa(env);
   1157     JValue result(InvokeWithVarArgs(soa, obj, mid, ap));
   1158     va_end(ap);
   1159     return result.GetD();
   1160   }
   1161 
   1162   static jdouble CallNonvirtualDoubleMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1163                                              va_list args) {
   1164     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1165     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1166     ScopedObjectAccess soa(env);
   1167     return InvokeWithVarArgs(soa, obj, mid, args).GetD();
   1168   }
   1169 
   1170   static jdouble CallNonvirtualDoubleMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1171                                              jvalue* args) {
   1172     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(obj);
   1173     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1174     ScopedObjectAccess soa(env);
   1175     return InvokeWithJValues(soa, obj, mid, args).GetD();
   1176   }
   1177 
   1178   static void CallNonvirtualVoidMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
   1179     va_list ap;
   1180     va_start(ap, mid);
   1181     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(obj);
   1182     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(mid);
   1183     ScopedObjectAccess soa(env);
   1184     InvokeWithVarArgs(soa, obj, mid, ap);
   1185     va_end(ap);
   1186   }
   1187 
   1188   static void CallNonvirtualVoidMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1189                                         va_list args) {
   1190     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(obj);
   1191     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(mid);
   1192     ScopedObjectAccess soa(env);
   1193     InvokeWithVarArgs(soa, obj, mid, args);
   1194   }
   1195 
   1196   static void CallNonvirtualVoidMethodA(JNIEnv* env, jobject obj, jclass, jmethodID mid,
   1197                                         jvalue* args) {
   1198     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(obj);
   1199     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(mid);
   1200     ScopedObjectAccess soa(env);
   1201     InvokeWithJValues(soa, obj, mid, args);
   1202   }
   1203 
   1204   static jfieldID GetFieldID(JNIEnv* env, jclass java_class, const char* name, const char* sig) {
   1205     CHECK_NON_NULL_ARGUMENT(java_class);
   1206     CHECK_NON_NULL_ARGUMENT(name);
   1207     CHECK_NON_NULL_ARGUMENT(sig);
   1208     ScopedObjectAccess soa(env);
   1209     return FindFieldID(soa, java_class, name, sig, false);
   1210   }
   1211 
   1212   static jfieldID GetStaticFieldID(JNIEnv* env, jclass java_class, const char* name,
   1213                                    const char* sig) {
   1214     CHECK_NON_NULL_ARGUMENT(java_class);
   1215     CHECK_NON_NULL_ARGUMENT(name);
   1216     CHECK_NON_NULL_ARGUMENT(sig);
   1217     ScopedObjectAccess soa(env);
   1218     return FindFieldID(soa, java_class, name, sig, true);
   1219   }
   1220 
   1221   static jobject GetObjectField(JNIEnv* env, jobject obj, jfieldID fid) {
   1222     CHECK_NON_NULL_ARGUMENT(obj);
   1223     CHECK_NON_NULL_ARGUMENT(fid);
   1224     ScopedObjectAccess soa(env);
   1225     mirror::Object* o = soa.Decode<mirror::Object*>(obj);
   1226     ArtField* f = soa.DecodeField(fid);
   1227     return soa.AddLocalReference<jobject>(f->GetObject(o));
   1228   }
   1229 
   1230   static jobject GetStaticObjectField(JNIEnv* env, jclass, jfieldID fid) {
   1231     CHECK_NON_NULL_ARGUMENT(fid);
   1232     ScopedObjectAccess soa(env);
   1233     ArtField* f = soa.DecodeField(fid);
   1234     return soa.AddLocalReference<jobject>(f->GetObject(f->GetDeclaringClass()));
   1235   }
   1236 
   1237   static void SetObjectField(JNIEnv* env, jobject java_object, jfieldID fid, jobject java_value) {
   1238     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(java_object);
   1239     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(fid);
   1240     ScopedObjectAccess soa(env);
   1241     mirror::Object* o = soa.Decode<mirror::Object*>(java_object);
   1242     mirror::Object* v = soa.Decode<mirror::Object*>(java_value);
   1243     ArtField* f = soa.DecodeField(fid);
   1244     f->SetObject<false>(o, v);
   1245   }
   1246 
   1247   static void SetStaticObjectField(JNIEnv* env, jclass, jfieldID fid, jobject java_value) {
   1248     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(fid);
   1249     ScopedObjectAccess soa(env);
   1250     mirror::Object* v = soa.Decode<mirror::Object*>(java_value);
   1251     ArtField* f = soa.DecodeField(fid);
   1252     f->SetObject<false>(f->GetDeclaringClass(), v);
   1253   }
   1254 
   1255 #define GET_PRIMITIVE_FIELD(fn, instance) \
   1256   CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(instance); \
   1257   CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(fid); \
   1258   ScopedObjectAccess soa(env); \
   1259   mirror::Object* o = soa.Decode<mirror::Object*>(instance); \
   1260   ArtField* f = soa.DecodeField(fid); \
   1261   return f->Get ##fn (o)
   1262 
   1263 #define GET_STATIC_PRIMITIVE_FIELD(fn) \
   1264   CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(fid); \
   1265   ScopedObjectAccess soa(env); \
   1266   ArtField* f = soa.DecodeField(fid); \
   1267   return f->Get ##fn (f->GetDeclaringClass())
   1268 
   1269 #define SET_PRIMITIVE_FIELD(fn, instance, value) \
   1270   CHECK_NON_NULL_ARGUMENT_RETURN_VOID(instance); \
   1271   CHECK_NON_NULL_ARGUMENT_RETURN_VOID(fid); \
   1272   ScopedObjectAccess soa(env); \
   1273   mirror::Object* o = soa.Decode<mirror::Object*>(instance); \
   1274   ArtField* f = soa.DecodeField(fid); \
   1275   f->Set ##fn <false>(o, value)
   1276 
   1277 #define SET_STATIC_PRIMITIVE_FIELD(fn, value) \
   1278   CHECK_NON_NULL_ARGUMENT_RETURN_VOID(fid); \
   1279   ScopedObjectAccess soa(env); \
   1280   ArtField* f = soa.DecodeField(fid); \
   1281   f->Set ##fn <false>(f->GetDeclaringClass(), value)
   1282 
   1283   static jboolean GetBooleanField(JNIEnv* env, jobject obj, jfieldID fid) {
   1284     GET_PRIMITIVE_FIELD(Boolean, obj);
   1285   }
   1286 
   1287   static jbyte GetByteField(JNIEnv* env, jobject obj, jfieldID fid) {
   1288     GET_PRIMITIVE_FIELD(Byte, obj);
   1289   }
   1290 
   1291   static jchar GetCharField(JNIEnv* env, jobject obj, jfieldID fid) {
   1292     GET_PRIMITIVE_FIELD(Char, obj);
   1293   }
   1294 
   1295   static jshort GetShortField(JNIEnv* env, jobject obj, jfieldID fid) {
   1296     GET_PRIMITIVE_FIELD(Short, obj);
   1297   }
   1298 
   1299   static jint GetIntField(JNIEnv* env, jobject obj, jfieldID fid) {
   1300     GET_PRIMITIVE_FIELD(Int, obj);
   1301   }
   1302 
   1303   static jlong GetLongField(JNIEnv* env, jobject obj, jfieldID fid) {
   1304     GET_PRIMITIVE_FIELD(Long, obj);
   1305   }
   1306 
   1307   static jfloat GetFloatField(JNIEnv* env, jobject obj, jfieldID fid) {
   1308     GET_PRIMITIVE_FIELD(Float, obj);
   1309   }
   1310 
   1311   static jdouble GetDoubleField(JNIEnv* env, jobject obj, jfieldID fid) {
   1312     GET_PRIMITIVE_FIELD(Double, obj);
   1313   }
   1314 
   1315   static jboolean GetStaticBooleanField(JNIEnv* env, jclass, jfieldID fid) {
   1316     GET_STATIC_PRIMITIVE_FIELD(Boolean);
   1317   }
   1318 
   1319   static jbyte GetStaticByteField(JNIEnv* env, jclass, jfieldID fid) {
   1320     GET_STATIC_PRIMITIVE_FIELD(Byte);
   1321   }
   1322 
   1323   static jchar GetStaticCharField(JNIEnv* env, jclass, jfieldID fid) {
   1324     GET_STATIC_PRIMITIVE_FIELD(Char);
   1325   }
   1326 
   1327   static jshort GetStaticShortField(JNIEnv* env, jclass, jfieldID fid) {
   1328     GET_STATIC_PRIMITIVE_FIELD(Short);
   1329   }
   1330 
   1331   static jint GetStaticIntField(JNIEnv* env, jclass, jfieldID fid) {
   1332     GET_STATIC_PRIMITIVE_FIELD(Int);
   1333   }
   1334 
   1335   static jlong GetStaticLongField(JNIEnv* env, jclass, jfieldID fid) {
   1336     GET_STATIC_PRIMITIVE_FIELD(Long);
   1337   }
   1338 
   1339   static jfloat GetStaticFloatField(JNIEnv* env, jclass, jfieldID fid) {
   1340     GET_STATIC_PRIMITIVE_FIELD(Float);
   1341   }
   1342 
   1343   static jdouble GetStaticDoubleField(JNIEnv* env, jclass, jfieldID fid) {
   1344     GET_STATIC_PRIMITIVE_FIELD(Double);
   1345   }
   1346 
   1347   static void SetBooleanField(JNIEnv* env, jobject obj, jfieldID fid, jboolean v) {
   1348     SET_PRIMITIVE_FIELD(Boolean, obj, v);
   1349   }
   1350 
   1351   static void SetByteField(JNIEnv* env, jobject obj, jfieldID fid, jbyte v) {
   1352     SET_PRIMITIVE_FIELD(Byte, obj, v);
   1353   }
   1354 
   1355   static void SetCharField(JNIEnv* env, jobject obj, jfieldID fid, jchar v) {
   1356     SET_PRIMITIVE_FIELD(Char, obj, v);
   1357   }
   1358 
   1359   static void SetFloatField(JNIEnv* env, jobject obj, jfieldID fid, jfloat v) {
   1360     SET_PRIMITIVE_FIELD(Float, obj, v);
   1361   }
   1362 
   1363   static void SetDoubleField(JNIEnv* env, jobject obj, jfieldID fid, jdouble v) {
   1364     SET_PRIMITIVE_FIELD(Double, obj, v);
   1365   }
   1366 
   1367   static void SetIntField(JNIEnv* env, jobject obj, jfieldID fid, jint v) {
   1368     SET_PRIMITIVE_FIELD(Int, obj, v);
   1369   }
   1370 
   1371   static void SetLongField(JNIEnv* env, jobject obj, jfieldID fid, jlong v) {
   1372     SET_PRIMITIVE_FIELD(Long, obj, v);
   1373   }
   1374 
   1375   static void SetShortField(JNIEnv* env, jobject obj, jfieldID fid, jshort v) {
   1376     SET_PRIMITIVE_FIELD(Short, obj, v);
   1377   }
   1378 
   1379   static void SetStaticBooleanField(JNIEnv* env, jclass, jfieldID fid, jboolean v) {
   1380     SET_STATIC_PRIMITIVE_FIELD(Boolean, v);
   1381   }
   1382 
   1383   static void SetStaticByteField(JNIEnv* env, jclass, jfieldID fid, jbyte v) {
   1384     SET_STATIC_PRIMITIVE_FIELD(Byte, v);
   1385   }
   1386 
   1387   static void SetStaticCharField(JNIEnv* env, jclass, jfieldID fid, jchar v) {
   1388     SET_STATIC_PRIMITIVE_FIELD(Char, v);
   1389   }
   1390 
   1391   static void SetStaticFloatField(JNIEnv* env, jclass, jfieldID fid, jfloat v) {
   1392     SET_STATIC_PRIMITIVE_FIELD(Float, v);
   1393   }
   1394 
   1395   static void SetStaticDoubleField(JNIEnv* env, jclass, jfieldID fid, jdouble v) {
   1396     SET_STATIC_PRIMITIVE_FIELD(Double, v);
   1397   }
   1398 
   1399   static void SetStaticIntField(JNIEnv* env, jclass, jfieldID fid, jint v) {
   1400     SET_STATIC_PRIMITIVE_FIELD(Int, v);
   1401   }
   1402 
   1403   static void SetStaticLongField(JNIEnv* env, jclass, jfieldID fid, jlong v) {
   1404     SET_STATIC_PRIMITIVE_FIELD(Long, v);
   1405   }
   1406 
   1407   static void SetStaticShortField(JNIEnv* env, jclass, jfieldID fid, jshort v) {
   1408     SET_STATIC_PRIMITIVE_FIELD(Short, v);
   1409   }
   1410 
   1411   static jobject CallStaticObjectMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
   1412     va_list ap;
   1413     va_start(ap, mid);
   1414     CHECK_NON_NULL_ARGUMENT(mid);
   1415     ScopedObjectAccess soa(env);
   1416     JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap));
   1417     jobject local_result = soa.AddLocalReference<jobject>(result.GetL());
   1418     va_end(ap);
   1419     return local_result;
   1420   }
   1421 
   1422   static jobject CallStaticObjectMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
   1423     CHECK_NON_NULL_ARGUMENT(mid);
   1424     ScopedObjectAccess soa(env);
   1425     JValue result(InvokeWithVarArgs(soa, nullptr, mid, args));
   1426     return soa.AddLocalReference<jobject>(result.GetL());
   1427   }
   1428 
   1429   static jobject CallStaticObjectMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
   1430     CHECK_NON_NULL_ARGUMENT(mid);
   1431     ScopedObjectAccess soa(env);
   1432     JValue result(InvokeWithJValues(soa, nullptr, mid, args));
   1433     return soa.AddLocalReference<jobject>(result.GetL());
   1434   }
   1435 
   1436   static jboolean CallStaticBooleanMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
   1437     va_list ap;
   1438     va_start(ap, mid);
   1439     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1440     ScopedObjectAccess soa(env);
   1441     JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap));
   1442     va_end(ap);
   1443     return result.GetZ();
   1444   }
   1445 
   1446   static jboolean CallStaticBooleanMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
   1447     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1448     ScopedObjectAccess soa(env);
   1449     return InvokeWithVarArgs(soa, nullptr, mid, args).GetZ();
   1450   }
   1451 
   1452   static jboolean CallStaticBooleanMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
   1453     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1454     ScopedObjectAccess soa(env);
   1455     return InvokeWithJValues(soa, nullptr, mid, args).GetZ();
   1456   }
   1457 
   1458   static jbyte CallStaticByteMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
   1459     va_list ap;
   1460     va_start(ap, mid);
   1461     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1462     ScopedObjectAccess soa(env);
   1463     JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap));
   1464     va_end(ap);
   1465     return result.GetB();
   1466   }
   1467 
   1468   static jbyte CallStaticByteMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
   1469     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1470     ScopedObjectAccess soa(env);
   1471     return InvokeWithVarArgs(soa, nullptr, mid, args).GetB();
   1472   }
   1473 
   1474   static jbyte CallStaticByteMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
   1475     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1476     ScopedObjectAccess soa(env);
   1477     return InvokeWithJValues(soa, nullptr, mid, args).GetB();
   1478   }
   1479 
   1480   static jchar CallStaticCharMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
   1481     va_list ap;
   1482     va_start(ap, mid);
   1483     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1484     ScopedObjectAccess soa(env);
   1485     JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap));
   1486     va_end(ap);
   1487     return result.GetC();
   1488   }
   1489 
   1490   static jchar CallStaticCharMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
   1491     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1492     ScopedObjectAccess soa(env);
   1493     return InvokeWithVarArgs(soa, nullptr, mid, args).GetC();
   1494   }
   1495 
   1496   static jchar CallStaticCharMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
   1497     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1498     ScopedObjectAccess soa(env);
   1499     return InvokeWithJValues(soa, nullptr, mid, args).GetC();
   1500   }
   1501 
   1502   static jshort CallStaticShortMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
   1503     va_list ap;
   1504     va_start(ap, mid);
   1505     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1506     ScopedObjectAccess soa(env);
   1507     JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap));
   1508     va_end(ap);
   1509     return result.GetS();
   1510   }
   1511 
   1512   static jshort CallStaticShortMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
   1513     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1514     ScopedObjectAccess soa(env);
   1515     return InvokeWithVarArgs(soa, nullptr, mid, args).GetS();
   1516   }
   1517 
   1518   static jshort CallStaticShortMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
   1519     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1520     ScopedObjectAccess soa(env);
   1521     return InvokeWithJValues(soa, nullptr, mid, args).GetS();
   1522   }
   1523 
   1524   static jint CallStaticIntMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
   1525     va_list ap;
   1526     va_start(ap, mid);
   1527     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1528     ScopedObjectAccess soa(env);
   1529     JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap));
   1530     va_end(ap);
   1531     return result.GetI();
   1532   }
   1533 
   1534   static jint CallStaticIntMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
   1535     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1536     ScopedObjectAccess soa(env);
   1537     return InvokeWithVarArgs(soa, nullptr, mid, args).GetI();
   1538   }
   1539 
   1540   static jint CallStaticIntMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
   1541     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1542     ScopedObjectAccess soa(env);
   1543     return InvokeWithJValues(soa, nullptr, mid, args).GetI();
   1544   }
   1545 
   1546   static jlong CallStaticLongMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
   1547     va_list ap;
   1548     va_start(ap, mid);
   1549     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1550     ScopedObjectAccess soa(env);
   1551     JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap));
   1552     va_end(ap);
   1553     return result.GetJ();
   1554   }
   1555 
   1556   static jlong CallStaticLongMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
   1557     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1558     ScopedObjectAccess soa(env);
   1559     return InvokeWithVarArgs(soa, nullptr, mid, args).GetJ();
   1560   }
   1561 
   1562   static jlong CallStaticLongMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
   1563     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1564     ScopedObjectAccess soa(env);
   1565     return InvokeWithJValues(soa, nullptr, mid, args).GetJ();
   1566   }
   1567 
   1568   static jfloat CallStaticFloatMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
   1569     va_list ap;
   1570     va_start(ap, mid);
   1571     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1572     ScopedObjectAccess soa(env);
   1573     JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap));
   1574     va_end(ap);
   1575     return result.GetF();
   1576   }
   1577 
   1578   static jfloat CallStaticFloatMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
   1579     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1580     ScopedObjectAccess soa(env);
   1581     return InvokeWithVarArgs(soa, nullptr, mid, args).GetF();
   1582   }
   1583 
   1584   static jfloat CallStaticFloatMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
   1585     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1586     ScopedObjectAccess soa(env);
   1587     return InvokeWithJValues(soa, nullptr, mid, args).GetF();
   1588   }
   1589 
   1590   static jdouble CallStaticDoubleMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
   1591     va_list ap;
   1592     va_start(ap, mid);
   1593     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1594     ScopedObjectAccess soa(env);
   1595     JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap));
   1596     va_end(ap);
   1597     return result.GetD();
   1598   }
   1599 
   1600   static jdouble CallStaticDoubleMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
   1601     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1602     ScopedObjectAccess soa(env);
   1603     return InvokeWithVarArgs(soa, nullptr, mid, args).GetD();
   1604   }
   1605 
   1606   static jdouble CallStaticDoubleMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
   1607     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(mid);
   1608     ScopedObjectAccess soa(env);
   1609     return InvokeWithJValues(soa, nullptr, mid, args).GetD();
   1610   }
   1611 
   1612   static void CallStaticVoidMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
   1613     va_list ap;
   1614     va_start(ap, mid);
   1615     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(mid);
   1616     ScopedObjectAccess soa(env);
   1617     InvokeWithVarArgs(soa, nullptr, mid, ap);
   1618     va_end(ap);
   1619   }
   1620 
   1621   static void CallStaticVoidMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
   1622     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(mid);
   1623     ScopedObjectAccess soa(env);
   1624     InvokeWithVarArgs(soa, nullptr, mid, args);
   1625   }
   1626 
   1627   static void CallStaticVoidMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
   1628     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(mid);
   1629     ScopedObjectAccess soa(env);
   1630     InvokeWithJValues(soa, nullptr, mid, args);
   1631   }
   1632 
   1633   static jstring NewString(JNIEnv* env, const jchar* chars, jsize char_count) {
   1634     if (UNLIKELY(char_count < 0)) {
   1635       JavaVmExtFromEnv(env)->JniAbortF("NewString", "char_count < 0: %d", char_count);
   1636       return nullptr;
   1637     }
   1638     if (UNLIKELY(chars == nullptr && char_count > 0)) {
   1639       JavaVmExtFromEnv(env)->JniAbortF("NewString", "chars == null && char_count > 0");
   1640       return nullptr;
   1641     }
   1642     ScopedObjectAccess soa(env);
   1643     mirror::String* result = mirror::String::AllocFromUtf16(soa.Self(), char_count, chars);
   1644     return soa.AddLocalReference<jstring>(result);
   1645   }
   1646 
   1647   static jstring NewStringUTF(JNIEnv* env, const char* utf) {
   1648     if (utf == nullptr) {
   1649       return nullptr;
   1650     }
   1651     ScopedObjectAccess soa(env);
   1652     mirror::String* result = mirror::String::AllocFromModifiedUtf8(soa.Self(), utf);
   1653     return soa.AddLocalReference<jstring>(result);
   1654   }
   1655 
   1656   static jsize GetStringLength(JNIEnv* env, jstring java_string) {
   1657     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(java_string);
   1658     ScopedObjectAccess soa(env);
   1659     return soa.Decode<mirror::String*>(java_string)->GetLength();
   1660   }
   1661 
   1662   static jsize GetStringUTFLength(JNIEnv* env, jstring java_string) {
   1663     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(java_string);
   1664     ScopedObjectAccess soa(env);
   1665     return soa.Decode<mirror::String*>(java_string)->GetUtfLength();
   1666   }
   1667 
   1668   static void GetStringRegion(JNIEnv* env, jstring java_string, jsize start, jsize length,
   1669                               jchar* buf) {
   1670     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(java_string);
   1671     ScopedObjectAccess soa(env);
   1672     mirror::String* s = soa.Decode<mirror::String*>(java_string);
   1673     if (start < 0 || length < 0 || start + length > s->GetLength()) {
   1674       ThrowSIOOBE(soa, start, length, s->GetLength());
   1675     } else {
   1676       CHECK_NON_NULL_MEMCPY_ARGUMENT(length, buf);
   1677       const jchar* chars = s->GetValue();
   1678       memcpy(buf, chars + start, length * sizeof(jchar));
   1679     }
   1680   }
   1681 
   1682   static void GetStringUTFRegion(JNIEnv* env, jstring java_string, jsize start, jsize length,
   1683                                  char* buf) {
   1684     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(java_string);
   1685     ScopedObjectAccess soa(env);
   1686     mirror::String* s = soa.Decode<mirror::String*>(java_string);
   1687     if (start < 0 || length < 0 || start + length > s->GetLength()) {
   1688       ThrowSIOOBE(soa, start, length, s->GetLength());
   1689     } else {
   1690       CHECK_NON_NULL_MEMCPY_ARGUMENT(length, buf);
   1691       const jchar* chars = s->GetValue();
   1692       ConvertUtf16ToModifiedUtf8(buf, chars + start, length);
   1693     }
   1694   }
   1695 
   1696   static const jchar* GetStringChars(JNIEnv* env, jstring java_string, jboolean* is_copy) {
   1697     CHECK_NON_NULL_ARGUMENT(java_string);
   1698     ScopedObjectAccess soa(env);
   1699     mirror::String* s = soa.Decode<mirror::String*>(java_string);
   1700     gc::Heap* heap = Runtime::Current()->GetHeap();
   1701     if (heap->IsMovableObject(s)) {
   1702       jchar* chars = new jchar[s->GetLength()];
   1703       memcpy(chars, s->GetValue(), sizeof(jchar) * s->GetLength());
   1704       if (is_copy != nullptr) {
   1705         *is_copy = JNI_TRUE;
   1706       }
   1707       return chars;
   1708     }
   1709     if (is_copy != nullptr) {
   1710       *is_copy = JNI_FALSE;
   1711     }
   1712     return static_cast<jchar*>(s->GetValue());
   1713   }
   1714 
   1715   static void ReleaseStringChars(JNIEnv* env, jstring java_string, const jchar* chars) {
   1716     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(java_string);
   1717     ScopedObjectAccess soa(env);
   1718     mirror::String* s = soa.Decode<mirror::String*>(java_string);
   1719     if (chars != s->GetValue()) {
   1720       delete[] chars;
   1721     }
   1722   }
   1723 
   1724   static const jchar* GetStringCritical(JNIEnv* env, jstring java_string, jboolean* is_copy) {
   1725     CHECK_NON_NULL_ARGUMENT(java_string);
   1726     ScopedObjectAccess soa(env);
   1727     mirror::String* s = soa.Decode<mirror::String*>(java_string);
   1728     gc::Heap* heap = Runtime::Current()->GetHeap();
   1729     if (heap->IsMovableObject(s)) {
   1730       StackHandleScope<1> hs(soa.Self());
   1731       HandleWrapper<mirror::String> h(hs.NewHandleWrapper(&s));
   1732       heap->IncrementDisableMovingGC(soa.Self());
   1733     }
   1734     if (is_copy != nullptr) {
   1735       *is_copy = JNI_FALSE;
   1736     }
   1737     return static_cast<jchar*>(s->GetValue());
   1738   }
   1739 
   1740   static void ReleaseStringCritical(JNIEnv* env, jstring java_string, const jchar* chars) {
   1741     UNUSED(chars);
   1742     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(java_string);
   1743     ScopedObjectAccess soa(env);
   1744     gc::Heap* heap = Runtime::Current()->GetHeap();
   1745     mirror::String* s = soa.Decode<mirror::String*>(java_string);
   1746     if (heap->IsMovableObject(s)) {
   1747       heap->DecrementDisableMovingGC(soa.Self());
   1748     }
   1749   }
   1750 
   1751   static const char* GetStringUTFChars(JNIEnv* env, jstring java_string, jboolean* is_copy) {
   1752     if (java_string == nullptr) {
   1753       return nullptr;
   1754     }
   1755     if (is_copy != nullptr) {
   1756       *is_copy = JNI_TRUE;
   1757     }
   1758     ScopedObjectAccess soa(env);
   1759     mirror::String* s = soa.Decode<mirror::String*>(java_string);
   1760     size_t byte_count = s->GetUtfLength();
   1761     char* bytes = new char[byte_count + 1];
   1762     CHECK(bytes != nullptr);  // bionic aborts anyway.
   1763     const uint16_t* chars = s->GetValue();
   1764     ConvertUtf16ToModifiedUtf8(bytes, chars, s->GetLength());
   1765     bytes[byte_count] = '\0';
   1766     return bytes;
   1767   }
   1768 
   1769   static void ReleaseStringUTFChars(JNIEnv*, jstring, const char* chars) {
   1770     delete[] chars;
   1771   }
   1772 
   1773   static jsize GetArrayLength(JNIEnv* env, jarray java_array) {
   1774     CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(java_array);
   1775     ScopedObjectAccess soa(env);
   1776     mirror::Object* obj = soa.Decode<mirror::Object*>(java_array);
   1777     if (UNLIKELY(!obj->IsArrayInstance())) {
   1778       soa.Vm()->JniAbortF("GetArrayLength", "not an array: %s", PrettyTypeOf(obj).c_str());
   1779       return 0;
   1780     }
   1781     mirror::Array* array = obj->AsArray();
   1782     return array->GetLength();
   1783   }
   1784 
   1785   static jobject GetObjectArrayElement(JNIEnv* env, jobjectArray java_array, jsize index) {
   1786     CHECK_NON_NULL_ARGUMENT(java_array);
   1787     ScopedObjectAccess soa(env);
   1788     mirror::ObjectArray<mirror::Object>* array =
   1789         soa.Decode<mirror::ObjectArray<mirror::Object>*>(java_array);
   1790     return soa.AddLocalReference<jobject>(array->Get(index));
   1791   }
   1792 
   1793   static void SetObjectArrayElement(JNIEnv* env, jobjectArray java_array, jsize index,
   1794                                     jobject java_value) {
   1795     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(java_array);
   1796     ScopedObjectAccess soa(env);
   1797     mirror::ObjectArray<mirror::Object>* array =
   1798         soa.Decode<mirror::ObjectArray<mirror::Object>*>(java_array);
   1799     mirror::Object* value = soa.Decode<mirror::Object*>(java_value);
   1800     array->Set<false>(index, value);
   1801   }
   1802 
   1803   static jbooleanArray NewBooleanArray(JNIEnv* env, jsize length) {
   1804     return NewPrimitiveArray<jbooleanArray, mirror::BooleanArray>(env, length);
   1805   }
   1806 
   1807   static jbyteArray NewByteArray(JNIEnv* env, jsize length) {
   1808     return NewPrimitiveArray<jbyteArray, mirror::ByteArray>(env, length);
   1809   }
   1810 
   1811   static jcharArray NewCharArray(JNIEnv* env, jsize length) {
   1812     return NewPrimitiveArray<jcharArray, mirror::CharArray>(env, length);
   1813   }
   1814 
   1815   static jdoubleArray NewDoubleArray(JNIEnv* env, jsize length) {
   1816     return NewPrimitiveArray<jdoubleArray, mirror::DoubleArray>(env, length);
   1817   }
   1818 
   1819   static jfloatArray NewFloatArray(JNIEnv* env, jsize length) {
   1820     return NewPrimitiveArray<jfloatArray, mirror::FloatArray>(env, length);
   1821   }
   1822 
   1823   static jintArray NewIntArray(JNIEnv* env, jsize length) {
   1824     return NewPrimitiveArray<jintArray, mirror::IntArray>(env, length);
   1825   }
   1826 
   1827   static jlongArray NewLongArray(JNIEnv* env, jsize length) {
   1828     return NewPrimitiveArray<jlongArray, mirror::LongArray>(env, length);
   1829   }
   1830 
   1831   static jobjectArray NewObjectArray(JNIEnv* env, jsize length, jclass element_jclass,
   1832                                      jobject initial_element) {
   1833     if (UNLIKELY(length < 0)) {
   1834       JavaVmExtFromEnv(env)->JniAbortF("NewObjectArray", "negative array length: %d", length);
   1835       return nullptr;
   1836     }
   1837     CHECK_NON_NULL_ARGUMENT(element_jclass);
   1838 
   1839     // Compute the array class corresponding to the given element class.
   1840     ScopedObjectAccess soa(env);
   1841     mirror::Class* array_class;
   1842     {
   1843       mirror::Class* element_class = soa.Decode<mirror::Class*>(element_jclass);
   1844       if (UNLIKELY(element_class->IsPrimitive())) {
   1845         soa.Vm()->JniAbortF("NewObjectArray", "not an object type: %s",
   1846                             PrettyDescriptor(element_class).c_str());
   1847         return nullptr;
   1848       }
   1849       ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
   1850       array_class = class_linker->FindArrayClass(soa.Self(), &element_class);
   1851       if (UNLIKELY(array_class == nullptr)) {
   1852         return nullptr;
   1853       }
   1854     }
   1855 
   1856     // Allocate and initialize if necessary.
   1857     mirror::ObjectArray<mirror::Object>* result =
   1858         mirror::ObjectArray<mirror::Object>::Alloc(soa.Self(), array_class, length);
   1859     if (result != nullptr && initial_element != nullptr) {
   1860       mirror::Object* initial_object = soa.Decode<mirror::Object*>(initial_element);
   1861       if (initial_object != nullptr) {
   1862         mirror::Class* element_class = result->GetClass()->GetComponentType();
   1863         if (UNLIKELY(!element_class->IsAssignableFrom(initial_object->GetClass()))) {
   1864           soa.Vm()->JniAbortF("NewObjectArray", "cannot assign object of type '%s' to array with "
   1865                               "element type of '%s'",
   1866                               PrettyDescriptor(initial_object->GetClass()).c_str(),
   1867                               PrettyDescriptor(element_class).c_str());
   1868           return nullptr;
   1869         } else {
   1870           for (jsize i = 0; i < length; ++i) {
   1871             result->SetWithoutChecks<false>(i, initial_object);
   1872           }
   1873         }
   1874       }
   1875     }
   1876     return soa.AddLocalReference<jobjectArray>(result);
   1877   }
   1878 
   1879   static jshortArray NewShortArray(JNIEnv* env, jsize length) {
   1880     return NewPrimitiveArray<jshortArray, mirror::ShortArray>(env, length);
   1881   }
   1882 
   1883   static void* GetPrimitiveArrayCritical(JNIEnv* env, jarray java_array, jboolean* is_copy) {
   1884     CHECK_NON_NULL_ARGUMENT(java_array);
   1885     ScopedObjectAccess soa(env);
   1886     mirror::Array* array = soa.Decode<mirror::Array*>(java_array);
   1887     if (UNLIKELY(!array->GetClass()->IsPrimitiveArray())) {
   1888       soa.Vm()->JniAbortF("GetPrimitiveArrayCritical", "expected primitive array, given %s",
   1889                           PrettyDescriptor(array->GetClass()).c_str());
   1890       return nullptr;
   1891     }
   1892     gc::Heap* heap = Runtime::Current()->GetHeap();
   1893     if (heap->IsMovableObject(array)) {
   1894       heap->IncrementDisableMovingGC(soa.Self());
   1895       // Re-decode in case the object moved since IncrementDisableGC waits for GC to complete.
   1896       array = soa.Decode<mirror::Array*>(java_array);
   1897     }
   1898     if (is_copy != nullptr) {
   1899       *is_copy = JNI_FALSE;
   1900     }
   1901     return array->GetRawData(array->GetClass()->GetComponentSize(), 0);
   1902   }
   1903 
   1904   static void ReleasePrimitiveArrayCritical(JNIEnv* env, jarray java_array, void* elements,
   1905                                             jint mode) {
   1906     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(java_array);
   1907     ScopedObjectAccess soa(env);
   1908     mirror::Array* array = soa.Decode<mirror::Array*>(java_array);
   1909     if (UNLIKELY(!array->GetClass()->IsPrimitiveArray())) {
   1910       soa.Vm()->JniAbortF("ReleasePrimitiveArrayCritical", "expected primitive array, given %s",
   1911                           PrettyDescriptor(array->GetClass()).c_str());
   1912       return;
   1913     }
   1914     const size_t component_size = array->GetClass()->GetComponentSize();
   1915     ReleasePrimitiveArray(soa, array, component_size, elements, mode);
   1916   }
   1917 
   1918   static jboolean* GetBooleanArrayElements(JNIEnv* env, jbooleanArray array, jboolean* is_copy) {
   1919     return GetPrimitiveArray<jbooleanArray, jboolean, mirror::BooleanArray>(env, array, is_copy);
   1920   }
   1921 
   1922   static jbyte* GetByteArrayElements(JNIEnv* env, jbyteArray array, jboolean* is_copy) {
   1923     return GetPrimitiveArray<jbyteArray, jbyte, mirror::ByteArray>(env, array, is_copy);
   1924   }
   1925 
   1926   static jchar* GetCharArrayElements(JNIEnv* env, jcharArray array, jboolean* is_copy) {
   1927     return GetPrimitiveArray<jcharArray, jchar, mirror::CharArray>(env, array, is_copy);
   1928   }
   1929 
   1930   static jdouble* GetDoubleArrayElements(JNIEnv* env, jdoubleArray array, jboolean* is_copy) {
   1931     return GetPrimitiveArray<jdoubleArray, jdouble, mirror::DoubleArray>(env, array, is_copy);
   1932   }
   1933 
   1934   static jfloat* GetFloatArrayElements(JNIEnv* env, jfloatArray array, jboolean* is_copy) {
   1935     return GetPrimitiveArray<jfloatArray, jfloat, mirror::FloatArray>(env, array, is_copy);
   1936   }
   1937 
   1938   static jint* GetIntArrayElements(JNIEnv* env, jintArray array, jboolean* is_copy) {
   1939     return GetPrimitiveArray<jintArray, jint, mirror::IntArray>(env, array, is_copy);
   1940   }
   1941 
   1942   static jlong* GetLongArrayElements(JNIEnv* env, jlongArray array, jboolean* is_copy) {
   1943     return GetPrimitiveArray<jlongArray, jlong, mirror::LongArray>(env, array, is_copy);
   1944   }
   1945 
   1946   static jshort* GetShortArrayElements(JNIEnv* env, jshortArray array, jboolean* is_copy) {
   1947     return GetPrimitiveArray<jshortArray, jshort, mirror::ShortArray>(env, array, is_copy);
   1948   }
   1949 
   1950   static void ReleaseBooleanArrayElements(JNIEnv* env, jbooleanArray array, jboolean* elements,
   1951                                           jint mode) {
   1952     ReleasePrimitiveArray<jbooleanArray, jboolean, mirror::BooleanArray>(env, array, elements,
   1953                                                                          mode);
   1954   }
   1955 
   1956   static void ReleaseByteArrayElements(JNIEnv* env, jbyteArray array, jbyte* elements, jint mode) {
   1957     ReleasePrimitiveArray<jbyteArray, jbyte, mirror::ByteArray>(env, array, elements, mode);
   1958   }
   1959 
   1960   static void ReleaseCharArrayElements(JNIEnv* env, jcharArray array, jchar* elements, jint mode) {
   1961     ReleasePrimitiveArray<jcharArray, jchar, mirror::CharArray>(env, array, elements, mode);
   1962   }
   1963 
   1964   static void ReleaseDoubleArrayElements(JNIEnv* env, jdoubleArray array, jdouble* elements,
   1965                                          jint mode) {
   1966     ReleasePrimitiveArray<jdoubleArray, jdouble, mirror::DoubleArray>(env, array, elements, mode);
   1967   }
   1968 
   1969   static void ReleaseFloatArrayElements(JNIEnv* env, jfloatArray array, jfloat* elements,
   1970                                         jint mode) {
   1971     ReleasePrimitiveArray<jfloatArray, jfloat, mirror::FloatArray>(env, array, elements, mode);
   1972   }
   1973 
   1974   static void ReleaseIntArrayElements(JNIEnv* env, jintArray array, jint* elements, jint mode) {
   1975     ReleasePrimitiveArray<jintArray, jint, mirror::IntArray>(env, array, elements, mode);
   1976   }
   1977 
   1978   static void ReleaseLongArrayElements(JNIEnv* env, jlongArray array, jlong* elements, jint mode) {
   1979     ReleasePrimitiveArray<jlongArray, jlong, mirror::LongArray>(env, array, elements, mode);
   1980   }
   1981 
   1982   static void ReleaseShortArrayElements(JNIEnv* env, jshortArray array, jshort* elements,
   1983                                         jint mode) {
   1984     ReleasePrimitiveArray<jshortArray, jshort, mirror::ShortArray>(env, array, elements, mode);
   1985   }
   1986 
   1987   static void GetBooleanArrayRegion(JNIEnv* env, jbooleanArray array, jsize start, jsize length,
   1988                                     jboolean* buf) {
   1989     GetPrimitiveArrayRegion<jbooleanArray, jboolean, mirror::BooleanArray>(env, array, start,
   1990                                                                            length, buf);
   1991   }
   1992 
   1993   static void GetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, jsize length,
   1994                                  jbyte* buf) {
   1995     GetPrimitiveArrayRegion<jbyteArray, jbyte, mirror::ByteArray>(env, array, start, length, buf);
   1996   }
   1997 
   1998   static void GetCharArrayRegion(JNIEnv* env, jcharArray array, jsize start, jsize length,
   1999                                  jchar* buf) {
   2000     GetPrimitiveArrayRegion<jcharArray, jchar, mirror::CharArray>(env, array, start, length, buf);
   2001   }
   2002 
   2003   static void GetDoubleArrayRegion(JNIEnv* env, jdoubleArray array, jsize start, jsize length,
   2004                                    jdouble* buf) {
   2005     GetPrimitiveArrayRegion<jdoubleArray, jdouble, mirror::DoubleArray>(env, array, start, length,
   2006                                                                         buf);
   2007   }
   2008 
   2009   static void GetFloatArrayRegion(JNIEnv* env, jfloatArray array, jsize start, jsize length,
   2010                                   jfloat* buf) {
   2011     GetPrimitiveArrayRegion<jfloatArray, jfloat, mirror::FloatArray>(env, array, start, length,
   2012                                                                      buf);
   2013   }
   2014 
   2015   static void GetIntArrayRegion(JNIEnv* env, jintArray array, jsize start, jsize length,
   2016                                 jint* buf) {
   2017     GetPrimitiveArrayRegion<jintArray, jint, mirror::IntArray>(env, array, start, length, buf);
   2018   }
   2019 
   2020   static void GetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize length,
   2021                                  jlong* buf) {
   2022     GetPrimitiveArrayRegion<jlongArray, jlong, mirror::LongArray>(env, array, start, length, buf);
   2023   }
   2024 
   2025   static void GetShortArrayRegion(JNIEnv* env, jshortArray array, jsize start, jsize length,
   2026                                   jshort* buf) {
   2027     GetPrimitiveArrayRegion<jshortArray, jshort, mirror::ShortArray>(env, array, start, length,
   2028                                                                      buf);
   2029   }
   2030 
   2031   static void SetBooleanArrayRegion(JNIEnv* env, jbooleanArray array, jsize start, jsize length,
   2032                                     const jboolean* buf) {
   2033     SetPrimitiveArrayRegion<jbooleanArray, jboolean, mirror::BooleanArray>(env, array, start,
   2034                                                                            length, buf);
   2035   }
   2036 
   2037   static void SetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, jsize length,
   2038                                  const jbyte* buf) {
   2039     SetPrimitiveArrayRegion<jbyteArray, jbyte, mirror::ByteArray>(env, array, start, length, buf);
   2040   }
   2041 
   2042   static void SetCharArrayRegion(JNIEnv* env, jcharArray array, jsize start, jsize length,
   2043                                  const jchar* buf) {
   2044     SetPrimitiveArrayRegion<jcharArray, jchar, mirror::CharArray>(env, array, start, length, buf);
   2045   }
   2046 
   2047   static void SetDoubleArrayRegion(JNIEnv* env, jdoubleArray array, jsize start, jsize length,
   2048                                    const jdouble* buf) {
   2049     SetPrimitiveArrayRegion<jdoubleArray, jdouble, mirror::DoubleArray>(env, array, start, length,
   2050                                                                         buf);
   2051   }
   2052 
   2053   static void SetFloatArrayRegion(JNIEnv* env, jfloatArray array, jsize start, jsize length,
   2054                                   const jfloat* buf) {
   2055     SetPrimitiveArrayRegion<jfloatArray, jfloat, mirror::FloatArray>(env, array, start, length,
   2056                                                                      buf);
   2057   }
   2058 
   2059   static void SetIntArrayRegion(JNIEnv* env, jintArray array, jsize start, jsize length,
   2060                                 const jint* buf) {
   2061     SetPrimitiveArrayRegion<jintArray, jint, mirror::IntArray>(env, array, start, length, buf);
   2062   }
   2063 
   2064   static void SetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize length,
   2065                                  const jlong* buf) {
   2066     SetPrimitiveArrayRegion<jlongArray, jlong, mirror::LongArray>(env, array, start, length, buf);
   2067   }
   2068 
   2069   static void SetShortArrayRegion(JNIEnv* env, jshortArray array, jsize start, jsize length,
   2070                                   const jshort* buf) {
   2071     SetPrimitiveArrayRegion<jshortArray, jshort, mirror::ShortArray>(env, array, start, length,
   2072                                                                      buf);
   2073   }
   2074 
   2075   static jint RegisterNatives(JNIEnv* env, jclass java_class, const JNINativeMethod* methods,
   2076                               jint method_count) {
   2077     return RegisterNativeMethods(env, java_class, methods, method_count, true);
   2078   }
   2079 
   2080   static jint RegisterNativeMethods(JNIEnv* env, jclass java_class, const JNINativeMethod* methods,
   2081                                     jint method_count, bool return_errors) {
   2082     if (UNLIKELY(method_count < 0)) {
   2083       JavaVmExtFromEnv(env)->JniAbortF("RegisterNatives", "negative method count: %d",
   2084                                        method_count);
   2085       return JNI_ERR;  // Not reached except in unit tests.
   2086     }
   2087     CHECK_NON_NULL_ARGUMENT_FN_NAME("RegisterNatives", java_class, JNI_ERR);
   2088     ScopedObjectAccess soa(env);
   2089     mirror::Class* c = soa.Decode<mirror::Class*>(java_class);
   2090     if (UNLIKELY(method_count == 0)) {
   2091       LOG(WARNING) << "JNI RegisterNativeMethods: attempt to register 0 native methods for "
   2092           << PrettyDescriptor(c);
   2093       return JNI_OK;
   2094     }
   2095     CHECK_NON_NULL_ARGUMENT_FN_NAME("RegisterNatives", methods, JNI_ERR);
   2096     for (jint i = 0; i < method_count; ++i) {
   2097       const char* name = methods[i].name;
   2098       const char* sig = methods[i].signature;
   2099       const void* fnPtr = methods[i].fnPtr;
   2100       if (UNLIKELY(name == nullptr)) {
   2101         ReportInvalidJNINativeMethod(soa, c, "method name", i, return_errors);
   2102         return JNI_ERR;
   2103       } else if (UNLIKELY(sig == nullptr)) {
   2104         ReportInvalidJNINativeMethod(soa, c, "method signature", i, return_errors);
   2105         return JNI_ERR;
   2106       } else if (UNLIKELY(fnPtr == nullptr)) {
   2107         ReportInvalidJNINativeMethod(soa, c, "native function", i, return_errors);
   2108         return JNI_ERR;
   2109       }
   2110       bool is_fast = false;
   2111       // Notes about fast JNI calls:
   2112       //
   2113       // On a normal JNI call, the calling thread usually transitions
   2114       // from the kRunnable state to the kNative state. But if the
   2115       // called native function needs to access any Java object, it
   2116       // will have to transition back to the kRunnable state.
   2117       //
   2118       // There is a cost to this double transition. For a JNI call
   2119       // that should be quick, this cost may dominate the call cost.
   2120       //
   2121       // On a fast JNI call, the calling thread avoids this double
   2122       // transition by not transitioning from kRunnable to kNative and
   2123       // stays in the kRunnable state.
   2124       //
   2125       // There are risks to using a fast JNI call because it can delay
   2126       // a response to a thread suspension request which is typically
   2127       // used for a GC root scanning, etc. If a fast JNI call takes a
   2128       // long time, it could cause longer thread suspension latency
   2129       // and GC pauses.
   2130       //
   2131       // Thus, fast JNI should be used with care. It should be used
   2132       // for a JNI call that takes a short amount of time (eg. no
   2133       // long-running loop) and does not block (eg. no locks, I/O,
   2134       // etc.)
   2135       //
   2136       // A '!' prefix in the signature in the JNINativeMethod
   2137       // indicates that it's a fast JNI call and the runtime omits the
   2138       // thread state transition from kRunnable to kNative at the
   2139       // entry.
   2140       if (*sig == '!') {
   2141         is_fast = true;
   2142         ++sig;
   2143       }
   2144 
   2145       // Note: the right order is to try to find the method locally
   2146       // first, either as a direct or a virtual method. Then move to
   2147       // the parent.
   2148       ArtMethod* m = nullptr;
   2149       bool warn_on_going_to_parent = down_cast<JNIEnvExt*>(env)->vm->IsCheckJniEnabled();
   2150       for (mirror::Class* current_class = c;
   2151            current_class != nullptr;
   2152            current_class = current_class->GetSuperClass()) {
   2153         // Search first only comparing methods which are native.
   2154         m = FindMethod<true>(current_class, name, sig);
   2155         if (m != nullptr) {
   2156           break;
   2157         }
   2158 
   2159         // Search again comparing to all methods, to find non-native methods that match.
   2160         m = FindMethod<false>(current_class, name, sig);
   2161         if (m != nullptr) {
   2162           break;
   2163         }
   2164 
   2165         if (warn_on_going_to_parent) {
   2166           LOG(WARNING) << "CheckJNI: method to register \"" << name << "\" not in the given class. "
   2167                        << "This is slow, consider changing your RegisterNatives calls.";
   2168           warn_on_going_to_parent = false;
   2169         }
   2170       }
   2171 
   2172       if (m == nullptr) {
   2173         LOG(return_errors ? ERROR : INTERNAL_FATAL) << "Failed to register native method "
   2174             << PrettyDescriptor(c) << "." << name << sig << " in "
   2175             << c->GetDexCache()->GetLocation()->ToModifiedUtf8();
   2176         // Safe to pass in LOG(FATAL) since the log object aborts in destructor and only goes
   2177         // out of scope after the DumpClass is done executing.
   2178         c->DumpClass(LOG(return_errors ? ERROR : FATAL), mirror::Class::kDumpClassFullDetail);
   2179         ThrowNoSuchMethodError(soa, c, name, sig, "static or non-static");
   2180         return JNI_ERR;
   2181       } else if (!m->IsNative()) {
   2182         LOG(return_errors ? ERROR : FATAL) << "Failed to register non-native method "
   2183             << PrettyDescriptor(c) << "." << name << sig
   2184             << " as native";
   2185         ThrowNoSuchMethodError(soa, c, name, sig, "native");
   2186         return JNI_ERR;
   2187       }
   2188 
   2189       VLOG(jni) << "[Registering JNI native method " << PrettyMethod(m) << "]";
   2190 
   2191       m->RegisterNative(fnPtr, is_fast);
   2192     }
   2193     return JNI_OK;
   2194   }
   2195 
   2196   static jint UnregisterNatives(JNIEnv* env, jclass java_class) {
   2197     CHECK_NON_NULL_ARGUMENT_RETURN(java_class, JNI_ERR);
   2198     ScopedObjectAccess soa(env);
   2199     mirror::Class* c = soa.Decode<mirror::Class*>(java_class);
   2200 
   2201     VLOG(jni) << "[Unregistering JNI native methods for " << PrettyClass(c) << "]";
   2202 
   2203     size_t unregistered_count = 0;
   2204     auto pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
   2205     for (auto& m : c->GetDirectMethods(pointer_size)) {
   2206       if (m.IsNative()) {
   2207         m.UnregisterNative();
   2208         unregistered_count++;
   2209       }
   2210     }
   2211     for (auto& m : c->GetVirtualMethods(pointer_size)) {
   2212       if (m.IsNative()) {
   2213         m.UnregisterNative();
   2214         unregistered_count++;
   2215       }
   2216     }
   2217 
   2218     if (unregistered_count == 0) {
   2219       LOG(WARNING) << "JNI UnregisterNatives: attempt to unregister native methods of class '"
   2220           << PrettyDescriptor(c) << "' that contains no native methods";
   2221     }
   2222     return JNI_OK;
   2223   }
   2224 
   2225   static jint MonitorEnter(JNIEnv* env, jobject java_object) NO_THREAD_SAFETY_ANALYSIS {
   2226     CHECK_NON_NULL_ARGUMENT_RETURN(java_object, JNI_ERR);
   2227     ScopedObjectAccess soa(env);
   2228     mirror::Object* o = soa.Decode<mirror::Object*>(java_object);
   2229     o = o->MonitorEnter(soa.Self());
   2230     if (soa.Self()->IsExceptionPending()) {
   2231       return JNI_ERR;
   2232     }
   2233     soa.Env()->monitors.Add(o);
   2234     return JNI_OK;
   2235   }
   2236 
   2237   static jint MonitorExit(JNIEnv* env, jobject java_object) NO_THREAD_SAFETY_ANALYSIS {
   2238     CHECK_NON_NULL_ARGUMENT_RETURN(java_object, JNI_ERR);
   2239     ScopedObjectAccess soa(env);
   2240     mirror::Object* o = soa.Decode<mirror::Object*>(java_object);
   2241     o->MonitorExit(soa.Self());
   2242     if (soa.Self()->IsExceptionPending()) {
   2243       return JNI_ERR;
   2244     }
   2245     soa.Env()->monitors.Remove(o);
   2246     return JNI_OK;
   2247   }
   2248 
   2249   static jint GetJavaVM(JNIEnv* env, JavaVM** vm) {
   2250     CHECK_NON_NULL_ARGUMENT_RETURN(vm, JNI_ERR);
   2251     Runtime* runtime = Runtime::Current();
   2252     if (runtime != nullptr) {
   2253       *vm = runtime->GetJavaVM();
   2254     } else {
   2255       *vm = nullptr;
   2256     }
   2257     return (*vm != nullptr) ? JNI_OK : JNI_ERR;
   2258   }
   2259 
   2260   static jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity) {
   2261     if (capacity < 0) {
   2262       JavaVmExtFromEnv(env)->JniAbortF("NewDirectByteBuffer", "negative buffer capacity: %" PRId64,
   2263                                        capacity);
   2264       return nullptr;
   2265     }
   2266     if (address == nullptr && capacity != 0) {
   2267       JavaVmExtFromEnv(env)->JniAbortF("NewDirectByteBuffer",
   2268                                        "non-zero capacity for nullptr pointer: %" PRId64, capacity);
   2269       return nullptr;
   2270     }
   2271 
   2272     // At the moment, the capacity of DirectByteBuffer is limited to a signed int.
   2273     if (capacity > INT_MAX) {
   2274       JavaVmExtFromEnv(env)->JniAbortF("NewDirectByteBuffer",
   2275                                        "buffer capacity greater than maximum jint: %" PRId64,
   2276                                        capacity);
   2277       return nullptr;
   2278     }
   2279     jlong address_arg = reinterpret_cast<jlong>(address);
   2280     jint capacity_arg = static_cast<jint>(capacity);
   2281 
   2282     jobject result = env->NewObject(WellKnownClasses::java_nio_DirectByteBuffer,
   2283                                     WellKnownClasses::java_nio_DirectByteBuffer_init,
   2284                                     address_arg, capacity_arg);
   2285     return static_cast<JNIEnvExt*>(env)->self->IsExceptionPending() ? nullptr : result;
   2286   }
   2287 
   2288   static void* GetDirectBufferAddress(JNIEnv* env, jobject java_buffer) {
   2289     return reinterpret_cast<void*>(env->GetLongField(
   2290         java_buffer, WellKnownClasses::java_nio_DirectByteBuffer_effectiveDirectAddress));
   2291   }
   2292 
   2293   static jlong GetDirectBufferCapacity(JNIEnv* env, jobject java_buffer) {
   2294     return static_cast<jlong>(env->GetIntField(
   2295         java_buffer, WellKnownClasses::java_nio_DirectByteBuffer_capacity));
   2296   }
   2297 
   2298   static jobjectRefType GetObjectRefType(JNIEnv* env ATTRIBUTE_UNUSED, jobject java_object) {
   2299     if (java_object == nullptr) {
   2300       return JNIInvalidRefType;
   2301     }
   2302 
   2303     // Do we definitely know what kind of reference this is?
   2304     IndirectRef ref = reinterpret_cast<IndirectRef>(java_object);
   2305     IndirectRefKind kind = GetIndirectRefKind(ref);
   2306     switch (kind) {
   2307     case kLocal:
   2308       return JNILocalRefType;
   2309     case kGlobal:
   2310       return JNIGlobalRefType;
   2311     case kWeakGlobal:
   2312       return JNIWeakGlobalRefType;
   2313     case kHandleScopeOrInvalid:
   2314       // Assume value is in a handle scope.
   2315       return JNILocalRefType;
   2316     }
   2317     LOG(FATAL) << "IndirectRefKind[" << kind << "]";
   2318     UNREACHABLE();
   2319   }
   2320 
   2321  private:
   2322   static jint EnsureLocalCapacityInternal(ScopedObjectAccess& soa, jint desired_capacity,
   2323                                           const char* caller)
   2324       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
   2325     // TODO: we should try to expand the table if necessary.
   2326     if (desired_capacity < 0 || desired_capacity > static_cast<jint>(kLocalsMax)) {
   2327       LOG(ERROR) << "Invalid capacity given to " << caller << ": " << desired_capacity;
   2328       return JNI_ERR;
   2329     }
   2330     // TODO: this isn't quite right, since "capacity" includes holes.
   2331     const size_t capacity = soa.Env()->locals.Capacity();
   2332     bool okay = (static_cast<jint>(kLocalsMax - capacity) >= desired_capacity);
   2333     if (!okay) {
   2334       soa.Self()->ThrowOutOfMemoryError(caller);
   2335     }
   2336     return okay ? JNI_OK : JNI_ERR;
   2337   }
   2338 
   2339   template<typename JniT, typename ArtT>
   2340   static JniT NewPrimitiveArray(JNIEnv* env, jsize length) {
   2341     ScopedObjectAccess soa(env);
   2342     if (UNLIKELY(length < 0)) {
   2343       soa.Vm()->JniAbortF("NewPrimitiveArray", "negative array length: %d", length);
   2344       return nullptr;
   2345     }
   2346     ArtT* result = ArtT::Alloc(soa.Self(), length);
   2347     return soa.AddLocalReference<JniT>(result);
   2348   }
   2349 
   2350   template <typename JArrayT, typename ElementT, typename ArtArrayT>
   2351   static ArtArrayT* DecodeAndCheckArrayType(ScopedObjectAccess& soa, JArrayT java_array,
   2352                                            const char* fn_name, const char* operation)
   2353       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
   2354     ArtArrayT* array = soa.Decode<ArtArrayT*>(java_array);
   2355     if (UNLIKELY(ArtArrayT::GetArrayClass() != array->GetClass())) {
   2356       soa.Vm()->JniAbortF(fn_name,
   2357                           "attempt to %s %s primitive array elements with an object of type %s",
   2358                           operation,
   2359                           PrettyDescriptor(ArtArrayT::GetArrayClass()->GetComponentType()).c_str(),
   2360                           PrettyDescriptor(array->GetClass()).c_str());
   2361       return nullptr;
   2362     }
   2363     DCHECK_EQ(sizeof(ElementT), array->GetClass()->GetComponentSize());
   2364     return array;
   2365   }
   2366 
   2367   template <typename ArrayT, typename ElementT, typename ArtArrayT>
   2368   static ElementT* GetPrimitiveArray(JNIEnv* env, ArrayT java_array, jboolean* is_copy) {
   2369     CHECK_NON_NULL_ARGUMENT(java_array);
   2370     ScopedObjectAccess soa(env);
   2371     ArtArrayT* array = DecodeAndCheckArrayType<ArrayT, ElementT, ArtArrayT>(soa, java_array,
   2372                                                                             "GetArrayElements",
   2373                                                                             "get");
   2374     if (UNLIKELY(array == nullptr)) {
   2375       return nullptr;
   2376     }
   2377     // Only make a copy if necessary.
   2378     if (Runtime::Current()->GetHeap()->IsMovableObject(array)) {
   2379       if (is_copy != nullptr) {
   2380         *is_copy = JNI_TRUE;
   2381       }
   2382       const size_t component_size = sizeof(ElementT);
   2383       size_t size = array->GetLength() * component_size;
   2384       void* data = new uint64_t[RoundUp(size, 8) / 8];
   2385       memcpy(data, array->GetData(), size);
   2386       return reinterpret_cast<ElementT*>(data);
   2387     } else {
   2388       if (is_copy != nullptr) {
   2389         *is_copy = JNI_FALSE;
   2390       }
   2391       return reinterpret_cast<ElementT*>(array->GetData());
   2392     }
   2393   }
   2394 
   2395   template <typename ArrayT, typename ElementT, typename ArtArrayT>
   2396   static void ReleasePrimitiveArray(JNIEnv* env, ArrayT java_array, ElementT* elements, jint mode) {
   2397     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(java_array);
   2398     ScopedObjectAccess soa(env);
   2399     ArtArrayT* array = DecodeAndCheckArrayType<ArrayT, ElementT, ArtArrayT>(soa, java_array,
   2400                                                                             "ReleaseArrayElements",
   2401                                                                             "release");
   2402     if (array == nullptr) {
   2403       return;
   2404     }
   2405     ReleasePrimitiveArray(soa, array, sizeof(ElementT), elements, mode);
   2406   }
   2407 
   2408   static void ReleasePrimitiveArray(ScopedObjectAccess& soa, mirror::Array* array,
   2409                                     size_t component_size, void* elements, jint mode)
   2410       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
   2411     void* array_data = array->GetRawData(component_size, 0);
   2412     gc::Heap* heap = Runtime::Current()->GetHeap();
   2413     bool is_copy = array_data != elements;
   2414     size_t bytes = array->GetLength() * component_size;
   2415     VLOG(heap) << "Release primitive array " << soa.Env() << " array_data " << array_data
   2416                << " elements " << elements;
   2417     if (is_copy) {
   2418       // Sanity check: If elements is not the same as the java array's data, it better not be a
   2419       // heap address. TODO: This might be slow to check, may be worth keeping track of which
   2420       // copies we make?
   2421       if (heap->IsNonDiscontinuousSpaceHeapAddress(reinterpret_cast<mirror::Object*>(elements))) {
   2422         soa.Vm()->JniAbortF("ReleaseArrayElements",
   2423                             "invalid element pointer %p, array elements are %p",
   2424                             reinterpret_cast<void*>(elements), array_data);
   2425         return;
   2426       }
   2427       if (mode != JNI_ABORT) {
   2428         memcpy(array_data, elements, bytes);
   2429       } else if (kWarnJniAbort && memcmp(array_data, elements, bytes) != 0) {
   2430         // Warn if we have JNI_ABORT and the arrays don't match since this is usually an error.
   2431         LOG(WARNING) << "Possible incorrect JNI_ABORT in Release*ArrayElements";
   2432         soa.Self()->DumpJavaStack(LOG(WARNING));
   2433       }
   2434     }
   2435     if (mode != JNI_COMMIT) {
   2436       if (is_copy) {
   2437         delete[] reinterpret_cast<uint64_t*>(elements);
   2438       } else if (heap->IsMovableObject(array)) {
   2439         // Non copy to a movable object must means that we had disabled the moving GC.
   2440         heap->DecrementDisableMovingGC(soa.Self());
   2441       }
   2442     }
   2443   }
   2444 
   2445   template <typename JArrayT, typename ElementT, typename ArtArrayT>
   2446   static void GetPrimitiveArrayRegion(JNIEnv* env, JArrayT java_array,
   2447                                       jsize start, jsize length, ElementT* buf) {
   2448     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(java_array);
   2449     ScopedObjectAccess soa(env);
   2450     ArtArrayT* array =
   2451         DecodeAndCheckArrayType<JArrayT, ElementT, ArtArrayT>(soa, java_array,
   2452                                                               "GetPrimitiveArrayRegion",
   2453                                                               "get region of");
   2454     if (array != nullptr) {
   2455       if (start < 0 || length < 0 || start + length > array->GetLength()) {
   2456         ThrowAIOOBE(soa, array, start, length, "src");
   2457       } else {
   2458         CHECK_NON_NULL_MEMCPY_ARGUMENT(length, buf);
   2459         ElementT* data = array->GetData();
   2460         memcpy(buf, data + start, length * sizeof(ElementT));
   2461       }
   2462     }
   2463   }
   2464 
   2465   template <typename JArrayT, typename ElementT, typename ArtArrayT>
   2466   static void SetPrimitiveArrayRegion(JNIEnv* env, JArrayT java_array,
   2467                                       jsize start, jsize length, const ElementT* buf) {
   2468     CHECK_NON_NULL_ARGUMENT_RETURN_VOID(java_array);
   2469     ScopedObjectAccess soa(env);
   2470     ArtArrayT* array =
   2471         DecodeAndCheckArrayType<JArrayT, ElementT, ArtArrayT>(soa, java_array,
   2472                                                               "SetPrimitiveArrayRegion",
   2473                                                               "set region of");
   2474     if (array != nullptr) {
   2475       if (start < 0 || length < 0 || start + length > array->GetLength()) {
   2476         ThrowAIOOBE(soa, array, start, length, "dst");
   2477       } else {
   2478         CHECK_NON_NULL_MEMCPY_ARGUMENT(length, buf);
   2479         ElementT* data = array->GetData();
   2480         memcpy(data + start, buf, length * sizeof(ElementT));
   2481       }
   2482     }
   2483   }
   2484 };
   2485 
   2486 const JNINativeInterface gJniNativeInterface = {
   2487   nullptr,  // reserved0.
   2488   nullptr,  // reserved1.
   2489   nullptr,  // reserved2.
   2490   nullptr,  // reserved3.
   2491   JNI::GetVersion,
   2492   JNI::DefineClass,
   2493   JNI::FindClass,
   2494   JNI::FromReflectedMethod,
   2495   JNI::FromReflectedField,
   2496   JNI::ToReflectedMethod,
   2497   JNI::GetSuperclass,
   2498   JNI::IsAssignableFrom,
   2499   JNI::ToReflectedField,
   2500   JNI::Throw,
   2501   JNI::ThrowNew,
   2502   JNI::ExceptionOccurred,
   2503   JNI::ExceptionDescribe,
   2504   JNI::ExceptionClear,
   2505   JNI::FatalError,
   2506   JNI::PushLocalFrame,
   2507   JNI::PopLocalFrame,
   2508   JNI::NewGlobalRef,
   2509   JNI::DeleteGlobalRef,
   2510   JNI::DeleteLocalRef,
   2511   JNI::IsSameObject,
   2512   JNI::NewLocalRef,
   2513   JNI::EnsureLocalCapacity,
   2514   JNI::AllocObject,
   2515   JNI::NewObject,
   2516   JNI::NewObjectV,
   2517   JNI::NewObjectA,
   2518   JNI::GetObjectClass,
   2519   JNI::IsInstanceOf,
   2520   JNI::GetMethodID,
   2521   JNI::CallObjectMethod,
   2522   JNI::CallObjectMethodV,
   2523   JNI::CallObjectMethodA,
   2524   JNI::CallBooleanMethod,
   2525   JNI::CallBooleanMethodV,
   2526   JNI::CallBooleanMethodA,
   2527   JNI::CallByteMethod,
   2528   JNI::CallByteMethodV,
   2529   JNI::CallByteMethodA,
   2530   JNI::CallCharMethod,
   2531   JNI::CallCharMethodV,
   2532   JNI::CallCharMethodA,
   2533   JNI::CallShortMethod,
   2534   JNI::CallShortMethodV,
   2535   JNI::CallShortMethodA,
   2536   JNI::CallIntMethod,
   2537   JNI::CallIntMethodV,
   2538   JNI::CallIntMethodA,
   2539   JNI::CallLongMethod,
   2540   JNI::CallLongMethodV,
   2541   JNI::CallLongMethodA,
   2542   JNI::CallFloatMethod,
   2543   JNI::CallFloatMethodV,
   2544   JNI::CallFloatMethodA,
   2545   JNI::CallDoubleMethod,
   2546   JNI::CallDoubleMethodV,
   2547   JNI::CallDoubleMethodA,
   2548   JNI::CallVoidMethod,
   2549   JNI::CallVoidMethodV,
   2550   JNI::CallVoidMethodA,
   2551   JNI::CallNonvirtualObjectMethod,
   2552   JNI::CallNonvirtualObjectMethodV,
   2553   JNI::CallNonvirtualObjectMethodA,
   2554   JNI::CallNonvirtualBooleanMethod,
   2555   JNI::CallNonvirtualBooleanMethodV,
   2556   JNI::CallNonvirtualBooleanMethodA,
   2557   JNI::CallNonvirtualByteMethod,
   2558   JNI::CallNonvirtualByteMethodV,
   2559   JNI::CallNonvirtualByteMethodA,
   2560   JNI::CallNonvirtualCharMethod,
   2561   JNI::CallNonvirtualCharMethodV,
   2562   JNI::CallNonvirtualCharMethodA,
   2563   JNI::CallNonvirtualShortMethod,
   2564   JNI::CallNonvirtualShortMethodV,
   2565   JNI::CallNonvirtualShortMethodA,
   2566   JNI::CallNonvirtualIntMethod,
   2567   JNI::CallNonvirtualIntMethodV,
   2568   JNI::CallNonvirtualIntMethodA,
   2569   JNI::CallNonvirtualLongMethod,
   2570   JNI::CallNonvirtualLongMethodV,
   2571   JNI::CallNonvirtualLongMethodA,
   2572   JNI::CallNonvirtualFloatMethod,
   2573   JNI::CallNonvirtualFloatMethodV,
   2574   JNI::CallNonvirtualFloatMethodA,
   2575   JNI::CallNonvirtualDoubleMethod,
   2576   JNI::CallNonvirtualDoubleMethodV,
   2577   JNI::CallNonvirtualDoubleMethodA,
   2578   JNI::CallNonvirtualVoidMethod,
   2579   JNI::CallNonvirtualVoidMethodV,
   2580   JNI::CallNonvirtualVoidMethodA,
   2581   JNI::GetFieldID,
   2582   JNI::GetObjectField,
   2583   JNI::GetBooleanField,
   2584   JNI::GetByteField,
   2585   JNI::GetCharField,
   2586   JNI::GetShortField,
   2587   JNI::GetIntField,
   2588   JNI::GetLongField,
   2589   JNI::GetFloatField,
   2590   JNI::GetDoubleField,
   2591   JNI::SetObjectField,
   2592   JNI::SetBooleanField,
   2593   JNI::SetByteField,
   2594   JNI::SetCharField,
   2595   JNI::SetShortField,
   2596   JNI::SetIntField,
   2597   JNI::SetLongField,
   2598   JNI::SetFloatField,
   2599   JNI::SetDoubleField,
   2600   JNI::GetStaticMethodID,
   2601   JNI::CallStaticObjectMethod,
   2602   JNI::CallStaticObjectMethodV,
   2603   JNI::CallStaticObjectMethodA,
   2604   JNI::CallStaticBooleanMethod,
   2605   JNI::CallStaticBooleanMethodV,
   2606   JNI::CallStaticBooleanMethodA,
   2607   JNI::CallStaticByteMethod,
   2608   JNI::CallStaticByteMethodV,
   2609   JNI::CallStaticByteMethodA,
   2610   JNI::CallStaticCharMethod,
   2611   JNI::CallStaticCharMethodV,
   2612   JNI::CallStaticCharMethodA,
   2613   JNI::CallStaticShortMethod,
   2614   JNI::CallStaticShortMethodV,
   2615   JNI::CallStaticShortMethodA,
   2616   JNI::CallStaticIntMethod,
   2617   JNI::CallStaticIntMethodV,
   2618   JNI::CallStaticIntMethodA,
   2619   JNI::CallStaticLongMethod,
   2620   JNI::CallStaticLongMethodV,
   2621   JNI::CallStaticLongMethodA,
   2622   JNI::CallStaticFloatMethod,
   2623   JNI::CallStaticFloatMethodV,
   2624   JNI::CallStaticFloatMethodA,
   2625   JNI::CallStaticDoubleMethod,
   2626   JNI::CallStaticDoubleMethodV,
   2627   JNI::CallStaticDoubleMethodA,
   2628   JNI::CallStaticVoidMethod,
   2629   JNI::CallStaticVoidMethodV,
   2630   JNI::CallStaticVoidMethodA,
   2631   JNI::GetStaticFieldID,
   2632   JNI::GetStaticObjectField,
   2633   JNI::GetStaticBooleanField,
   2634   JNI::GetStaticByteField,
   2635   JNI::GetStaticCharField,
   2636   JNI::GetStaticShortField,
   2637   JNI::GetStaticIntField,
   2638   JNI::GetStaticLongField,
   2639   JNI::GetStaticFloatField,
   2640   JNI::GetStaticDoubleField,
   2641   JNI::SetStaticObjectField,
   2642   JNI::SetStaticBooleanField,
   2643   JNI::SetStaticByteField,
   2644   JNI::SetStaticCharField,
   2645   JNI::SetStaticShortField,
   2646   JNI::SetStaticIntField,
   2647   JNI::SetStaticLongField,
   2648   JNI::SetStaticFloatField,
   2649   JNI::SetStaticDoubleField,
   2650   JNI::NewString,
   2651   JNI::GetStringLength,
   2652   JNI::GetStringChars,
   2653   JNI::ReleaseStringChars,
   2654   JNI::NewStringUTF,
   2655   JNI::GetStringUTFLength,
   2656   JNI::GetStringUTFChars,
   2657   JNI::ReleaseStringUTFChars,
   2658   JNI::GetArrayLength,
   2659   JNI::NewObjectArray,
   2660   JNI::GetObjectArrayElement,
   2661   JNI::SetObjectArrayElement,
   2662   JNI::NewBooleanArray,
   2663   JNI::NewByteArray,
   2664   JNI::NewCharArray,
   2665   JNI::NewShortArray,
   2666   JNI::NewIntArray,
   2667   JNI::NewLongArray,
   2668   JNI::NewFloatArray,
   2669   JNI::NewDoubleArray,
   2670   JNI::GetBooleanArrayElements,
   2671   JNI::GetByteArrayElements,
   2672   JNI::GetCharArrayElements,
   2673   JNI::GetShortArrayElements,
   2674   JNI::GetIntArrayElements,
   2675   JNI::GetLongArrayElements,
   2676   JNI::GetFloatArrayElements,
   2677   JNI::GetDoubleArrayElements,
   2678   JNI::ReleaseBooleanArrayElements,
   2679   JNI::ReleaseByteArrayElements,
   2680   JNI::ReleaseCharArrayElements,
   2681   JNI::ReleaseShortArrayElements,
   2682   JNI::ReleaseIntArrayElements,
   2683   JNI::ReleaseLongArrayElements,
   2684   JNI::ReleaseFloatArrayElements,
   2685   JNI::ReleaseDoubleArrayElements,
   2686   JNI::GetBooleanArrayRegion,
   2687   JNI::GetByteArrayRegion,
   2688   JNI::GetCharArrayRegion,
   2689   JNI::GetShortArrayRegion,
   2690   JNI::GetIntArrayRegion,
   2691   JNI::GetLongArrayRegion,
   2692   JNI::GetFloatArrayRegion,
   2693   JNI::GetDoubleArrayRegion,
   2694   JNI::SetBooleanArrayRegion,
   2695   JNI::SetByteArrayRegion,
   2696   JNI::SetCharArrayRegion,
   2697   JNI::SetShortArrayRegion,
   2698   JNI::SetIntArrayRegion,
   2699   JNI::SetLongArrayRegion,
   2700   JNI::SetFloatArrayRegion,
   2701   JNI::SetDoubleArrayRegion,
   2702   JNI::RegisterNatives,
   2703   JNI::UnregisterNatives,
   2704   JNI::MonitorEnter,
   2705   JNI::MonitorExit,
   2706   JNI::GetJavaVM,
   2707   JNI::GetStringRegion,
   2708   JNI::GetStringUTFRegion,
   2709   JNI::GetPrimitiveArrayCritical,
   2710   JNI::ReleasePrimitiveArrayCritical,
   2711   JNI::GetStringCritical,
   2712   JNI::ReleaseStringCritical,
   2713   JNI::NewWeakGlobalRef,
   2714   JNI::DeleteWeakGlobalRef,
   2715   JNI::ExceptionCheck,
   2716   JNI::NewDirectByteBuffer,
   2717   JNI::GetDirectBufferAddress,
   2718   JNI::GetDirectBufferCapacity,
   2719   JNI::GetObjectRefType,
   2720 };
   2721 
   2722 const JNINativeInterface* GetJniNativeInterface() {
   2723   return &gJniNativeInterface;
   2724 }
   2725 
   2726 void RegisterNativeMethods(JNIEnv* env, const char* jni_class_name, const JNINativeMethod* methods,
   2727                            jint method_count) {
   2728   ScopedLocalRef<jclass> c(env, env->FindClass(jni_class_name));
   2729   if (c.get() == nullptr) {
   2730     LOG(FATAL) << "Couldn't find class: " << jni_class_name;
   2731   }
   2732   JNI::RegisterNativeMethods(env, c.get(), methods, method_count, false);
   2733 }
   2734 
   2735 }  // namespace art
   2736 
   2737 std::ostream& operator<<(std::ostream& os, const jobjectRefType& rhs) {
   2738   switch (rhs) {
   2739   case JNIInvalidRefType:
   2740     os << "JNIInvalidRefType";
   2741     return os;
   2742   case JNILocalRefType:
   2743     os << "JNILocalRefType";
   2744     return os;
   2745   case JNIGlobalRefType:
   2746     os << "JNIGlobalRefType";
   2747     return os;
   2748   case JNIWeakGlobalRefType:
   2749     os << "JNIWeakGlobalRefType";
   2750     return os;
   2751   default:
   2752     LOG(::art::FATAL) << "jobjectRefType[" << static_cast<int>(rhs) << "]";
   2753     UNREACHABLE();
   2754   }
   2755 }
   2756