blob: 3a51d87f6a1bc94686f4ced030eb643568e4558d [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
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 */
Ian Rogersb033c752011-07-20 12:22:35 -070016
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070017#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080018#include "common_compiler_test.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070019#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070020#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070021#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070022#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070023#include "mem_map.h"
Brian Carlstromea46f952013-07-30 01:26:50 -070024#include "mirror/art_method-inl.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070025#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080026#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080027#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070028#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080029#include "mirror/stack_trace_element.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070030#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070031#include "ScopedLocalRef.h"
32#include "scoped_thread_state_change.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070033#include "thread.h"
Elliott Hughesa168c832012-06-12 15:34:20 -070034#include "UniquePtr.h"
Ian Rogersb033c752011-07-20 12:22:35 -070035
Elliott Hughesb264f082012-04-06 17:10:10 -070036extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080037 return count + 1;
38}
39
Elliott Hughesb264f082012-04-06 17:10:10 -070040extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080041 return count + 1;
42}
43
Ian Rogersb033c752011-07-20 12:22:35 -070044namespace art {
45
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080046class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -070047 protected:
Ian Rogers00f7d0e2012-07-19 15:28:27 -070048 void CompileForTest(jobject class_loader, bool direct,
Brian Carlstrom40381fb2011-10-19 14:13:40 -070049 const char* method_name, const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070050 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartier590fee92013-09-13 13:46:47 -070051 SirtRef<mirror::ClassLoader> loader(soa.Self(), soa.Decode<mirror::ClassLoader*>(class_loader));
Brian Carlstrom25c33252011-09-18 15:58:35 -070052 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -080053 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Brian Carlstromea46f952013-07-30 01:26:50 -070054 mirror::ArtMethod* method;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070055 if (direct) {
buzbeec143c552011-08-20 17:38:58 -070056 method = c->FindDirectMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070057 } else {
buzbeec143c552011-08-20 17:38:58 -070058 method = c->FindVirtualMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070059 }
Brian Carlstromfc7120c2012-08-27 13:43:25 -070060 ASSERT_TRUE(method != NULL) << method_name << " " << method_sig;
Ian Rogersef7d42f2014-01-06 12:55:46 -080061 if (method->GetEntryPointFromQuickCompiledCode() == nullptr) {
62 ASSERT_TRUE(method->GetEntryPointFromPortableCompiledCode() == nullptr);
63 CompileMethod(method);
64 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
65 << method_name << " " << method_sig;
66 ASSERT_TRUE(method->GetEntryPointFromPortableCompiledCode() != nullptr)
67 << method_name << " " << method_sig;
Brian Carlstrom25c33252011-09-18 15:58:35 -070068 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070069 }
70
Ian Rogers00f7d0e2012-07-19 15:28:27 -070071 void SetUpForTest(bool direct, const char* method_name, const char* method_sig,
Brian Carlstrom25c33252011-09-18 15:58:35 -070072 void* native_fnptr) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070073 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -070074 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070075 {
76 ScopedObjectAccess soa(Thread::Current());
77 class_loader_ = LoadDex("MyClassNatives");
78 }
79 CompileForTest(class_loader_, direct, method_name, method_sig);
80 // Start runtime.
81 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -070082 bool started = runtime_->Start();
83 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -070084 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -070085 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -070086 env_ = Thread::Current()->GetJniEnv();
Elliott Hughesb264f082012-04-06 17:10:10 -070087 jklass_ = env_->FindClass("MyClassNatives");
Brian Carlstromfc7120c2012-08-27 13:43:25 -070088 ASSERT_TRUE(jklass_ != NULL) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070089
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070090 if (direct) {
91 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
92 } else {
93 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
94 }
Brian Carlstromfc7120c2012-08-27 13:43:25 -070095 ASSERT_TRUE(jmethod_ != NULL) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070096
Ian Rogersbdb03912011-09-14 00:55:44 -070097 if (native_fnptr != NULL) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -070098 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -070099 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
100 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700101 } else {
102 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700103 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700104
105 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
106 jobj_ = env_->NewObject(jklass_, constructor);
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700107 ASSERT_TRUE(jobj_ != NULL) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700108 }
109
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700110 public:
111 static jclass jklass_;
112 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700113 static jobject class_loader_;
114
Elliott Hughesa21039c2012-06-21 12:09:25 -0700115
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700116 protected:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700117 JNIEnv* env_;
118 jmethodID jmethod_;
Ian Rogersb033c752011-07-20 12:22:35 -0700119};
120
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700121jclass JniCompilerTest::jklass_;
122jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700123jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700124
Elliott Hughesb264f082012-04-06 17:10:10 -0700125int gJava_MyClassNatives_foo_calls = 0;
126void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700127 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700128 EXPECT_EQ(kNative, Thread::Current()->GetState());
129 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700130 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
131 EXPECT_TRUE(thisObj != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700132 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700133 gJava_MyClassNatives_foo_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800134 ScopedObjectAccess soa(Thread::Current());
135 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700136}
137
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700138TEST_F(JniCompilerTest, CompileAndRunNoArgMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800139 TEST_DISABLED_FOR_PORTABLE();
Ian Rogersef7d42f2014-01-06 12:55:46 -0800140 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700141
Elliott Hughesb264f082012-04-06 17:10:10 -0700142 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700143 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700144 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700145 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700146 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700147}
148
Shih-wei Liao31384c52011-09-06 15:27:45 -0700149TEST_F(JniCompilerTest, CompileAndRunIntMethodThroughStub) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800150 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700151 SetUpForTest(false, "bar", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700152 NULL /* calling through stub will link with &Java_MyClassNatives_bar */);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700153
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700154 ScopedObjectAccess soa(Thread::Current());
Shih-wei Liao31384c52011-09-06 15:27:45 -0700155 std::string reason;
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800156 SirtRef<mirror::ClassLoader> class_loader(soa.Self(),
157 soa.Decode<mirror::ClassLoader*>(class_loader_));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700158 ASSERT_TRUE(
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800159 Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader, &reason)) << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700160
161 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
162 EXPECT_EQ(25, result);
163}
164
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800165TEST_F(JniCompilerTest, CompileAndRunStaticIntMethodThroughStub) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800166 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700167 SetUpForTest(true, "sbar", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700168 NULL /* calling through stub will link with &Java_MyClassNatives_sbar */);
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800169
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700170 ScopedObjectAccess soa(Thread::Current());
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800171 std::string reason;
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800172 SirtRef<mirror::ClassLoader> class_loader(soa.Self(),
173 soa.Decode<mirror::ClassLoader*>(class_loader_));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700174 ASSERT_TRUE(
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800175 Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader, &reason)) << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800176
177 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
178 EXPECT_EQ(43, result);
179}
180
Elliott Hughesb264f082012-04-06 17:10:10 -0700181int gJava_MyClassNatives_fooI_calls = 0;
182jint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700183 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700184 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700185 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
186 EXPECT_TRUE(thisObj != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700187 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700188 gJava_MyClassNatives_fooI_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800189 ScopedObjectAccess soa(Thread::Current());
190 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700191 return x;
192}
193
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700194TEST_F(JniCompilerTest, CompileAndRunIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800195 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700196 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700197 reinterpret_cast<void*>(&Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700198
Elliott Hughesb264f082012-04-06 17:10:10 -0700199 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700200 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
201 EXPECT_EQ(42, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700202 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700203 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
204 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700205 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700206}
207
Elliott Hughesb264f082012-04-06 17:10:10 -0700208int gJava_MyClassNatives_fooII_calls = 0;
209jint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700210 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700211 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700212 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
213 EXPECT_TRUE(thisObj != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700214 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700215 gJava_MyClassNatives_fooII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800216 ScopedObjectAccess soa(Thread::Current());
217 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700218 return x - y; // non-commutative operator
219}
220
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700221TEST_F(JniCompilerTest, CompileAndRunIntIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800222 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700223 SetUpForTest(false, "fooII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700224 reinterpret_cast<void*>(&Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700225
Elliott Hughesb264f082012-04-06 17:10:10 -0700226 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700227 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
228 EXPECT_EQ(99 - 10, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700229 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700230 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
231 0xCAFED00D);
232 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700233 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700234}
235
Elliott Hughesb264f082012-04-06 17:10:10 -0700236int gJava_MyClassNatives_fooJJ_calls = 0;
237jlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700238 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700239 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers9b269d22011-09-04 14:06:05 -0700240 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
241 EXPECT_TRUE(thisObj != NULL);
242 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700243 gJava_MyClassNatives_fooJJ_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800244 ScopedObjectAccess soa(Thread::Current());
245 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers9b269d22011-09-04 14:06:05 -0700246 return x - y; // non-commutative operator
247}
248
249TEST_F(JniCompilerTest, CompileAndRunLongLongMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800250 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700251 SetUpForTest(false, "fooJJ", "(JJ)J",
Elliott Hughesb264f082012-04-06 17:10:10 -0700252 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700253
Elliott Hughesb264f082012-04-06 17:10:10 -0700254 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700255 jlong a = 0x1234567890ABCDEFll;
256 jlong b = 0xFEDCBA0987654321ll;
257 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
258 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700259 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700260 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
261 EXPECT_EQ(b - a, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700262 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700263}
264
Elliott Hughesb264f082012-04-06 17:10:10 -0700265int gJava_MyClassNatives_fooDD_calls = 0;
266jdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700267 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700268 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700269 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
270 EXPECT_TRUE(thisObj != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700271 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700272 gJava_MyClassNatives_fooDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800273 ScopedObjectAccess soa(Thread::Current());
274 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700275 return x - y; // non-commutative operator
276}
277
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700278TEST_F(JniCompilerTest, CompileAndRunDoubleDoubleMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800279 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700280 SetUpForTest(false, "fooDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700281 reinterpret_cast<void*>(&Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700282
Elliott Hughesb264f082012-04-06 17:10:10 -0700283 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700284 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
285 99.0, 10.0);
286 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700287 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700288 jdouble a = 3.14159265358979323846;
289 jdouble b = 0.69314718055994530942;
290 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
291 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700292 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700293}
294
Elliott Hughes3e778f72012-05-21 15:29:52 -0700295int gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
296jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700297 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700298 EXPECT_EQ(kNative, Thread::Current()->GetState());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700299 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
300 EXPECT_TRUE(thisObj != NULL);
301 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
302 gJava_MyClassNatives_fooJJ_synchronized_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800303 ScopedObjectAccess soa(Thread::Current());
304 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700305 return x | y;
306}
307
308TEST_F(JniCompilerTest, CompileAndRun_fooJJ_synchronized) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800309 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700310 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Elliott Hughes3e778f72012-05-21 15:29:52 -0700311 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ_synchronized));
312
313 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls);
314 jlong a = 0x1000000020000000ULL;
315 jlong b = 0x00ff000000aa0000ULL;
316 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
317 EXPECT_EQ(a | b, result);
318 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls);
319}
320
Elliott Hughesb264f082012-04-06 17:10:10 -0700321int gJava_MyClassNatives_fooIOO_calls = 0;
322jobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700323 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700324 // 3 = this + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700325 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700326 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
327 EXPECT_TRUE(thisObj != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700328 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700329 gJava_MyClassNatives_fooIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800330 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800331 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
332 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
333 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700334 switch (x) {
335 case 1:
336 return y;
337 case 2:
338 return z;
339 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700340 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700341 }
342}
343
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700344TEST_F(JniCompilerTest, CompileAndRunIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800345 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700346 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700347 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700348 reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700349
Elliott Hughesb264f082012-04-06 17:10:10 -0700350 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700351 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, NULL, NULL);
352 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700353 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700354
355 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, NULL, jklass_);
356 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700357 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700358 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, NULL, jklass_);
359 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700360 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700361 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, NULL, jklass_);
362 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700363 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700364
365 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, NULL);
366 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700367 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700368 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, NULL);
369 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700370 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700371 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, NULL);
372 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700373 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700374}
375
Elliott Hughesb264f082012-04-06 17:10:10 -0700376int gJava_MyClassNatives_fooSII_calls = 0;
377jint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700378 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700379 EXPECT_EQ(kNative, Thread::Current()->GetState());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700380 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
381 EXPECT_TRUE(klass != NULL);
382 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700383 gJava_MyClassNatives_fooSII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800384 ScopedObjectAccess soa(Thread::Current());
385 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700386 return x + y;
387}
388
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700389TEST_F(JniCompilerTest, CompileAndRunStaticIntIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800390 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700391 SetUpForTest(true, "fooSII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700392 reinterpret_cast<void*>(&Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700393
Elliott Hughesb264f082012-04-06 17:10:10 -0700394 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700395 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
396 EXPECT_EQ(50, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700397 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700398}
399
Elliott Hughesb264f082012-04-06 17:10:10 -0700400int gJava_MyClassNatives_fooSDD_calls = 0;
401jdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700402 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700403 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers7a99c112011-09-07 12:48:27 -0700404 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
405 EXPECT_TRUE(klass != NULL);
406 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700407 gJava_MyClassNatives_fooSDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800408 ScopedObjectAccess soa(Thread::Current());
409 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers7a99c112011-09-07 12:48:27 -0700410 return x - y; // non-commutative operator
411}
412
413TEST_F(JniCompilerTest, CompileAndRunStaticDoubleDoubleMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800414 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700415 SetUpForTest(true, "fooSDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700416 reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700417
Elliott Hughesb264f082012-04-06 17:10:10 -0700418 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700419 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
420 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700421 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700422 jdouble a = 3.14159265358979323846;
423 jdouble b = 0.69314718055994530942;
424 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
425 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700426 EXPECT_EQ(2, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700427}
428
Elliott Hughesb264f082012-04-06 17:10:10 -0700429int gJava_MyClassNatives_fooSIOO_calls = 0;
430jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700431 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700432 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700433 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700434 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
435 EXPECT_TRUE(klass != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700436 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700437 gJava_MyClassNatives_fooSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800438 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800439 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
440 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
441 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700442 switch (x) {
443 case 1:
444 return y;
445 case 2:
446 return z;
447 default:
448 return klass;
449 }
450}
451
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700452
453TEST_F(JniCompilerTest, CompileAndRunStaticIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800454 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700455 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700456 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700457 reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700458
Elliott Hughesb264f082012-04-06 17:10:10 -0700459 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700460 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, NULL);
461 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700462 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700463
464 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, jobj_);
465 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700466 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700467 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, NULL, jobj_);
468 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700469 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700470 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, NULL, jobj_);
471 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700472 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700473
474 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, NULL);
475 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700476 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700477 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, NULL);
478 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700479 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700480 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, NULL);
481 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700482 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700483}
484
Elliott Hughesb264f082012-04-06 17:10:10 -0700485int gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700486jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
487 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700488 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700489 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
490 EXPECT_TRUE(klass != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700491 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700492 gJava_MyClassNatives_fooSSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800493 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800494 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
495 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
496 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersdf20fe02011-07-20 20:34:16 -0700497 switch (x) {
498 case 1:
499 return y;
500 case 2:
501 return z;
502 default:
503 return klass;
504 }
505}
506
Ian Rogersdf20fe02011-07-20 20:34:16 -0700507TEST_F(JniCompilerTest, CompileAndRunStaticSynchronizedIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800508 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700509 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700510 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700511 reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700512
Elliott Hughesb264f082012-04-06 17:10:10 -0700513 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700514 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, NULL);
515 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700516 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700517
518 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, jobj_);
519 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700520 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700521 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, NULL, jobj_);
522 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700523 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700524 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, NULL, jobj_);
525 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700526 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700527
528 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, NULL);
529 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700530 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700531 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, NULL);
532 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700533 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700534 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, NULL);
535 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700536 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogersdf20fe02011-07-20 20:34:16 -0700537}
538
Elliott Hughesb264f082012-04-06 17:10:10 -0700539void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -0700540 jclass c = env->FindClass("java/lang/RuntimeException");
541 env->ThrowNew(c, "hello");
542}
Ian Rogers45a76cb2011-07-21 22:00:15 -0700543
Elliott Hughesa2501992011-08-26 19:39:54 -0700544TEST_F(JniCompilerTest, ExceptionHandling) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800545 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700546 {
547 ASSERT_FALSE(runtime_->IsStarted());
548 ScopedObjectAccess soa(Thread::Current());
549 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -0700550
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700551 // all compilation needs to happen before Runtime::Start
552 CompileForTest(class_loader_, false, "foo", "()V");
553 CompileForTest(class_loader_, false, "throwException", "()V");
554 CompileForTest(class_loader_, false, "foo", "()V");
555 }
556 // Start runtime to avoid re-initialization in SetupForTest.
557 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700558 bool started = runtime_->Start();
559 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700560
Elliott Hughesb264f082012-04-06 17:10:10 -0700561 gJava_MyClassNatives_foo_calls = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -0700562
Ian Rogers67375ac2011-09-14 00:55:44 -0700563 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700564 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700565 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700566 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers67375ac2011-09-14 00:55:44 -0700567 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -0700568
Ian Rogers67375ac2011-09-14 00:55:44 -0700569 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700570 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
571 SetUpForTest(false, "throwException", "()V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700572 reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
573 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -0700574 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700575 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700576 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
577 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
578 env_->ExceptionClear();
579 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -0700580
Ian Rogers67375ac2011-09-14 00:55:44 -0700581 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700582 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700583 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700584 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Ian Rogers45a76cb2011-07-21 22:00:15 -0700585}
586
Elliott Hughesb264f082012-04-06 17:10:10 -0700587jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700588 if (i <= 0) {
Ian Rogersaaa20802011-09-11 21:47:37 -0700589 // We want to check raw Object*/Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700590 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -0700591
592 // Build stack trace
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700593 jobject internal = Thread::Current()->CreateInternalStackTrace(soa);
Elliott Hughes01158d72011-09-19 19:47:10 -0700594 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(env, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800595 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
596 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700597 EXPECT_TRUE(trace_array != NULL);
598 EXPECT_EQ(11, trace_array->GetLength());
599
Ian Rogersaaa20802011-09-11 21:47:37 -0700600 // Check stack trace entries have expected values
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700601 for (int32_t i = 0; i < trace_array->GetLength(); ++i) {
602 EXPECT_EQ(-2, trace_array->Get(i)->GetLineNumber());
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800603 mirror::StackTraceElement* ste = trace_array->Get(i);
Ian Rogersaaa20802011-09-11 21:47:37 -0700604 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -0700605 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Ian Rogersaaa20802011-09-11 21:47:37 -0700606 EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700607 }
Ian Rogersaaa20802011-09-11 21:47:37 -0700608
609 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700610 return 0;
611 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -0700612 jclass jklass = env->FindClass("MyClassNatives");
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700613 EXPECT_TRUE(jklass != NULL);
614 jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
615 EXPECT_TRUE(jmethod != NULL);
616
Ian Rogersaaa20802011-09-11 21:47:37 -0700617 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700618 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -0700619
620 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700621 return i + result;
622 }
623}
624
625TEST_F(JniCompilerTest, NativeStackTraceElement) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800626 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700627 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700628 reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700629 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Ian Rogersaaa20802011-09-11 21:47:37 -0700630 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700631}
632
Elliott Hughesb264f082012-04-06 17:10:10 -0700633jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -0700634 return env->NewGlobalRef(x);
635}
636
Ian Rogersb9231c82011-09-05 22:13:19 -0700637TEST_F(JniCompilerTest, ReturnGlobalRef) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800638 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700639 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700640 reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -0700641 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
642 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
643 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
644}
645
Ian Rogersdc51b792011-09-22 20:41:37 -0700646jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
647 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700648 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -0700649 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800650 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -0700651 }
652 return x+1;
653}
654
655TEST_F(JniCompilerTest, LocalReferenceTableClearingTest) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800656 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700657 SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -0700658 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700659 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -0700660 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
661 EXPECT_TRUE(result == i + 1);
662 }
663}
664
Ian Rogersb9231c82011-09-05 22:13:19 -0700665void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
666 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
667 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -0700668 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -0700669 EXPECT_EQ(1234, src_pos);
670 EXPECT_EQ(5678, dst_pos);
671 EXPECT_EQ(9876, length);
672}
673
674TEST_F(JniCompilerTest, JavaLangSystemArrayCopy) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800675 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700676 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Ian Rogersb9231c82011-09-05 22:13:19 -0700677 reinterpret_cast<void*>(&my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -0700678 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -0700679}
680
Ian Rogers67375ac2011-09-14 00:55:44 -0700681jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
682 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
683 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
684 EXPECT_EQ(0x12345678ABCDEF88ll, offset);
685 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
686 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
687 return JNI_TRUE;
688}
689
690TEST_F(JniCompilerTest, CompareAndSwapInt) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800691 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700692 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Ian Rogers67375ac2011-09-14 00:55:44 -0700693 reinterpret_cast<void*>(&my_casi));
694 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, 0x12345678ABCDEF88ll, 0xCAFEF00D, 0xEBADF00D);
695 EXPECT_EQ(result, JNI_TRUE);
696}
697
Ian Rogersc7792842012-03-03 15:36:20 -0800698jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
699 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
700 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
701 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
702 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
703 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
704 return 42;
705}
706
707TEST_F(JniCompilerTest, GetText) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800708 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700709 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Ian Rogersc7792842012-03-03 15:36:20 -0800710 reinterpret_cast<void*>(&my_gettext));
711 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
712 0x7FEDCBA987654321ll, jobj_);
713 EXPECT_EQ(result, 42);
714}
715
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700716TEST_F(JniCompilerTest, GetSinkPropertiesNative) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800717 TEST_DISABLED_FOR_PORTABLE();
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700718 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;", NULL);
719 // This space intentionally left blank. Just testing compilation succeeds.
720}
721
Elliott Hughesb264f082012-04-06 17:10:10 -0700722// This should return jclass, but we're imitating a bug pattern.
723jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
724 return env->NewStringUTF("not a class!");
725}
726
727// This should return jclass, but we're imitating a bug pattern.
728jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
729 return env->NewStringUTF("not a class!");
730}
731
732TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800733 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700734 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700735 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
736
737 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700738 // TODO: check type of returns with portable JNI compiler.
739 // This native method is bad, and tries to return a jstring as a jclass.
740 env_->CallObjectMethod(jobj_, jmethod_);
741 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
742
743 // Here, we just call the method incorrectly; we should catch that too.
Elliott Hughesb264f082012-04-06 17:10:10 -0700744 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700745 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
746 env_->CallStaticVoidMethod(jklass_, jmethod_);
747 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700748}
749
750TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800751 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700752 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700753 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
754
755 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700756 // TODO: check type of returns with portable JNI compiler.
757 // This native method is bad, and tries to return a jstring as a jclass.
758 env_->CallStaticObjectMethod(jklass_, jmethod_);
759 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
760
761 // Here, we just call the method incorrectly; we should catch that too.
762 env_->CallStaticVoidMethod(jklass_, jmethod_);
763 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
Elliott Hughesb264f082012-04-06 17:10:10 -0700764 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700765 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700766}
767
768// This should take jclass, but we're imitating a bug pattern.
769void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
770}
771
772// This should take jclass, but we're imitating a bug pattern.
773void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
774}
775
776TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800777 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700778 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700779 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
780
781 CheckJniAbortCatcher check_jni_abort_catcher;
782 // We deliberately pass a bad second argument here.
783 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700784 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700785}
786
787TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800788 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700789 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700790 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
791
792 CheckJniAbortCatcher check_jni_abort_catcher;
793 // We deliberately pass a bad second argument here.
794 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700795 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700796}
797
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800798jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
799 EXPECT_EQ(kNative, Thread::Current()->GetState());
800 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
801 EXPECT_TRUE(thisObj != NULL);
802 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
803 ScopedObjectAccess soa(Thread::Current());
804 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
805 return f1 - f2; // non-commutative operator
806}
807
808TEST_F(JniCompilerTest, CompileAndRunFloatFloatMethod) {
809 TEST_DISABLED_FOR_PORTABLE();
810 SetUpForTest(false, "checkFloats", "(FF)F",
811 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
812
813 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
814 99.0F, 10.0F);
815 EXPECT_EQ(99.0F - 10.0F, result);
816 jfloat a = 3.14159F;
817 jfloat b = 0.69314F;
818 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
819 EXPECT_EQ(a - b, result);
820}
821
822void Java_MyClassNatives_checkParameterAlign(JNIEnv* env, jobject thisObj, jint i1, jlong l1) {
823 /*EXPECT_EQ(kNative, Thread::Current()->GetState());
824 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
825 EXPECT_TRUE(thisObj != NULL);
826 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
827 ScopedObjectAccess soa(Thread::Current());
828 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());*/
829 EXPECT_EQ(i1, 1234);
830 EXPECT_EQ(l1, 5678);
831}
832
833TEST_F(JniCompilerTest, CheckParameterAlign) {
834 TEST_DISABLED_FOR_PORTABLE();
835 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
836 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
837
838 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, 5678LLU);
839}
840
841void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
842 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
843 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
844 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
845 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
846 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
847 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
848 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
849 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
850 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
851 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
852 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
853 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
854 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
855 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
856 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
857 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
858 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
859 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
860 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
861 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
862 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
863 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
864 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
865 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
866 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
867 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
868 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
869 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
870 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
871 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
872 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
873 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
874 EXPECT_EQ(kNative, Thread::Current()->GetState());
875 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
876 EXPECT_TRUE(thisObj != NULL);
877 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
878 ScopedObjectAccess soa(Thread::Current());
879 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
880
881 // two tests possible
882 if (o0 == nullptr) {
883 // 1) everything is null
884 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
885 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
886 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
887 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
888 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
889 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
890 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
891 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
892 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
893 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
894 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
895 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
896 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
897 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
898 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
899 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
900 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
901 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
902 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
903 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
904 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
905 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
906 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
907 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
908 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
909 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
910 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
911 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
912 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
913 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
914 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
915 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
916 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
917 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
918 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
919 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
920 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
921 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
922 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
923 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
924 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
925 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
926 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
927 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
928 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
929 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
930 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
931 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
932 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
933 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
934 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
935 } else {
936 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
937 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
938 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
939 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
940 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
941 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
942 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
943 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
944 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
945 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
946 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
947 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
948 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
949 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
950 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
951 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
952 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
953 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
954 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
955 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
956 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
957 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
958 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
959 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
960 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
961 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
962 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
963 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
964 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
965 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
966 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
967 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
968 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
969 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
970 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
971 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
972 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
973 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
974 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
975 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
976 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
977 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
978 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
979 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
980 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
981 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
982 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
983 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
984 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
985 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
986 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
987 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
988 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
989 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
990 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
991 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
992 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
993 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
994 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
995 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
996 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
997 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
998 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
999 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1000 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1001 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1002 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1003 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1004 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1005 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1006 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1007 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1008 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1009 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1010 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1011 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1012 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1013 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1014 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1015 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1016 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1017 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1018 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1019 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1020 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1021 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1022 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1023 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1024 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1025 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1026 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1027 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1028 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1029 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1030 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1031 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1032 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1033 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1034 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1035 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1036 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1037 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1038 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1039 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1040 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1041 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1042 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1043 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1044 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1045 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1046 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1047 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1048 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1049 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1050 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1051 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1052 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1053 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1054 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1055 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1056 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1057 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1058 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1059 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1060 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1061 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1062 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1063 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1064 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1065 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1066 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1067 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1068 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1069 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1070 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1071 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1072 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1073 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1074 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1075 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1076 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1077 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1078 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1079 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1080 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1081 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1082 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1083 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1084 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1085 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1086 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1087 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1088 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1089 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1090 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1091 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1092 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1093 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1094 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1095 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1096 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1097 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1098 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1099 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1100 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1101 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1102 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1103 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1104 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1105 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1106 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1107 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1108 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1109 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1110 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1111 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1112 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1113 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1114 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1115 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1116 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1117 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1118 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1119 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1120 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1121 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1122 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1123 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1124 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1125 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1126 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1127 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1128 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1129 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1130 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1131 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1132 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1133 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1134 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1135 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1136 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1137 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1138 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1139 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1140 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1141 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1142 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1143 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1144 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1145 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1146 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1147 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1148 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1149 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1150 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1151 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1152 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1153 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1154 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1155 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1156 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1157 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1158 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1159 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1160 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1161 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1162 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1163 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1164 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1165 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1166 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1167 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1168 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1169 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1170 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1171 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1172 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1173 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1174 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1175 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1176 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1177 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1178 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1179 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1180 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1181 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1182 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1183 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1184 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1185 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1186 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1187 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1188 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1189 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1190 }
1191}
1192
1193const char* longSig =
1194 "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1195 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1196 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1197 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1198 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1199 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1200 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1201 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1202 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1203 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1204 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1205 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1206 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1207 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1208 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1209 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1210 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1211 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1212 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1213 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1214 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1215 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1216 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1217 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1218 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1219 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1220 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1221 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1222 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1223 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1224 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1225 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1226 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1227 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1228 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1229 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1230 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1231 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1232 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1233 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1234 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1235 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1236 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1237 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1238 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1239 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1240 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1241 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1242 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1243 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1244 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1245
1246TEST_F(JniCompilerTest, MaxParamNumber) {
1247 TEST_DISABLED_FOR_PORTABLE();
1248 SetUpForTest(false, "maxParamNumber", longSig,
1249 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1250
1251 jvalue args[254];
1252
1253 // First test: test with all arguments null.
1254 for (int i = 0; i < 254; ++i) {
1255 args[i].l = nullptr;
1256 }
1257
1258 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1259
1260 // Second test: test with int[] objects with increasing lengths
1261 for (int i = 0; i < 254; ++i) {
1262 jintArray tmp = env_->NewIntArray(i);
1263 args[i].l = tmp;
1264 EXPECT_NE(args[i].l, nullptr);
1265 }
1266
1267 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1268}
1269
Ian Rogersb033c752011-07-20 12:22:35 -07001270} // namespace art