blob: 75d3030bafdf27cf63e0edd00e4c01ccb22bc7ce [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
Ian Rogers700a4022014-05-19 16:49:03 -070017#include <memory>
18
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070019#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080020#include "common_compiler_test.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070021#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070022#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070023#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070024#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070025#include "mem_map.h"
Brian Carlstromea46f952013-07-30 01:26:50 -070026#include "mirror/art_method-inl.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070027#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080028#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080029#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070030#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080031#include "mirror/stack_trace_element.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070032#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070033#include "ScopedLocalRef.h"
34#include "scoped_thread_state_change.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070035#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070036
Elliott Hughesb264f082012-04-06 17:10:10 -070037extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080038 return count + 1;
39}
40
Elliott Hughesb264f082012-04-06 17:10:10 -070041extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080042 return count + 1;
43}
44
Ian Rogersb033c752011-07-20 12:22:35 -070045namespace art {
46
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080047class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -070048 protected:
Ian Rogers00f7d0e2012-07-19 15:28:27 -070049 void CompileForTest(jobject class_loader, bool direct,
Brian Carlstrom40381fb2011-10-19 14:13:40 -070050 const char* method_name, const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070051 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -070052 StackHandleScope<1> hs(soa.Self());
53 Handle<mirror::ClassLoader> loader(
54 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -070055 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -080056 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Brian Carlstromea46f952013-07-30 01:26:50 -070057 mirror::ArtMethod* method;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070058 if (direct) {
buzbeec143c552011-08-20 17:38:58 -070059 method = c->FindDirectMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070060 } else {
buzbeec143c552011-08-20 17:38:58 -070061 method = c->FindVirtualMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070062 }
Andreas Gampecf4035a2014-05-28 22:43:01 -070063 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Ian Rogers04c31d22014-07-07 21:44:06 -070064 if (method->GetEntryPointFromQuickCompiledCode() == nullptr ||
65 method->GetEntryPointFromQuickCompiledCode() == class_linker_->GetQuickGenericJniTrampoline()) {
Ian Rogersef7d42f2014-01-06 12:55:46 -080066 CompileMethod(method);
67 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
68 << method_name << " " << method_sig;
69 ASSERT_TRUE(method->GetEntryPointFromPortableCompiledCode() != nullptr)
70 << method_name << " " << method_sig;
Brian Carlstrom25c33252011-09-18 15:58:35 -070071 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070072 }
73
Ian Rogers00f7d0e2012-07-19 15:28:27 -070074 void SetUpForTest(bool direct, const char* method_name, const char* method_sig,
Brian Carlstrom25c33252011-09-18 15:58:35 -070075 void* native_fnptr) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070076 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -070077 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070078 {
79 ScopedObjectAccess soa(Thread::Current());
80 class_loader_ = LoadDex("MyClassNatives");
81 }
82 CompileForTest(class_loader_, direct, method_name, method_sig);
83 // Start runtime.
84 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -070085 bool started = runtime_->Start();
86 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -070087 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -070088 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -070089 env_ = Thread::Current()->GetJniEnv();
Elliott Hughesb264f082012-04-06 17:10:10 -070090 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -070091 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070092
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070093 if (direct) {
94 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
95 } else {
96 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
97 }
Andreas Gampecf4035a2014-05-28 22:43:01 -070098 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070099
Andreas Gampecf4035a2014-05-28 22:43:01 -0700100 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700101 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700102 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
103 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700104 } else {
105 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700106 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700107
108 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
109 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700110 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700111 }
112
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700113 public:
114 static jclass jklass_;
115 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700116 static jobject class_loader_;
117
Elliott Hughesa21039c2012-06-21 12:09:25 -0700118
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700119 protected:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700120 JNIEnv* env_;
121 jmethodID jmethod_;
Ian Rogersb033c752011-07-20 12:22:35 -0700122};
123
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700124jclass JniCompilerTest::jklass_;
125jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700126jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700127
Andreas Gampecf4035a2014-05-28 22:43:01 -0700128
Elliott Hughesb264f082012-04-06 17:10:10 -0700129int gJava_MyClassNatives_foo_calls = 0;
130void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700131 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700132 EXPECT_EQ(kNative, Thread::Current()->GetState());
133 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700134 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700135 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700136 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700137 gJava_MyClassNatives_foo_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800138 ScopedObjectAccess soa(Thread::Current());
139 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700140}
141
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700142TEST_F(JniCompilerTest, CompileAndRunNoArgMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800143 TEST_DISABLED_FOR_PORTABLE();
Ian Rogersef7d42f2014-01-06 12:55:46 -0800144 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700145
Elliott Hughesb264f082012-04-06 17:10:10 -0700146 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700147 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700148 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700149 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700150 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700151}
152
Shih-wei Liao31384c52011-09-06 15:27:45 -0700153TEST_F(JniCompilerTest, CompileAndRunIntMethodThroughStub) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800154 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700155 SetUpForTest(false, "bar", "(I)I", nullptr);
156 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700157
Shih-wei Liao31384c52011-09-06 15:27:45 -0700158 std::string reason;
Ian Rogers68d8b422014-07-17 11:09:10 -0700159 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->LoadNativeLibrary(env_, "", class_loader_, &reason))
160 << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700161
162 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
163 EXPECT_EQ(25, result);
164}
165
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800166TEST_F(JniCompilerTest, CompileAndRunStaticIntMethodThroughStub) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800167 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700168 SetUpForTest(true, "sbar", "(I)I", nullptr);
169 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800170
171 std::string reason;
Ian Rogers68d8b422014-07-17 11:09:10 -0700172 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->LoadNativeLibrary(env_, "", class_loader_, &reason))
173 << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800174
175 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
176 EXPECT_EQ(43, result);
177}
178
Elliott Hughesb264f082012-04-06 17:10:10 -0700179int gJava_MyClassNatives_fooI_calls = 0;
180jint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700181 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700182 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700183 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700184 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700185 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700186 gJava_MyClassNatives_fooI_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800187 ScopedObjectAccess soa(Thread::Current());
188 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700189 return x;
190}
191
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700192TEST_F(JniCompilerTest, CompileAndRunIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800193 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700194 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700195 reinterpret_cast<void*>(&Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700196
Elliott Hughesb264f082012-04-06 17:10:10 -0700197 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700198 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
199 EXPECT_EQ(42, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700200 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700201 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
202 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700203 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700204}
205
Elliott Hughesb264f082012-04-06 17:10:10 -0700206int gJava_MyClassNatives_fooII_calls = 0;
207jint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700208 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700209 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700210 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700211 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700212 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700213 gJava_MyClassNatives_fooII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800214 ScopedObjectAccess soa(Thread::Current());
215 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700216 return x - y; // non-commutative operator
217}
218
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700219TEST_F(JniCompilerTest, CompileAndRunIntIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800220 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700221 SetUpForTest(false, "fooII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700222 reinterpret_cast<void*>(&Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700223
Elliott Hughesb264f082012-04-06 17:10:10 -0700224 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700225 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
226 EXPECT_EQ(99 - 10, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700227 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700228 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
229 0xCAFED00D);
230 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700231 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700232}
233
Elliott Hughesb264f082012-04-06 17:10:10 -0700234int gJava_MyClassNatives_fooJJ_calls = 0;
235jlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700236 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700237 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers9b269d22011-09-04 14:06:05 -0700238 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700239 EXPECT_TRUE(thisObj != nullptr);
Ian Rogers9b269d22011-09-04 14:06:05 -0700240 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700241 gJava_MyClassNatives_fooJJ_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800242 ScopedObjectAccess soa(Thread::Current());
243 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers9b269d22011-09-04 14:06:05 -0700244 return x - y; // non-commutative operator
245}
246
247TEST_F(JniCompilerTest, CompileAndRunLongLongMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800248 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700249 SetUpForTest(false, "fooJJ", "(JJ)J",
Elliott Hughesb264f082012-04-06 17:10:10 -0700250 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700251
Elliott Hughesb264f082012-04-06 17:10:10 -0700252 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers0f678472014-03-10 16:18:37 -0700253 jlong a = INT64_C(0x1234567890ABCDEF);
254 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700255 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
256 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700257 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700258 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
259 EXPECT_EQ(b - a, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700260 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700261}
262
Elliott Hughesb264f082012-04-06 17:10:10 -0700263int gJava_MyClassNatives_fooDD_calls = 0;
264jdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700265 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700266 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700267 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700268 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700269 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700270 gJava_MyClassNatives_fooDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800271 ScopedObjectAccess soa(Thread::Current());
272 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700273 return x - y; // non-commutative operator
274}
275
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700276TEST_F(JniCompilerTest, CompileAndRunDoubleDoubleMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800277 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700278 SetUpForTest(false, "fooDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700279 reinterpret_cast<void*>(&Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700280
Elliott Hughesb264f082012-04-06 17:10:10 -0700281 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700282 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
283 99.0, 10.0);
284 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700285 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700286 jdouble a = 3.14159265358979323846;
287 jdouble b = 0.69314718055994530942;
288 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
289 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700290 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700291}
292
Elliott Hughes3e778f72012-05-21 15:29:52 -0700293int gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
294jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700295 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700296 EXPECT_EQ(kNative, Thread::Current()->GetState());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700297 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700298 EXPECT_TRUE(thisObj != nullptr);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700299 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
300 gJava_MyClassNatives_fooJJ_synchronized_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800301 ScopedObjectAccess soa(Thread::Current());
302 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700303 return x | y;
304}
305
306TEST_F(JniCompilerTest, CompileAndRun_fooJJ_synchronized) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800307 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700308 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Elliott Hughes3e778f72012-05-21 15:29:52 -0700309 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ_synchronized));
310
311 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls);
312 jlong a = 0x1000000020000000ULL;
313 jlong b = 0x00ff000000aa0000ULL;
314 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
315 EXPECT_EQ(a | b, result);
316 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls);
317}
318
Elliott Hughesb264f082012-04-06 17:10:10 -0700319int gJava_MyClassNatives_fooIOO_calls = 0;
320jobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700321 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700322 // 3 = this + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700323 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700324 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700325 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700326 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700327 gJava_MyClassNatives_fooIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800328 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800329 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
330 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
331 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700332 switch (x) {
333 case 1:
334 return y;
335 case 2:
336 return z;
337 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700338 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700339 }
340}
341
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700342TEST_F(JniCompilerTest, CompileAndRunIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800343 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700344 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700345 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700346 reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700347
Elliott Hughesb264f082012-04-06 17:10:10 -0700348 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700349 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700350 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700351 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700352
Andreas Gampecf4035a2014-05-28 22:43:01 -0700353 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700354 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700355 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700356 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
357 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700358 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700359 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700360 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700361 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700362
Andreas Gampecf4035a2014-05-28 22:43:01 -0700363 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700364 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700365 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700366 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700367 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700368 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700369 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
370 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700371 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700372}
373
Elliott Hughesb264f082012-04-06 17:10:10 -0700374int gJava_MyClassNatives_fooSII_calls = 0;
375jint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700376 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700377 EXPECT_EQ(kNative, Thread::Current()->GetState());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700378 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700379 EXPECT_TRUE(klass != nullptr);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700380 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700381 gJava_MyClassNatives_fooSII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800382 ScopedObjectAccess soa(Thread::Current());
383 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700384 return x + y;
385}
386
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700387TEST_F(JniCompilerTest, CompileAndRunStaticIntIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800388 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700389 SetUpForTest(true, "fooSII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700390 reinterpret_cast<void*>(&Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700391
Elliott Hughesb264f082012-04-06 17:10:10 -0700392 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700393 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
394 EXPECT_EQ(50, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700395 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700396}
397
Elliott Hughesb264f082012-04-06 17:10:10 -0700398int gJava_MyClassNatives_fooSDD_calls = 0;
399jdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700400 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700401 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers7a99c112011-09-07 12:48:27 -0700402 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700403 EXPECT_TRUE(klass != nullptr);
Ian Rogers7a99c112011-09-07 12:48:27 -0700404 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700405 gJava_MyClassNatives_fooSDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800406 ScopedObjectAccess soa(Thread::Current());
407 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers7a99c112011-09-07 12:48:27 -0700408 return x - y; // non-commutative operator
409}
410
411TEST_F(JniCompilerTest, CompileAndRunStaticDoubleDoubleMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800412 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700413 SetUpForTest(true, "fooSDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700414 reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700415
Elliott Hughesb264f082012-04-06 17:10:10 -0700416 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700417 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
418 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700419 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700420 jdouble a = 3.14159265358979323846;
421 jdouble b = 0.69314718055994530942;
422 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
423 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700424 EXPECT_EQ(2, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700425}
426
Elliott Hughesb264f082012-04-06 17:10:10 -0700427int gJava_MyClassNatives_fooSIOO_calls = 0;
428jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700429 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700430 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700431 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700432 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700433 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700434 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700435 gJava_MyClassNatives_fooSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800436 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800437 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
438 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
439 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700440 switch (x) {
441 case 1:
442 return y;
443 case 2:
444 return z;
445 default:
446 return klass;
447 }
448}
449
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700450
451TEST_F(JniCompilerTest, CompileAndRunStaticIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800452 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700453 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700454 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700455 reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700456
Elliott Hughesb264f082012-04-06 17:10:10 -0700457 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700458 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700459 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700460 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700461
Andreas Gampecf4035a2014-05-28 22:43:01 -0700462 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700463 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700464 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700465 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
466 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700467 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700468 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700469 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700470 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700471
Andreas Gampecf4035a2014-05-28 22:43:01 -0700472 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700473 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700474 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700475 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700476 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700477 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700478 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
479 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700480 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700481}
482
Elliott Hughesb264f082012-04-06 17:10:10 -0700483int gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700484jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
485 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700486 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700487 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700488 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700489 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700490 gJava_MyClassNatives_fooSSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800491 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800492 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
493 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
494 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersdf20fe02011-07-20 20:34:16 -0700495 switch (x) {
496 case 1:
497 return y;
498 case 2:
499 return z;
500 default:
501 return klass;
502 }
503}
504
Ian Rogersdf20fe02011-07-20 20:34:16 -0700505TEST_F(JniCompilerTest, CompileAndRunStaticSynchronizedIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800506 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700507 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700508 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700509 reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700510
Elliott Hughesb264f082012-04-06 17:10:10 -0700511 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700512 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700513 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700514 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700515
Andreas Gampecf4035a2014-05-28 22:43:01 -0700516 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700517 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700518 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700519 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
520 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700521 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700522 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700523 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700524 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700525
Andreas Gampecf4035a2014-05-28 22:43:01 -0700526 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700527 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700528 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700529 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700530 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700531 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700532 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
533 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700534 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogersdf20fe02011-07-20 20:34:16 -0700535}
536
Elliott Hughesb264f082012-04-06 17:10:10 -0700537void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -0700538 jclass c = env->FindClass("java/lang/RuntimeException");
539 env->ThrowNew(c, "hello");
540}
Ian Rogers45a76cb2011-07-21 22:00:15 -0700541
Elliott Hughesa2501992011-08-26 19:39:54 -0700542TEST_F(JniCompilerTest, ExceptionHandling) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800543 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700544 {
545 ASSERT_FALSE(runtime_->IsStarted());
546 ScopedObjectAccess soa(Thread::Current());
547 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -0700548
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700549 // all compilation needs to happen before Runtime::Start
550 CompileForTest(class_loader_, false, "foo", "()V");
551 CompileForTest(class_loader_, false, "throwException", "()V");
552 CompileForTest(class_loader_, false, "foo", "()V");
553 }
554 // Start runtime to avoid re-initialization in SetupForTest.
555 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700556 bool started = runtime_->Start();
557 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700558
Elliott Hughesb264f082012-04-06 17:10:10 -0700559 gJava_MyClassNatives_foo_calls = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -0700560
Ian Rogers67375ac2011-09-14 00:55:44 -0700561 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700562 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700563 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700564 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers67375ac2011-09-14 00:55:44 -0700565 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -0700566
Ian Rogers67375ac2011-09-14 00:55:44 -0700567 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700568 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
569 SetUpForTest(false, "throwException", "()V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700570 reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
571 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -0700572 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700573 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700574 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
575 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
576 env_->ExceptionClear();
577 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -0700578
Ian Rogers67375ac2011-09-14 00:55:44 -0700579 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700580 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700581 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700582 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Ian Rogers45a76cb2011-07-21 22:00:15 -0700583}
584
Elliott Hughesb264f082012-04-06 17:10:10 -0700585jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700586 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700587 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700588 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -0700589
590 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +0100591 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -0700592 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800593 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
594 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700595 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700596 EXPECT_EQ(11, trace_array->GetLength());
597
Ian Rogersaaa20802011-09-11 21:47:37 -0700598 // Check stack trace entries have expected values
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700599 for (int32_t i = 0; i < trace_array->GetLength(); ++i) {
600 EXPECT_EQ(-2, trace_array->Get(i)->GetLineNumber());
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800601 mirror::StackTraceElement* ste = trace_array->Get(i);
Ian Rogersaaa20802011-09-11 21:47:37 -0700602 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -0700603 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Ian Rogersaaa20802011-09-11 21:47:37 -0700604 EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700605 }
Ian Rogersaaa20802011-09-11 21:47:37 -0700606
607 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700608 return 0;
609 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -0700610 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700611 EXPECT_TRUE(jklass != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700612 jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700613 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700614
Ian Rogersaaa20802011-09-11 21:47:37 -0700615 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700616 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -0700617
618 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700619 return i + result;
620 }
621}
622
623TEST_F(JniCompilerTest, NativeStackTraceElement) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800624 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700625 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700626 reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700627 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Ian Rogersaaa20802011-09-11 21:47:37 -0700628 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700629}
630
Elliott Hughesb264f082012-04-06 17:10:10 -0700631jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -0700632 return env->NewGlobalRef(x);
633}
634
Ian Rogersb9231c82011-09-05 22:13:19 -0700635TEST_F(JniCompilerTest, ReturnGlobalRef) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800636 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700637 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700638 reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -0700639 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
640 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
641 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
642}
643
Ian Rogersdc51b792011-09-22 20:41:37 -0700644jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
645 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700646 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -0700647 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800648 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -0700649 }
650 return x+1;
651}
652
653TEST_F(JniCompilerTest, LocalReferenceTableClearingTest) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800654 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700655 SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -0700656 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700657 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -0700658 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
659 EXPECT_TRUE(result == i + 1);
660 }
661}
662
Ian Rogersb9231c82011-09-05 22:13:19 -0700663void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
664 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
665 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -0700666 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -0700667 EXPECT_EQ(1234, src_pos);
668 EXPECT_EQ(5678, dst_pos);
669 EXPECT_EQ(9876, length);
670}
671
672TEST_F(JniCompilerTest, JavaLangSystemArrayCopy) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800673 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700674 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Ian Rogersb9231c82011-09-05 22:13:19 -0700675 reinterpret_cast<void*>(&my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -0700676 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -0700677}
678
Ian Rogers67375ac2011-09-14 00:55:44 -0700679jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
680 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
681 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -0700682 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -0700683 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
684 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
685 return JNI_TRUE;
686}
687
688TEST_F(JniCompilerTest, CompareAndSwapInt) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800689 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700690 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Ian Rogers67375ac2011-09-14 00:55:44 -0700691 reinterpret_cast<void*>(&my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -0700692 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
693 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -0700694 EXPECT_EQ(result, JNI_TRUE);
695}
696
Ian Rogersc7792842012-03-03 15:36:20 -0800697jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
698 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
699 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
700 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
701 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
702 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
703 return 42;
704}
705
706TEST_F(JniCompilerTest, GetText) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800707 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700708 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Ian Rogersc7792842012-03-03 15:36:20 -0800709 reinterpret_cast<void*>(&my_gettext));
710 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -0700711 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -0800712 EXPECT_EQ(result, 42);
713}
714
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100715int gJava_MyClassNatives_GetSinkProperties_calls = 0;
716jarray Java_MyClassNatives_GetSinkProperties(JNIEnv* env, jobject thisObj, jstring s) {
717 // 1 = thisObj
718 Thread* self = Thread::Current();
719 EXPECT_EQ(kNative, self->GetState());
720 Locks::mutator_lock_->AssertNotHeld(self);
721 EXPECT_EQ(self->GetJniEnv(), env);
722 EXPECT_TRUE(thisObj != nullptr);
723 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
724 EXPECT_EQ(s, nullptr);
725 gJava_MyClassNatives_GetSinkProperties_calls++;
726 ScopedObjectAccess soa(self);
727 EXPECT_EQ(2U, self->NumStackReferences());
728 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object*>(thisObj)));
729 return nullptr;
730}
731
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700732TEST_F(JniCompilerTest, GetSinkPropertiesNative) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800733 TEST_DISABLED_FOR_PORTABLE();
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100734 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
735 reinterpret_cast<void*>(&Java_MyClassNatives_GetSinkProperties));
736
737 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls);
738 jarray result = down_cast<jarray>(
739 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
740 EXPECT_EQ(nullptr, result);
741 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls);
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700742}
743
Elliott Hughesb264f082012-04-06 17:10:10 -0700744// This should return jclass, but we're imitating a bug pattern.
745jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
746 return env->NewStringUTF("not a class!");
747}
748
749// This should return jclass, but we're imitating a bug pattern.
750jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
751 return env->NewStringUTF("not a class!");
752}
753
754TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800755 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700756 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700757 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
758
759 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700760 // TODO: check type of returns with portable JNI compiler.
761 // This native method is bad, and tries to return a jstring as a jclass.
762 env_->CallObjectMethod(jobj_, jmethod_);
763 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
764
765 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700766 env_->CallObjectMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700767 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
Ian Rogers68d8b422014-07-17 11:09:10 -0700768 env_->CallStaticObjectMethod(jklass_, jmethod_);
769 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700770}
771
772TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800773 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700774 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700775 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
776
777 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700778 // TODO: check type of returns with portable JNI compiler.
779 // This native method is bad, and tries to return a jstring as a jclass.
780 env_->CallStaticObjectMethod(jklass_, jmethod_);
781 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
782
783 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700784 env_->CallStaticObjectMethod(jklass_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700785 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
Ian Rogers68d8b422014-07-17 11:09:10 -0700786 env_->CallObjectMethod(jobj_, jmethod_);
787 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700788}
789
790// This should take jclass, but we're imitating a bug pattern.
791void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
792}
793
794// This should take jclass, but we're imitating a bug pattern.
795void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
796}
797
798TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800799 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700800 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700801 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
802
803 CheckJniAbortCatcher check_jni_abort_catcher;
804 // We deliberately pass a bad second argument here.
805 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700806 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700807}
808
809TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800810 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700811 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700812 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
813
814 CheckJniAbortCatcher check_jni_abort_catcher;
815 // We deliberately pass a bad second argument here.
816 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700817 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700818}
819
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800820jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
821 EXPECT_EQ(kNative, Thread::Current()->GetState());
822 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700823 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800824 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
825 ScopedObjectAccess soa(Thread::Current());
826 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
827 return f1 - f2; // non-commutative operator
828}
829
830TEST_F(JniCompilerTest, CompileAndRunFloatFloatMethod) {
831 TEST_DISABLED_FOR_PORTABLE();
832 SetUpForTest(false, "checkFloats", "(FF)F",
833 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
834
835 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
836 99.0F, 10.0F);
837 EXPECT_EQ(99.0F - 10.0F, result);
838 jfloat a = 3.14159F;
839 jfloat b = 0.69314F;
840 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
841 EXPECT_EQ(a - b, result);
842}
843
844void Java_MyClassNatives_checkParameterAlign(JNIEnv* env, jobject thisObj, jint i1, jlong l1) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700845// EXPECT_EQ(kNative, Thread::Current()->GetState());
846// EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
847// EXPECT_TRUE(thisObj != nullptr);
848// EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
849// ScopedObjectAccess soa(Thread::Current());
850// EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800851 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -0700852 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800853}
854
855TEST_F(JniCompilerTest, CheckParameterAlign) {
856 TEST_DISABLED_FOR_PORTABLE();
857 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
858 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
859
Ian Rogers0f678472014-03-10 16:18:37 -0700860 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800861}
862
863void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
864 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
865 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
866 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
867 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
868 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
869 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
870 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
871 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
872 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
873 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
874 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
875 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
876 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
877 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
878 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
879 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
880 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
881 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
882 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
883 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
884 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
885 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
886 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
887 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
888 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
889 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
890 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
891 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
892 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
893 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
894 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
895 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
896 EXPECT_EQ(kNative, Thread::Current()->GetState());
897 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700898 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800899 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
900 ScopedObjectAccess soa(Thread::Current());
901 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
902
903 // two tests possible
904 if (o0 == nullptr) {
905 // 1) everything is null
906 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
907 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
908 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
909 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
910 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
911 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
912 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
913 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
914 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
915 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
916 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
917 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
918 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
919 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
920 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
921 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
922 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
923 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
924 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
925 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
926 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
927 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
928 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
929 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
930 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
931 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
932 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
933 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
934 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
935 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
936 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
937 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
938 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
939 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
940 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
941 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
942 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
943 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
944 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
945 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
946 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
947 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
948 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
949 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
950 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
951 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
952 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
953 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
954 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
955 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
956 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
957 } else {
958 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
959 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
960 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
961 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
962 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
963 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
964 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
965 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
966 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
967 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
968 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
969 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
970 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
971 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
972 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
973 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
974 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
975 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
976 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
977 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
978 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
979 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
980 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
981 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
982 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
983 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
984 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
985 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
986 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
987 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
988 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
989 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
990 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
991 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
992 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
993 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
994 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
995 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
996 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
997 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
998 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
999 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1000 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1001 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1002 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1003 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1004 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1005 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1006 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1007 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1008 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1009 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1010 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1011 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1012 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1013 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1014 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1015 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1016 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1017 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1018 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1019 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1020 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1021 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1022 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1023 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1024 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1025 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1026 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1027 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1028 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1029 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1030 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1031 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1032 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1033 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1034 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1035 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1036 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1037 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1038 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1039 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1040 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1041 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1042 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1043 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1044 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1045 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1046 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1047 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1048 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1049 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1050 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1051 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1052 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1053 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1054 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1055 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1056 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1057 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1058 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1059 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1060 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1061 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1062 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1063 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1064 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1065 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1066 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1067 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1068 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1069 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1070 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1071 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1072 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1073 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1074 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1075 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1076 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1077 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1078 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1079 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1080 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1081 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1082 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1083 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1084 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1085 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1086 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1087 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1088 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1089 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1090 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1091 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1092 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1093 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1094 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1095 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1096 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1097 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1098 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1099 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1100 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1101 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1102 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1103 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1104 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1105 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1106 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1107 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1108 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1109 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1110 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1111 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1112 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1113 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1114 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1115 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1116 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1117 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1118 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1119 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1120 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1121 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1122 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1123 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1124 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1125 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1126 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1127 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1128 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1129 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1130 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1131 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1132 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1133 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1134 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1135 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1136 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1137 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1138 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1139 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1140 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1141 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1142 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1143 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1144 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1145 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1146 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1147 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1148 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1149 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1150 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1151 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1152 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1153 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1154 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1155 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1156 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1157 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1158 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1159 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1160 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1161 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1162 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1163 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1164 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1165 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1166 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1167 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1168 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1169 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1170 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1171 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1172 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1173 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1174 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1175 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1176 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1177 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1178 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1179 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1180 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1181 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1182 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1183 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1184 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1185 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1186 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1187 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1188 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1189 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1190 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1191 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1192 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1193 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1194 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1195 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1196 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1197 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1198 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1199 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1200 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1201 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1202 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1203 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1204 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1205 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1206 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1207 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1208 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1209 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1210 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1211 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1212 }
1213}
1214
1215const char* longSig =
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;Ljava/lang/Object;"
1245 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1246 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1247 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1248 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1249 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1250 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1251 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1252 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1253 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1254 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1255 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1256 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1257 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1258 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1259 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1260 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1261 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1262 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1263 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1264 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1265 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1266 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1267
1268TEST_F(JniCompilerTest, MaxParamNumber) {
1269 TEST_DISABLED_FOR_PORTABLE();
1270 SetUpForTest(false, "maxParamNumber", longSig,
1271 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1272
1273 jvalue args[254];
1274
1275 // First test: test with all arguments null.
1276 for (int i = 0; i < 254; ++i) {
1277 args[i].l = nullptr;
1278 }
1279
1280 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1281
1282 // Second test: test with int[] objects with increasing lengths
1283 for (int i = 0; i < 254; ++i) {
1284 jintArray tmp = env_->NewIntArray(i);
1285 args[i].l = tmp;
1286 EXPECT_NE(args[i].l, nullptr);
1287 }
1288
1289 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1290}
1291
Andreas Gampead615172014-04-04 16:20:13 -07001292TEST_F(JniCompilerTest, WithoutImplementation) {
1293 TEST_DISABLED_FOR_PORTABLE();
1294 SetUpForTest(false, "withoutImplementation", "()V", nullptr);
1295
1296 env_->CallVoidMethod(jobj_, jmethod_);
1297
1298 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1299 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1300}
1301
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001302void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv* env, jclass klass, jint i1, jint i2, jint i3,
1303 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1304 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1305 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1306 jfloat f10) {
1307 EXPECT_EQ(i1, 1);
1308 EXPECT_EQ(i2, 2);
1309 EXPECT_EQ(i3, 3);
1310 EXPECT_EQ(i4, 4);
1311 EXPECT_EQ(i5, 5);
1312 EXPECT_EQ(i6, 6);
1313 EXPECT_EQ(i7, 7);
1314 EXPECT_EQ(i8, 8);
1315 EXPECT_EQ(i9, 9);
1316 EXPECT_EQ(i10, 10);
1317
Andreas Gampec200a4a2014-06-16 18:39:09 -07001318 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001319 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001320 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001321 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001322 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001323 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001324 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001325 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001326 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001327 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001328 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001329 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001330 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001331 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001332 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001333 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001334 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001335 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001336 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001337 EXPECT_EQ(i20, 20);
1338}
1339
1340TEST_F(JniCompilerTest, StackArgsIntsFirst) {
1341 TEST_DISABLED_FOR_PORTABLE();
1342 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
1343 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst));
1344
1345 jint i1 = 1;
1346 jint i2 = 2;
1347 jint i3 = 3;
1348 jint i4 = 4;
1349 jint i5 = 5;
1350 jint i6 = 6;
1351 jint i7 = 7;
1352 jint i8 = 8;
1353 jint i9 = 9;
1354 jint i10 = 10;
1355
Andreas Gampec200a4a2014-06-16 18:39:09 -07001356 jfloat f1 = bit_cast<jint, jfloat>(11);
1357 jfloat f2 = bit_cast<jint, jfloat>(12);
1358 jfloat f3 = bit_cast<jint, jfloat>(13);
1359 jfloat f4 = bit_cast<jint, jfloat>(14);
1360 jfloat f5 = bit_cast<jint, jfloat>(15);
1361 jfloat f6 = bit_cast<jint, jfloat>(16);
1362 jfloat f7 = bit_cast<jint, jfloat>(17);
1363 jfloat f8 = bit_cast<jint, jfloat>(18);
1364 jfloat f9 = bit_cast<jint, jfloat>(19);
1365 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001366
1367 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1368 f3, f4, f5, f6, f7, f8, f9, f10);
1369}
1370
1371void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv* env, jclass klass, jfloat f1, jfloat f2,
1372 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1373 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1374 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1375 jint i9, jint i10) {
1376 EXPECT_EQ(i1, 1);
1377 EXPECT_EQ(i2, 2);
1378 EXPECT_EQ(i3, 3);
1379 EXPECT_EQ(i4, 4);
1380 EXPECT_EQ(i5, 5);
1381 EXPECT_EQ(i6, 6);
1382 EXPECT_EQ(i7, 7);
1383 EXPECT_EQ(i8, 8);
1384 EXPECT_EQ(i9, 9);
1385 EXPECT_EQ(i10, 10);
1386
Andreas Gampec200a4a2014-06-16 18:39:09 -07001387 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001388 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001389 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001390 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001391 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001392 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001393 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001394 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001395 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001396 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001397 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001398 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001399 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001400 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001401 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001402 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001403 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001404 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001405 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001406 EXPECT_EQ(i20, 20);
1407}
1408
1409TEST_F(JniCompilerTest, StackArgsFloatsFirst) {
1410 TEST_DISABLED_FOR_PORTABLE();
1411 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
1412 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst));
1413
1414 jint i1 = 1;
1415 jint i2 = 2;
1416 jint i3 = 3;
1417 jint i4 = 4;
1418 jint i5 = 5;
1419 jint i6 = 6;
1420 jint i7 = 7;
1421 jint i8 = 8;
1422 jint i9 = 9;
1423 jint i10 = 10;
1424
Andreas Gampec200a4a2014-06-16 18:39:09 -07001425 jfloat f1 = bit_cast<jint, jfloat>(11);
1426 jfloat f2 = bit_cast<jint, jfloat>(12);
1427 jfloat f3 = bit_cast<jint, jfloat>(13);
1428 jfloat f4 = bit_cast<jint, jfloat>(14);
1429 jfloat f5 = bit_cast<jint, jfloat>(15);
1430 jfloat f6 = bit_cast<jint, jfloat>(16);
1431 jfloat f7 = bit_cast<jint, jfloat>(17);
1432 jfloat f8 = bit_cast<jint, jfloat>(18);
1433 jfloat f9 = bit_cast<jint, jfloat>(19);
1434 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001435
1436 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
1437 i4, i5, i6, i7, i8, i9, i10);
1438}
1439
1440void Java_MyClassNatives_stackArgsMixed(JNIEnv* env, jclass klass, jint i1, jfloat f1, jint i2,
1441 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
1442 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
1443 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
1444 EXPECT_EQ(i1, 1);
1445 EXPECT_EQ(i2, 2);
1446 EXPECT_EQ(i3, 3);
1447 EXPECT_EQ(i4, 4);
1448 EXPECT_EQ(i5, 5);
1449 EXPECT_EQ(i6, 6);
1450 EXPECT_EQ(i7, 7);
1451 EXPECT_EQ(i8, 8);
1452 EXPECT_EQ(i9, 9);
1453 EXPECT_EQ(i10, 10);
1454
Andreas Gampec200a4a2014-06-16 18:39:09 -07001455 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001456 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001457 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001458 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001459 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001460 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001461 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001462 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001463 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001464 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001465 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001466 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001467 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001468 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001469 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001470 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001471 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001472 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001473 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001474 EXPECT_EQ(i20, 20);
1475}
1476
1477TEST_F(JniCompilerTest, StackArgsMixed) {
1478 TEST_DISABLED_FOR_PORTABLE();
1479 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
1480 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed));
1481
1482 jint i1 = 1;
1483 jint i2 = 2;
1484 jint i3 = 3;
1485 jint i4 = 4;
1486 jint i5 = 5;
1487 jint i6 = 6;
1488 jint i7 = 7;
1489 jint i8 = 8;
1490 jint i9 = 9;
1491 jint i10 = 10;
1492
Andreas Gampec200a4a2014-06-16 18:39:09 -07001493 jfloat f1 = bit_cast<jint, jfloat>(11);
1494 jfloat f2 = bit_cast<jint, jfloat>(12);
1495 jfloat f3 = bit_cast<jint, jfloat>(13);
1496 jfloat f4 = bit_cast<jint, jfloat>(14);
1497 jfloat f5 = bit_cast<jint, jfloat>(15);
1498 jfloat f6 = bit_cast<jint, jfloat>(16);
1499 jfloat f7 = bit_cast<jint, jfloat>(17);
1500 jfloat f8 = bit_cast<jint, jfloat>(18);
1501 jfloat f9 = bit_cast<jint, jfloat>(19);
1502 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001503
1504 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
1505 f7, i8, f8, i9, f9, i10, f10);
1506}
1507
Ian Rogersb033c752011-07-20 12:22:35 -07001508} // namespace art