Refactor reflective method invocation.

Move invocation code out of JNI internal into reflection, including ArgArray
code. Make reflective invocation use the ArgArray to build arguments rather
than allocating a jvalue[] and unboxing arguments into that.
Move reflection part of jni_internal_test into reflection_test.
Make greater use of fast JNI.

Change-Id: Ib381372df5f9a83679e30e7275de24fa0e6b1057
diff --git a/runtime/jni_internal_test.cc b/runtime/jni_internal_test.cc
index 28408d2..7b29a9c 100644
--- a/runtime/jni_internal_test.cc
+++ b/runtime/jni_internal_test.cc
@@ -21,7 +21,6 @@
 #include <cmath>
 
 #include "common_compiler_test.h"
-#include "invoke_arg_array_builder.h"
 #include "mirror/art_method-inl.h"
 #include "mirror/class-inl.h"
 #include "mirror/object_array-inl.h"
@@ -74,7 +73,7 @@
     }
   }
 
-  virtual void TearDown() {
+  virtual void TearDown() OVERRIDE {
     CleanUpJniEnv();
     CommonCompilerTest::TearDown();
   }
@@ -86,676 +85,6 @@
     return soa.AddLocalReference<jclass>(c);
   }
 
-  void JniInternalTestMakeExecutable(mirror::ArtMethod** method,
-                                     mirror::Object** receiver,
-                                     bool is_static, const char* method_name,
-                                     const char* method_signature)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
-    const char* class_name = is_static ? "StaticLeafMethods" : "NonStaticLeafMethods";
-    jobject jclass_loader(LoadDex(class_name));
-    Thread* self = Thread::Current();
-    SirtRef<mirror::ClassLoader> null_class_loader(self, nullptr);
-    SirtRef<mirror::ClassLoader>
-        class_loader(self,
-                     ScopedObjectAccessUnchecked(self).Decode<mirror::ClassLoader*>(jclass_loader));
-    if (is_static) {
-      MakeExecutable(ScopedObjectAccessUnchecked(self).Decode<mirror::ClassLoader*>(jclass_loader),
-                     class_name);
-    } else {
-      MakeExecutable(nullptr, "java.lang.Class");
-      MakeExecutable(nullptr, "java.lang.Object");
-      MakeExecutable(ScopedObjectAccessUnchecked(self).Decode<mirror::ClassLoader*>(jclass_loader),
-                     class_name);
-    }
-
-    mirror::Class* c = class_linker_->FindClass(self, DotToDescriptor(class_name).c_str(),
-                                                class_loader);
-    CHECK(c != NULL);
-
-    *method = is_static ? c->FindDirectMethod(method_name, method_signature)
-                        : c->FindVirtualMethod(method_name, method_signature);
-    CHECK(method != nullptr);
-
-    *receiver = (is_static ? nullptr : c->AllocObject(self));
-
-    // Start runtime.
-    bool started = runtime_->Start();
-    CHECK(started);
-    self->TransitionFromSuspendedToRunnable();
-  }
-
-  void InvokeNopMethod(bool is_static) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
-    mirror::ArtMethod* method;
-    mirror::Object* receiver;
-    JniInternalTestMakeExecutable(&method, &receiver, is_static, "nop", "()V");
-
-    ArgArray arg_array("V", 1);
-    JValue result;
-
-    if (!is_static) {
-      arg_array.Append(receiver);
-    }
-
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "V");
-  }
-
-  void InvokeIdentityByteMethod(bool is_static)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
-    mirror::ArtMethod* method;
-    mirror::Object* receiver;
-    JniInternalTestMakeExecutable(&method, &receiver, is_static, "identity", "(B)B");
-
-    ArgArray arg_array("BB", 2);
-    uint32_t* args = arg_array.GetArray();
-    JValue result;
-
-    if (!is_static) {
-      arg_array.Append(receiver);
-      args++;
-    }
-
-    arg_array.Append(0U);
-    result.SetB(-1);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "BB");
-    EXPECT_EQ(0, result.GetB());
-
-    args[0] = -1;
-    result.SetB(0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "BB");
-    EXPECT_EQ(-1, result.GetB());
-
-    args[0] = SCHAR_MAX;
-    result.SetB(0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "BB");
-    EXPECT_EQ(SCHAR_MAX, result.GetB());
-
-    args[0] = (SCHAR_MIN << 24) >> 24;
-    result.SetB(0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "BB");
-    EXPECT_EQ(SCHAR_MIN, result.GetB());
-  }
-
-  void InvokeIdentityIntMethod(bool is_static)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
-    mirror::ArtMethod* method;
-    mirror::Object* receiver;
-    JniInternalTestMakeExecutable(&method, &receiver, is_static, "identity", "(I)I");
-
-    ArgArray arg_array("II", 2);
-    uint32_t* args = arg_array.GetArray();
-    JValue result;
-
-    if (!is_static) {
-      arg_array.Append(receiver);
-      args++;
-    }
-
-    arg_array.Append(0U);
-    result.SetI(-1);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "II");
-    EXPECT_EQ(0, result.GetI());
-
-    args[0] = -1;
-    result.SetI(0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "II");
-    EXPECT_EQ(-1, result.GetI());
-
-    args[0] = INT_MAX;
-    result.SetI(0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "II");
-    EXPECT_EQ(INT_MAX, result.GetI());
-
-    args[0] = INT_MIN;
-    result.SetI(0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "II");
-    EXPECT_EQ(INT_MIN, result.GetI());
-  }
-
-  void InvokeIdentityDoubleMethod(bool is_static)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
-    mirror::ArtMethod* method;
-    mirror::Object* receiver;
-    JniInternalTestMakeExecutable(&method, &receiver, is_static, "identity", "(D)D");
-
-    ArgArray arg_array("DD", 2);
-    uint32_t* args = arg_array.GetArray();
-    JValue value;
-    JValue result;
-
-    if (!is_static) {
-      arg_array.Append(receiver);
-      args++;
-    }
-
-    value.SetD(0.0);
-    arg_array.AppendWide(value.GetJ());
-    result.SetD(-1.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "DD");
-    EXPECT_EQ(0.0, result.GetD());
-
-    value.SetD(-1.0);
-    args[0] = value.GetJ();
-    args[1] = value.GetJ() >> 32;
-    result.SetD(0.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "DD");
-    EXPECT_EQ(-1.0, result.GetD());
-
-    value.SetD(DBL_MAX);
-    args[0] = value.GetJ();
-    args[1] = value.GetJ() >> 32;
-    result.SetD(0.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "DD");
-    EXPECT_EQ(DBL_MAX, result.GetD());
-
-    value.SetD(DBL_MIN);
-    args[0] = value.GetJ();
-    args[1] = value.GetJ() >> 32;
-    result.SetD(0.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "DD");
-    EXPECT_EQ(DBL_MIN, result.GetD());
-  }
-
-  void InvokeSumIntIntMethod(bool is_static)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
-    mirror::ArtMethod* method;
-    mirror::Object* receiver;
-    JniInternalTestMakeExecutable(&method, &receiver, is_static, "sum", "(II)I");
-
-    ArgArray arg_array("III", 3);
-    uint32_t* args = arg_array.GetArray();
-    JValue result;
-
-    if (!is_static) {
-      arg_array.Append(receiver);
-      args++;
-    }
-
-    arg_array.Append(0U);
-    arg_array.Append(0U);
-    result.SetI(-1);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "III");
-    EXPECT_EQ(0, result.GetI());
-
-    args[0] = 1;
-    args[1] = 2;
-    result.SetI(0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "III");
-    EXPECT_EQ(3, result.GetI());
-
-    args[0] = -2;
-    args[1] = 5;
-    result.SetI(0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "III");
-    EXPECT_EQ(3, result.GetI());
-
-    args[0] = INT_MAX;
-    args[1] = INT_MIN;
-    result.SetI(1234);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "III");
-    EXPECT_EQ(-1, result.GetI());
-
-    args[0] = INT_MAX;
-    args[1] = INT_MAX;
-    result.SetI(INT_MIN);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "III");
-    EXPECT_EQ(-2, result.GetI());
-  }
-
-  void InvokeSumIntIntIntMethod(bool is_static)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
-    mirror::ArtMethod* method;
-    mirror::Object* receiver;
-    JniInternalTestMakeExecutable(&method, &receiver, is_static, "sum", "(III)I");
-
-    ArgArray arg_array("IIII", 4);
-    uint32_t* args = arg_array.GetArray();
-    JValue result;
-
-    if (!is_static) {
-      arg_array.Append(receiver);
-      args++;
-    }
-
-    arg_array.Append(0U);
-    arg_array.Append(0U);
-    arg_array.Append(0U);
-    result.SetI(-1);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "IIII");
-    EXPECT_EQ(0, result.GetI());
-
-    args[0] = 1;
-    args[1] = 2;
-    args[2] = 3;
-    result.SetI(0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "IIII");
-    EXPECT_EQ(6, result.GetI());
-
-    args[0] = -1;
-    args[1] = 2;
-    args[2] = -3;
-    result.SetI(0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "IIII");
-    EXPECT_EQ(-2, result.GetI());
-
-    args[0] = INT_MAX;
-    args[1] = INT_MIN;
-    args[2] = INT_MAX;
-    result.SetI(1234);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "IIII");
-    EXPECT_EQ(2147483646, result.GetI());
-
-    args[0] = INT_MAX;
-    args[1] = INT_MAX;
-    args[2] = INT_MAX;
-    result.SetI(INT_MIN);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "IIII");
-    EXPECT_EQ(2147483645, result.GetI());
-  }
-
-  void InvokeSumIntIntIntIntMethod(bool is_static)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
-    mirror::ArtMethod* method;
-    mirror::Object* receiver;
-    JniInternalTestMakeExecutable(&method, &receiver, is_static, "sum", "(IIII)I");
-
-    ArgArray arg_array("IIIII", 5);
-    uint32_t* args = arg_array.GetArray();
-    JValue result;
-
-    if (!is_static) {
-      arg_array.Append(receiver);
-      args++;
-    }
-
-    arg_array.Append(0U);
-    arg_array.Append(0U);
-    arg_array.Append(0U);
-    arg_array.Append(0U);
-    result.SetI(-1);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "IIIII");
-    EXPECT_EQ(0, result.GetI());
-
-    args[0] = 1;
-    args[1] = 2;
-    args[2] = 3;
-    args[3] = 4;
-    result.SetI(0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "IIIII");
-    EXPECT_EQ(10, result.GetI());
-
-    args[0] = -1;
-    args[1] = 2;
-    args[2] = -3;
-    args[3] = 4;
-    result.SetI(0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "IIIII");
-    EXPECT_EQ(2, result.GetI());
-
-    args[0] = INT_MAX;
-    args[1] = INT_MIN;
-    args[2] = INT_MAX;
-    args[3] = INT_MIN;
-    result.SetI(1234);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "IIIII");
-    EXPECT_EQ(-2, result.GetI());
-
-    args[0] = INT_MAX;
-    args[1] = INT_MAX;
-    args[2] = INT_MAX;
-    args[3] = INT_MAX;
-    result.SetI(INT_MIN);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "IIIII");
-    EXPECT_EQ(-4, result.GetI());
-  }
-
-  void InvokeSumIntIntIntIntIntMethod(bool is_static)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
-    mirror::ArtMethod* method;
-    mirror::Object* receiver;
-    JniInternalTestMakeExecutable(&method, &receiver, is_static, "sum", "(IIIII)I");
-
-    ArgArray arg_array("IIIIII", 6);
-    uint32_t* args = arg_array.GetArray();
-    JValue result;
-
-    if (!is_static) {
-      arg_array.Append(receiver);
-      args++;
-    }
-
-    arg_array.Append(0U);
-    arg_array.Append(0U);
-    arg_array.Append(0U);
-    arg_array.Append(0U);
-    arg_array.Append(0U);
-    result.SetI(-1.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "IIIIII");
-    EXPECT_EQ(0, result.GetI());
-
-    args[0] = 1;
-    args[1] = 2;
-    args[2] = 3;
-    args[3] = 4;
-    args[4] = 5;
-    result.SetI(0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "IIIIII");
-    EXPECT_EQ(15, result.GetI());
-
-    args[0] = -1;
-    args[1] = 2;
-    args[2] = -3;
-    args[3] = 4;
-    args[4] = -5;
-    result.SetI(0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "IIIIII");
-    EXPECT_EQ(-3, result.GetI());
-
-    args[0] = INT_MAX;
-    args[1] = INT_MIN;
-    args[2] = INT_MAX;
-    args[3] = INT_MIN;
-    args[4] = INT_MAX;
-    result.SetI(1234);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "IIIIII");
-    EXPECT_EQ(2147483645, result.GetI());
-
-    args[0] = INT_MAX;
-    args[1] = INT_MAX;
-    args[2] = INT_MAX;
-    args[3] = INT_MAX;
-    args[4] = INT_MAX;
-    result.SetI(INT_MIN);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "IIIIII");
-    EXPECT_EQ(2147483643, result.GetI());
-  }
-
-  void InvokeSumDoubleDoubleMethod(bool is_static)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
-    mirror::ArtMethod* method;
-    mirror::Object* receiver;
-    JniInternalTestMakeExecutable(&method, &receiver, is_static, "sum", "(DD)D");
-
-    ArgArray arg_array("DDD", 3);
-    uint32_t* args = arg_array.GetArray();
-    JValue value;
-    JValue value2;
-    JValue result;
-
-    if (!is_static) {
-      arg_array.Append(receiver);
-      args++;
-    }
-
-    value.SetD(0.0);
-    value2.SetD(0.0);
-    arg_array.AppendWide(value.GetJ());
-    arg_array.AppendWide(value2.GetJ());
-    result.SetD(-1.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "DDD");
-    EXPECT_EQ(0.0, result.GetD());
-
-    value.SetD(1.0);
-    value2.SetD(2.0);
-    args[0] = value.GetJ();
-    args[1] = value.GetJ() >> 32;
-    args[2] = value2.GetJ();
-    args[3] = value2.GetJ() >> 32;
-    result.SetD(0.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "DDD");
-    EXPECT_EQ(3.0, result.GetD());
-
-    value.SetD(1.0);
-    value2.SetD(-2.0);
-    args[0] = value.GetJ();
-    args[1] = value.GetJ() >> 32;
-    args[2] = value2.GetJ();
-    args[3] = value2.GetJ() >> 32;
-    result.SetD(0.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "DDD");
-    EXPECT_EQ(-1.0, result.GetD());
-
-    value.SetD(DBL_MAX);
-    value2.SetD(DBL_MIN);
-    args[0] = value.GetJ();
-    args[1] = value.GetJ() >> 32;
-    args[2] = value2.GetJ();
-    args[3] = value2.GetJ() >> 32;
-    result.SetD(0.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "DDD");
-    EXPECT_EQ(1.7976931348623157e308, result.GetD());
-
-    value.SetD(DBL_MAX);
-    value2.SetD(DBL_MAX);
-    args[0] = value.GetJ();
-    args[1] = value.GetJ() >> 32;
-    args[2] = value2.GetJ();
-    args[3] = value2.GetJ() >> 32;
-    result.SetD(0.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "DDD");
-    EXPECT_EQ(INFINITY, result.GetD());
-  }
-
-  void InvokeSumDoubleDoubleDoubleMethod(bool is_static)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
-    mirror::ArtMethod* method;
-    mirror::Object* receiver;
-    JniInternalTestMakeExecutable(&method, &receiver, is_static, "sum", "(DDD)D");
-
-    ArgArray arg_array("DDDD", 4);
-    uint32_t* args = arg_array.GetArray();
-    JValue value;
-    JValue value2;
-    JValue value3;
-    JValue result;
-
-    if (!is_static) {
-      arg_array.Append(receiver);
-      args++;
-    }
-
-    value.SetD(0.0);
-    value2.SetD(0.0);
-    value3.SetD(0.0);
-    arg_array.AppendWide(value.GetJ());
-    arg_array.AppendWide(value2.GetJ());
-    arg_array.AppendWide(value3.GetJ());
-    result.SetD(-1.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "DDDD");
-    EXPECT_EQ(0.0, result.GetD());
-
-    value.SetD(1.0);
-    value2.SetD(2.0);
-    value3.SetD(3.0);
-    args[0] = value.GetJ();
-    args[1] = value.GetJ() >> 32;
-    args[2] = value2.GetJ();
-    args[3] = value2.GetJ() >> 32;
-    args[4] = value3.GetJ();
-    args[5] = value3.GetJ() >> 32;
-    result.SetD(0.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "DDDD");
-    EXPECT_EQ(6.0, result.GetD());
-
-    value.SetD(1.0);
-    value2.SetD(-2.0);
-    value3.SetD(3.0);
-    args[0] = value.GetJ();
-    args[1] = value.GetJ() >> 32;
-    args[2] = value2.GetJ();
-    args[3] = value2.GetJ() >> 32;
-    args[4] = value3.GetJ();
-    args[5] = value3.GetJ() >> 32;
-    result.SetD(0.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "DDDD");
-    EXPECT_EQ(2.0, result.GetD());
-  }
-
-  void InvokeSumDoubleDoubleDoubleDoubleMethod(bool is_static)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
-    mirror::ArtMethod* method;
-    mirror::Object* receiver;
-    JniInternalTestMakeExecutable(&method, &receiver, is_static, "sum", "(DDDD)D");
-
-    ArgArray arg_array("DDDDD", 5);
-    uint32_t* args = arg_array.GetArray();
-    JValue value;
-    JValue value2;
-    JValue value3;
-    JValue value4;
-    JValue result;
-
-    if (!is_static) {
-      arg_array.Append(receiver);
-      args++;
-    }
-
-    value.SetD(0.0);
-    value2.SetD(0.0);
-    value3.SetD(0.0);
-    value4.SetD(0.0);
-    arg_array.AppendWide(value.GetJ());
-    arg_array.AppendWide(value2.GetJ());
-    arg_array.AppendWide(value3.GetJ());
-    arg_array.AppendWide(value4.GetJ());
-    result.SetD(-1.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "DDDDD");
-    EXPECT_EQ(0.0, result.GetD());
-
-    value.SetD(1.0);
-    value2.SetD(2.0);
-    value3.SetD(3.0);
-    value4.SetD(4.0);
-    args[0] = value.GetJ();
-    args[1] = value.GetJ() >> 32;
-    args[2] = value2.GetJ();
-    args[3] = value2.GetJ() >> 32;
-    args[4] = value3.GetJ();
-    args[5] = value3.GetJ() >> 32;
-    args[6] = value4.GetJ();
-    args[7] = value4.GetJ() >> 32;
-    result.SetD(0.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "DDDDD");
-    EXPECT_EQ(10.0, result.GetD());
-
-    value.SetD(1.0);
-    value2.SetD(-2.0);
-    value3.SetD(3.0);
-    value4.SetD(-4.0);
-    args[0] = value.GetJ();
-    args[1] = value.GetJ() >> 32;
-    args[2] = value2.GetJ();
-    args[3] = value2.GetJ() >> 32;
-    args[4] = value3.GetJ();
-    args[5] = value3.GetJ() >> 32;
-    args[6] = value4.GetJ();
-    args[7] = value4.GetJ() >> 32;
-    result.SetD(0.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "DDDDD");
-    EXPECT_EQ(-2.0, result.GetD());
-  }
-
-  void InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(bool is_static)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
-    mirror::ArtMethod* method;
-    mirror::Object* receiver;
-    JniInternalTestMakeExecutable(&method, &receiver, is_static, "sum", "(DDDDD)D");
-
-    ArgArray arg_array("DDDDDD", 6);
-    uint32_t* args = arg_array.GetArray();
-    JValue value;
-    JValue value2;
-    JValue value3;
-    JValue value4;
-    JValue value5;
-    JValue result;
-
-    if (!is_static) {
-      arg_array.Append(receiver);
-      args++;
-    }
-
-    value.SetD(0.0);
-    value2.SetD(0.0);
-    value3.SetD(0.0);
-    value4.SetD(0.0);
-    value5.SetD(0.0);
-    arg_array.AppendWide(value.GetJ());
-    arg_array.AppendWide(value2.GetJ());
-    arg_array.AppendWide(value3.GetJ());
-    arg_array.AppendWide(value4.GetJ());
-    arg_array.AppendWide(value5.GetJ());
-    result.SetD(-1.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "DDDDDD");
-    EXPECT_EQ(0.0, result.GetD());
-
-    value.SetD(1.0);
-    value2.SetD(2.0);
-    value3.SetD(3.0);
-    value4.SetD(4.0);
-    value5.SetD(5.0);
-    args[0] = value.GetJ();
-    args[1] = value.GetJ() >> 32;
-    args[2] = value2.GetJ();
-    args[3] = value2.GetJ() >> 32;
-    args[4] = value3.GetJ();
-    args[5] = value3.GetJ() >> 32;
-    args[6] = value4.GetJ();
-    args[7] = value4.GetJ() >> 32;
-    args[8] = value5.GetJ();
-    args[9] = value5.GetJ() >> 32;
-    result.SetD(0.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "DDDDDD");
-    EXPECT_EQ(15.0, result.GetD());
-
-    value.SetD(1.0);
-    value2.SetD(-2.0);
-    value3.SetD(3.0);
-    value4.SetD(-4.0);
-    value5.SetD(5.0);
-    args[0] = value.GetJ();
-    args[1] = value.GetJ() >> 32;
-    args[2] = value2.GetJ();
-    args[3] = value2.GetJ() >> 32;
-    args[4] = value3.GetJ();
-    args[5] = value3.GetJ() >> 32;
-    args[6] = value4.GetJ();
-    args[7] = value4.GetJ() >> 32;
-    args[8] = value5.GetJ();
-    args[9] = value5.GetJ() >> 32;
-    result.SetD(0.0);
-    method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result,
-                   "DDDDDD");
-    EXPECT_EQ(3.0, result.GetD());
-  }
-
   JavaVMExt* vm_;
   JNIEnv* env_;
   jclass aioobe_;
@@ -1772,176 +1101,6 @@
   env_->DeleteWeakGlobalRef(o2);
 }
 
-TEST_F(JniInternalTest, StaticMainMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  jobject jclass_loader = LoadDex("Main");
-  SirtRef<mirror::ClassLoader>
-      class_loader(soa.Self(), soa.Decode<mirror::ClassLoader*>(jclass_loader));
-  CompileDirectMethod(class_loader, "Main", "main", "([Ljava/lang/String;)V");
-
-  mirror::Class* klass = class_linker_->FindClass(soa.Self(), "LMain;", class_loader);
-  ASSERT_TRUE(klass != NULL);
-
-  mirror::ArtMethod* method = klass->FindDirectMethod("main", "([Ljava/lang/String;)V");
-  ASSERT_TRUE(method != NULL);
-
-  ArgArray arg_array("VL", 2);
-  arg_array.Append(0U);
-  JValue result;
-
-  // Start runtime.
-  bool started = runtime_->Start();
-  CHECK(started);
-  Thread::Current()->TransitionFromSuspendedToRunnable();
-
-  method->Invoke(Thread::Current(), arg_array.GetArray(), arg_array.GetNumBytes(), &result, "VL");
-}
-
-TEST_F(JniInternalTest, StaticNopMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeNopMethod(true);
-}
-
-TEST_F(JniInternalTest, NonStaticNopMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeNopMethod(false);
-}
-
-TEST_F(JniInternalTest, StaticIdentityByteMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeIdentityByteMethod(true);
-}
-
-TEST_F(JniInternalTest, NonStaticIdentityByteMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeIdentityByteMethod(false);
-}
-
-TEST_F(JniInternalTest, StaticIdentityIntMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeIdentityIntMethod(true);
-}
-
-TEST_F(JniInternalTest, NonStaticIdentityIntMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeIdentityIntMethod(false);
-}
-
-TEST_F(JniInternalTest, StaticIdentityDoubleMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeIdentityDoubleMethod(true);
-}
-
-TEST_F(JniInternalTest, NonStaticIdentityDoubleMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeIdentityDoubleMethod(false);
-}
-
-TEST_F(JniInternalTest, StaticSumIntIntMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumIntIntMethod(true);
-}
-
-TEST_F(JniInternalTest, NonStaticSumIntIntMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumIntIntMethod(false);
-}
-
-TEST_F(JniInternalTest, StaticSumIntIntIntMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumIntIntIntMethod(true);
-}
-
-TEST_F(JniInternalTest, NonStaticSumIntIntIntMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumIntIntIntMethod(false);
-}
-
-TEST_F(JniInternalTest, StaticSumIntIntIntIntMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumIntIntIntIntMethod(true);
-}
-
-TEST_F(JniInternalTest, NonStaticSumIntIntIntIntMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumIntIntIntIntMethod(false);
-}
-
-TEST_F(JniInternalTest, StaticSumIntIntIntIntIntMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumIntIntIntIntIntMethod(true);
-}
-
-TEST_F(JniInternalTest, NonStaticSumIntIntIntIntIntMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumIntIntIntIntIntMethod(false);
-}
-
-TEST_F(JniInternalTest, StaticSumDoubleDoubleMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumDoubleDoubleMethod(true);
-}
-
-TEST_F(JniInternalTest, NonStaticSumDoubleDoubleMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumDoubleDoubleMethod(false);
-}
-
-TEST_F(JniInternalTest, StaticSumDoubleDoubleDoubleMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumDoubleDoubleDoubleMethod(true);
-}
-
-TEST_F(JniInternalTest, NonStaticSumDoubleDoubleDoubleMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumDoubleDoubleDoubleMethod(false);
-}
-
-TEST_F(JniInternalTest, StaticSumDoubleDoubleDoubleDoubleMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumDoubleDoubleDoubleDoubleMethod(true);
-}
-
-TEST_F(JniInternalTest, NonStaticSumDoubleDoubleDoubleDoubleMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumDoubleDoubleDoubleDoubleMethod(false);
-}
-
-TEST_F(JniInternalTest, StaticSumDoubleDoubleDoubleDoubleDoubleMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(true);
-}
-
-TEST_F(JniInternalTest, NonStaticSumDoubleDoubleDoubleDoubleDoubleMethod) {
-  TEST_DISABLED_FOR_PORTABLE();
-  ScopedObjectAccess soa(Thread::Current());
-  InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(false);
-}
-
 TEST_F(JniInternalTest, Throw) {
   EXPECT_EQ(JNI_ERR, env_->Throw(NULL));