blob: 8f4eddbea3bb6c44cd9821c77cd4f3d38e8dd7fa [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 Rogersef7d42f2014-01-06 12:55:46 -080064 if (method->GetEntryPointFromQuickCompiledCode() == nullptr) {
65 ASSERT_TRUE(method->GetEntryPointFromPortableCompiledCode() == nullptr);
66 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
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700158 ScopedObjectAccess soa(Thread::Current());
Shih-wei Liao31384c52011-09-06 15:27:45 -0700159 std::string reason;
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700160 StackHandleScope<1> hs(soa.Self());
161 Handle<mirror::ClassLoader> class_loader(
162 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader_)));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700163 ASSERT_TRUE(
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800164 Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader, &reason)) << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700165
166 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
167 EXPECT_EQ(25, result);
168}
169
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800170TEST_F(JniCompilerTest, CompileAndRunStaticIntMethodThroughStub) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800171 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700172 SetUpForTest(true, "sbar", "(I)I", nullptr);
173 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800174
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700175 ScopedObjectAccess soa(Thread::Current());
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800176 std::string reason;
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700177 StackHandleScope<1> hs(soa.Self());
178 Handle<mirror::ClassLoader> class_loader(
179 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader_)));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700180 ASSERT_TRUE(
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800181 Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader, &reason)) << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800182
183 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
184 EXPECT_EQ(43, result);
185}
186
Elliott Hughesb264f082012-04-06 17:10:10 -0700187int gJava_MyClassNatives_fooI_calls = 0;
188jint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700189 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700190 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700191 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700192 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700193 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700194 gJava_MyClassNatives_fooI_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800195 ScopedObjectAccess soa(Thread::Current());
196 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700197 return x;
198}
199
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700200TEST_F(JniCompilerTest, CompileAndRunIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800201 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700202 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700203 reinterpret_cast<void*>(&Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700204
Elliott Hughesb264f082012-04-06 17:10:10 -0700205 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700206 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
207 EXPECT_EQ(42, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700208 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700209 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
210 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700211 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700212}
213
Elliott Hughesb264f082012-04-06 17:10:10 -0700214int gJava_MyClassNatives_fooII_calls = 0;
215jint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700216 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700217 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700218 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700219 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700220 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700221 gJava_MyClassNatives_fooII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800222 ScopedObjectAccess soa(Thread::Current());
223 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700224 return x - y; // non-commutative operator
225}
226
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700227TEST_F(JniCompilerTest, CompileAndRunIntIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800228 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700229 SetUpForTest(false, "fooII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700230 reinterpret_cast<void*>(&Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700231
Elliott Hughesb264f082012-04-06 17:10:10 -0700232 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700233 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
234 EXPECT_EQ(99 - 10, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700235 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700236 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
237 0xCAFED00D);
238 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700239 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700240}
241
Elliott Hughesb264f082012-04-06 17:10:10 -0700242int gJava_MyClassNatives_fooJJ_calls = 0;
243jlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700244 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700245 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers9b269d22011-09-04 14:06:05 -0700246 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700247 EXPECT_TRUE(thisObj != nullptr);
Ian Rogers9b269d22011-09-04 14:06:05 -0700248 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700249 gJava_MyClassNatives_fooJJ_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800250 ScopedObjectAccess soa(Thread::Current());
251 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers9b269d22011-09-04 14:06:05 -0700252 return x - y; // non-commutative operator
253}
254
255TEST_F(JniCompilerTest, CompileAndRunLongLongMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800256 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700257 SetUpForTest(false, "fooJJ", "(JJ)J",
Elliott Hughesb264f082012-04-06 17:10:10 -0700258 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700259
Elliott Hughesb264f082012-04-06 17:10:10 -0700260 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers0f678472014-03-10 16:18:37 -0700261 jlong a = INT64_C(0x1234567890ABCDEF);
262 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700263 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
264 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700265 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700266 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
267 EXPECT_EQ(b - a, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700268 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700269}
270
Elliott Hughesb264f082012-04-06 17:10:10 -0700271int gJava_MyClassNatives_fooDD_calls = 0;
272jdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700273 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700274 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700275 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700276 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700277 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700278 gJava_MyClassNatives_fooDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800279 ScopedObjectAccess soa(Thread::Current());
280 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700281 return x - y; // non-commutative operator
282}
283
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700284TEST_F(JniCompilerTest, CompileAndRunDoubleDoubleMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800285 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700286 SetUpForTest(false, "fooDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700287 reinterpret_cast<void*>(&Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700288
Elliott Hughesb264f082012-04-06 17:10:10 -0700289 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700290 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
291 99.0, 10.0);
292 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700293 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700294 jdouble a = 3.14159265358979323846;
295 jdouble b = 0.69314718055994530942;
296 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
297 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700298 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700299}
300
Elliott Hughes3e778f72012-05-21 15:29:52 -0700301int gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
302jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700303 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700304 EXPECT_EQ(kNative, Thread::Current()->GetState());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700305 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700306 EXPECT_TRUE(thisObj != nullptr);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700307 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
308 gJava_MyClassNatives_fooJJ_synchronized_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800309 ScopedObjectAccess soa(Thread::Current());
310 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700311 return x | y;
312}
313
314TEST_F(JniCompilerTest, CompileAndRun_fooJJ_synchronized) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800315 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700316 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Elliott Hughes3e778f72012-05-21 15:29:52 -0700317 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ_synchronized));
318
319 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls);
320 jlong a = 0x1000000020000000ULL;
321 jlong b = 0x00ff000000aa0000ULL;
322 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
323 EXPECT_EQ(a | b, result);
324 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls);
325}
326
Elliott Hughesb264f082012-04-06 17:10:10 -0700327int gJava_MyClassNatives_fooIOO_calls = 0;
328jobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700329 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700330 // 3 = this + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700331 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700332 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700333 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700334 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700335 gJava_MyClassNatives_fooIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800336 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800337 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
338 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
339 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700340 switch (x) {
341 case 1:
342 return y;
343 case 2:
344 return z;
345 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700346 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700347 }
348}
349
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700350TEST_F(JniCompilerTest, CompileAndRunIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800351 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700352 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700353 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700354 reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700355
Elliott Hughesb264f082012-04-06 17:10:10 -0700356 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700357 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700358 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700359 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700360
Andreas Gampecf4035a2014-05-28 22:43:01 -0700361 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700362 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700363 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700364 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
365 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700366 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700367 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700368 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700369 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700370
Andreas Gampecf4035a2014-05-28 22:43:01 -0700371 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700372 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700373 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700374 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700375 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700376 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700377 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
378 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700379 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700380}
381
Elliott Hughesb264f082012-04-06 17:10:10 -0700382int gJava_MyClassNatives_fooSII_calls = 0;
383jint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700384 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700385 EXPECT_EQ(kNative, Thread::Current()->GetState());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700386 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700387 EXPECT_TRUE(klass != nullptr);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700388 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700389 gJava_MyClassNatives_fooSII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800390 ScopedObjectAccess soa(Thread::Current());
391 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700392 return x + y;
393}
394
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700395TEST_F(JniCompilerTest, CompileAndRunStaticIntIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800396 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700397 SetUpForTest(true, "fooSII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700398 reinterpret_cast<void*>(&Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700399
Elliott Hughesb264f082012-04-06 17:10:10 -0700400 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700401 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
402 EXPECT_EQ(50, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700403 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700404}
405
Elliott Hughesb264f082012-04-06 17:10:10 -0700406int gJava_MyClassNatives_fooSDD_calls = 0;
407jdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700408 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700409 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers7a99c112011-09-07 12:48:27 -0700410 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700411 EXPECT_TRUE(klass != nullptr);
Ian Rogers7a99c112011-09-07 12:48:27 -0700412 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700413 gJava_MyClassNatives_fooSDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800414 ScopedObjectAccess soa(Thread::Current());
415 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers7a99c112011-09-07 12:48:27 -0700416 return x - y; // non-commutative operator
417}
418
419TEST_F(JniCompilerTest, CompileAndRunStaticDoubleDoubleMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800420 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700421 SetUpForTest(true, "fooSDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700422 reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700423
Elliott Hughesb264f082012-04-06 17:10:10 -0700424 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700425 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
426 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700427 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700428 jdouble a = 3.14159265358979323846;
429 jdouble b = 0.69314718055994530942;
430 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
431 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700432 EXPECT_EQ(2, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700433}
434
Elliott Hughesb264f082012-04-06 17:10:10 -0700435int gJava_MyClassNatives_fooSIOO_calls = 0;
436jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700437 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700438 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700439 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700440 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700441 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700442 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700443 gJava_MyClassNatives_fooSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800444 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800445 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
446 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
447 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700448 switch (x) {
449 case 1:
450 return y;
451 case 2:
452 return z;
453 default:
454 return klass;
455 }
456}
457
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700458
459TEST_F(JniCompilerTest, CompileAndRunStaticIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800460 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700461 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700462 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700463 reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700464
Elliott Hughesb264f082012-04-06 17:10:10 -0700465 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700466 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700467 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700468 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700469
Andreas Gampecf4035a2014-05-28 22:43:01 -0700470 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700471 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700472 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700473 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
474 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700475 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700476 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700477 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700478 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700479
Andreas Gampecf4035a2014-05-28 22:43:01 -0700480 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700481 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700482 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700483 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700484 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700485 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700486 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
487 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700488 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700489}
490
Elliott Hughesb264f082012-04-06 17:10:10 -0700491int gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700492jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
493 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700494 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700495 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700496 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700497 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700498 gJava_MyClassNatives_fooSSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800499 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800500 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
501 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
502 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersdf20fe02011-07-20 20:34:16 -0700503 switch (x) {
504 case 1:
505 return y;
506 case 2:
507 return z;
508 default:
509 return klass;
510 }
511}
512
Ian Rogersdf20fe02011-07-20 20:34:16 -0700513TEST_F(JniCompilerTest, CompileAndRunStaticSynchronizedIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800514 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700515 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700516 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700517 reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700518
Elliott Hughesb264f082012-04-06 17:10:10 -0700519 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700520 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700521 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700522 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700523
Andreas Gampecf4035a2014-05-28 22:43:01 -0700524 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700525 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700526 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700527 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
528 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700529 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700530 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700531 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700532 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700533
Andreas Gampecf4035a2014-05-28 22:43:01 -0700534 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700535 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700536 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700537 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700538 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700539 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700540 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
541 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700542 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogersdf20fe02011-07-20 20:34:16 -0700543}
544
Elliott Hughesb264f082012-04-06 17:10:10 -0700545void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -0700546 jclass c = env->FindClass("java/lang/RuntimeException");
547 env->ThrowNew(c, "hello");
548}
Ian Rogers45a76cb2011-07-21 22:00:15 -0700549
Elliott Hughesa2501992011-08-26 19:39:54 -0700550TEST_F(JniCompilerTest, ExceptionHandling) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800551 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700552 {
553 ASSERT_FALSE(runtime_->IsStarted());
554 ScopedObjectAccess soa(Thread::Current());
555 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -0700556
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700557 // all compilation needs to happen before Runtime::Start
558 CompileForTest(class_loader_, false, "foo", "()V");
559 CompileForTest(class_loader_, false, "throwException", "()V");
560 CompileForTest(class_loader_, false, "foo", "()V");
561 }
562 // Start runtime to avoid re-initialization in SetupForTest.
563 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700564 bool started = runtime_->Start();
565 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700566
Elliott Hughesb264f082012-04-06 17:10:10 -0700567 gJava_MyClassNatives_foo_calls = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -0700568
Ian Rogers67375ac2011-09-14 00:55:44 -0700569 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700570 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700571 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700572 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers67375ac2011-09-14 00:55:44 -0700573 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -0700574
Ian Rogers67375ac2011-09-14 00:55:44 -0700575 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700576 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
577 SetUpForTest(false, "throwException", "()V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700578 reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
579 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -0700580 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700581 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700582 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
583 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
584 env_->ExceptionClear();
585 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -0700586
Ian Rogers67375ac2011-09-14 00:55:44 -0700587 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700588 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700589 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700590 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Ian Rogers45a76cb2011-07-21 22:00:15 -0700591}
592
Elliott Hughesb264f082012-04-06 17:10:10 -0700593jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700594 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700595 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700596 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -0700597
598 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +0100599 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -0700600 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800601 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
602 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700603 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700604 EXPECT_EQ(11, trace_array->GetLength());
605
Ian Rogersaaa20802011-09-11 21:47:37 -0700606 // Check stack trace entries have expected values
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700607 for (int32_t i = 0; i < trace_array->GetLength(); ++i) {
608 EXPECT_EQ(-2, trace_array->Get(i)->GetLineNumber());
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800609 mirror::StackTraceElement* ste = trace_array->Get(i);
Ian Rogersaaa20802011-09-11 21:47:37 -0700610 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -0700611 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Ian Rogersaaa20802011-09-11 21:47:37 -0700612 EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700613 }
Ian Rogersaaa20802011-09-11 21:47:37 -0700614
615 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700616 return 0;
617 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -0700618 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700619 EXPECT_TRUE(jklass != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700620 jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700621 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700622
Ian Rogersaaa20802011-09-11 21:47:37 -0700623 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700624 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -0700625
626 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700627 return i + result;
628 }
629}
630
631TEST_F(JniCompilerTest, NativeStackTraceElement) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800632 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700633 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700634 reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700635 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Ian Rogersaaa20802011-09-11 21:47:37 -0700636 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700637}
638
Elliott Hughesb264f082012-04-06 17:10:10 -0700639jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -0700640 return env->NewGlobalRef(x);
641}
642
Ian Rogersb9231c82011-09-05 22:13:19 -0700643TEST_F(JniCompilerTest, ReturnGlobalRef) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800644 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700645 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700646 reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -0700647 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
648 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
649 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
650}
651
Ian Rogersdc51b792011-09-22 20:41:37 -0700652jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
653 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700654 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -0700655 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800656 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -0700657 }
658 return x+1;
659}
660
661TEST_F(JniCompilerTest, LocalReferenceTableClearingTest) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800662 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700663 SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -0700664 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700665 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -0700666 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
667 EXPECT_TRUE(result == i + 1);
668 }
669}
670
Ian Rogersb9231c82011-09-05 22:13:19 -0700671void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
672 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
673 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -0700674 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -0700675 EXPECT_EQ(1234, src_pos);
676 EXPECT_EQ(5678, dst_pos);
677 EXPECT_EQ(9876, length);
678}
679
680TEST_F(JniCompilerTest, JavaLangSystemArrayCopy) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800681 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700682 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Ian Rogersb9231c82011-09-05 22:13:19 -0700683 reinterpret_cast<void*>(&my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -0700684 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -0700685}
686
Ian Rogers67375ac2011-09-14 00:55:44 -0700687jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
688 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
689 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -0700690 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -0700691 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
692 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
693 return JNI_TRUE;
694}
695
696TEST_F(JniCompilerTest, CompareAndSwapInt) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800697 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700698 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Ian Rogers67375ac2011-09-14 00:55:44 -0700699 reinterpret_cast<void*>(&my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -0700700 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
701 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -0700702 EXPECT_EQ(result, JNI_TRUE);
703}
704
Ian Rogersc7792842012-03-03 15:36:20 -0800705jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
706 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
707 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
708 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
709 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
710 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
711 return 42;
712}
713
714TEST_F(JniCompilerTest, GetText) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800715 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700716 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Ian Rogersc7792842012-03-03 15:36:20 -0800717 reinterpret_cast<void*>(&my_gettext));
718 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -0700719 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -0800720 EXPECT_EQ(result, 42);
721}
722
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700723TEST_F(JniCompilerTest, GetSinkPropertiesNative) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800724 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700725 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;", nullptr);
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700726 // This space intentionally left blank. Just testing compilation succeeds.
727}
728
Elliott Hughesb264f082012-04-06 17:10:10 -0700729// This should return jclass, but we're imitating a bug pattern.
730jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
731 return env->NewStringUTF("not a class!");
732}
733
734// This should return jclass, but we're imitating a bug pattern.
735jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
736 return env->NewStringUTF("not a class!");
737}
738
739TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800740 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700741 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700742 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
743
744 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700745 // TODO: check type of returns with portable JNI compiler.
746 // This native method is bad, and tries to return a jstring as a jclass.
747 env_->CallObjectMethod(jobj_, jmethod_);
748 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
749
750 // Here, we just call the method incorrectly; we should catch that too.
Elliott Hughesb264f082012-04-06 17:10:10 -0700751 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700752 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
753 env_->CallStaticVoidMethod(jklass_, jmethod_);
754 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700755}
756
757TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800758 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700759 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700760 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
761
762 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700763 // TODO: check type of returns with portable JNI compiler.
764 // This native method is bad, and tries to return a jstring as a jclass.
765 env_->CallStaticObjectMethod(jklass_, jmethod_);
766 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
767
768 // Here, we just call the method incorrectly; we should catch that too.
769 env_->CallStaticVoidMethod(jklass_, jmethod_);
770 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
Elliott Hughesb264f082012-04-06 17:10:10 -0700771 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700772 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700773}
774
775// This should take jclass, but we're imitating a bug pattern.
776void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
777}
778
779// This should take jclass, but we're imitating a bug pattern.
780void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
781}
782
783TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800784 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700785 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700786 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
787
788 CheckJniAbortCatcher check_jni_abort_catcher;
789 // We deliberately pass a bad second argument here.
790 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700791 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700792}
793
794TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800795 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700796 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700797 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
798
799 CheckJniAbortCatcher check_jni_abort_catcher;
800 // We deliberately pass a bad second argument here.
801 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700802 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700803}
804
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800805jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
806 EXPECT_EQ(kNative, Thread::Current()->GetState());
807 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700808 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800809 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
810 ScopedObjectAccess soa(Thread::Current());
811 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
812 return f1 - f2; // non-commutative operator
813}
814
815TEST_F(JniCompilerTest, CompileAndRunFloatFloatMethod) {
816 TEST_DISABLED_FOR_PORTABLE();
817 SetUpForTest(false, "checkFloats", "(FF)F",
818 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
819
820 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
821 99.0F, 10.0F);
822 EXPECT_EQ(99.0F - 10.0F, result);
823 jfloat a = 3.14159F;
824 jfloat b = 0.69314F;
825 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
826 EXPECT_EQ(a - b, result);
827}
828
829void Java_MyClassNatives_checkParameterAlign(JNIEnv* env, jobject thisObj, jint i1, jlong l1) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700830// EXPECT_EQ(kNative, Thread::Current()->GetState());
831// EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
832// EXPECT_TRUE(thisObj != nullptr);
833// EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
834// ScopedObjectAccess soa(Thread::Current());
835// EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800836 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -0700837 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800838}
839
840TEST_F(JniCompilerTest, CheckParameterAlign) {
841 TEST_DISABLED_FOR_PORTABLE();
842 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
843 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
844
Ian Rogers0f678472014-03-10 16:18:37 -0700845 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800846}
847
848void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
849 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
850 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
851 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
852 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
853 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
854 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
855 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
856 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
857 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
858 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
859 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
860 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
861 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
862 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
863 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
864 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
865 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
866 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
867 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
868 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
869 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
870 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
871 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
872 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
873 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
874 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
875 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
876 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
877 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
878 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
879 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
880 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
881 EXPECT_EQ(kNative, Thread::Current()->GetState());
882 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700883 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800884 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
885 ScopedObjectAccess soa(Thread::Current());
886 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
887
888 // two tests possible
889 if (o0 == nullptr) {
890 // 1) everything is null
891 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
892 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
893 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
894 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
895 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
896 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
897 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
898 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
899 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
900 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
901 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
902 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
903 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
904 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
905 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
906 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
907 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
908 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
909 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
910 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
911 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
912 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
913 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
914 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
915 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
916 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
917 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
918 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
919 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
920 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
921 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
922 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
923 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
924 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
925 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
926 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
927 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
928 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
929 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
930 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
931 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
932 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
933 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
934 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
935 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
936 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
937 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
938 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
939 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
940 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
941 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
942 } else {
943 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
944 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
945 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
946 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
947 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
948 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
949 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
950 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
951 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
952 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
953 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
954 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
955 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
956 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
957 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
958 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
959 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
960 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
961 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
962 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
963 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
964 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
965 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
966 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
967 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
968 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
969 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
970 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
971 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
972 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
973 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
974 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
975 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
976 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
977 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
978 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
979 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
980 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
981 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
982 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
983 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
984 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
985 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
986 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
987 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
988 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
989 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
990 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
991 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
992 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
993 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
994 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
995 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
996 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
997 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
998 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
999 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1000 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1001 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1002 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1003 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1004 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1005 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1006 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1007 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1008 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1009 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1010 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1011 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1012 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1013 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1014 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1015 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1016 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1017 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1018 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1019 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1020 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1021 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1022 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1023 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1024 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1025 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1026 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1027 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1028 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1029 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1030 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1031 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1032 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1033 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1034 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1035 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1036 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1037 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1038 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1039 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1040 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1041 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1042 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1043 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1044 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1045 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1046 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1047 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1048 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1049 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1050 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1051 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1052 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1053 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1054 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1055 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1056 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1057 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1058 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1059 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1060 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1061 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1062 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1063 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1064 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1065 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1066 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1067 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1068 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1069 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1070 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1071 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1072 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1073 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1074 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1075 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1076 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1077 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1078 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1079 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1080 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1081 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1082 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1083 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1084 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1085 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1086 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1087 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1088 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1089 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1090 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1091 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1092 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1093 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1094 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1095 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1096 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1097 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1098 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1099 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1100 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1101 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1102 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1103 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1104 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1105 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1106 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1107 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1108 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1109 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1110 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1111 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1112 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1113 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1114 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1115 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1116 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1117 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1118 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1119 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1120 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1121 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1122 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1123 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1124 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1125 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1126 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1127 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1128 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1129 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1130 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1131 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1132 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1133 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1134 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1135 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1136 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1137 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1138 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1139 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1140 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1141 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1142 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1143 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1144 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1145 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1146 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1147 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1148 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1149 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1150 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1151 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1152 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1153 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1154 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1155 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1156 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1157 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1158 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1159 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1160 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1161 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1162 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1163 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1164 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1165 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1166 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1167 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1168 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1169 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1170 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1171 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1172 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1173 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1174 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1175 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1176 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1177 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1178 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1179 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1180 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1181 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1182 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1183 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1184 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1185 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1186 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1187 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1188 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1189 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1190 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1191 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1192 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1193 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1194 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1195 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1196 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1197 }
1198}
1199
1200const char* longSig =
1201 "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1202 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1203 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1204 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1205 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1206 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1207 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1208 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1209 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1210 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1211 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1212 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1213 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1214 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1215 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1216 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1217 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1218 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1219 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1220 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1221 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1222 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1223 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1224 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1225 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1226 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1227 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1228 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1229 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1230 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1231 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1232 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1233 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1234 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1235 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1236 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1237 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1238 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1239 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1240 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1241 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1242 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1243 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1244 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;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;)V";
1252
1253TEST_F(JniCompilerTest, MaxParamNumber) {
1254 TEST_DISABLED_FOR_PORTABLE();
1255 SetUpForTest(false, "maxParamNumber", longSig,
1256 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1257
1258 jvalue args[254];
1259
1260 // First test: test with all arguments null.
1261 for (int i = 0; i < 254; ++i) {
1262 args[i].l = nullptr;
1263 }
1264
1265 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1266
1267 // Second test: test with int[] objects with increasing lengths
1268 for (int i = 0; i < 254; ++i) {
1269 jintArray tmp = env_->NewIntArray(i);
1270 args[i].l = tmp;
1271 EXPECT_NE(args[i].l, nullptr);
1272 }
1273
1274 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1275}
1276
Andreas Gampead615172014-04-04 16:20:13 -07001277TEST_F(JniCompilerTest, WithoutImplementation) {
1278 TEST_DISABLED_FOR_PORTABLE();
1279 SetUpForTest(false, "withoutImplementation", "()V", nullptr);
1280
1281 env_->CallVoidMethod(jobj_, jmethod_);
1282
1283 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1284 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1285}
1286
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001287template <typename U, typename V> V convert(U in) {
1288 DCHECK_LE(sizeof(U), sizeof(V));
1289 union { U u; V v; } tmp;
1290 tmp.u = in;
1291 return tmp.v;
1292}
1293
1294void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv* env, jclass klass, jint i1, jint i2, jint i3,
1295 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1296 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1297 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1298 jfloat f10) {
1299 EXPECT_EQ(i1, 1);
1300 EXPECT_EQ(i2, 2);
1301 EXPECT_EQ(i3, 3);
1302 EXPECT_EQ(i4, 4);
1303 EXPECT_EQ(i5, 5);
1304 EXPECT_EQ(i6, 6);
1305 EXPECT_EQ(i7, 7);
1306 EXPECT_EQ(i8, 8);
1307 EXPECT_EQ(i9, 9);
1308 EXPECT_EQ(i10, 10);
1309
1310 jint i11 = convert<jfloat, jint>(f1);
1311 EXPECT_EQ(i11, 11);
1312 jint i12 = convert<jfloat, jint>(f2);
1313 EXPECT_EQ(i12, 12);
1314 jint i13 = convert<jfloat, jint>(f3);
1315 EXPECT_EQ(i13, 13);
1316 jint i14 = convert<jfloat, jint>(f4);
1317 EXPECT_EQ(i14, 14);
1318 jint i15 = convert<jfloat, jint>(f5);
1319 EXPECT_EQ(i15, 15);
1320 jint i16 = convert<jfloat, jint>(f6);
1321 EXPECT_EQ(i16, 16);
1322 jint i17 = convert<jfloat, jint>(f7);
1323 EXPECT_EQ(i17, 17);
1324 jint i18 = convert<jfloat, jint>(f8);
1325 EXPECT_EQ(i18, 18);
1326 jint i19 = convert<jfloat, jint>(f9);
1327 EXPECT_EQ(i19, 19);
1328 jint i20 = convert<jfloat, jint>(f10);
1329 EXPECT_EQ(i20, 20);
1330}
1331
1332TEST_F(JniCompilerTest, StackArgsIntsFirst) {
1333 TEST_DISABLED_FOR_PORTABLE();
1334 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
1335 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst));
1336
1337 jint i1 = 1;
1338 jint i2 = 2;
1339 jint i3 = 3;
1340 jint i4 = 4;
1341 jint i5 = 5;
1342 jint i6 = 6;
1343 jint i7 = 7;
1344 jint i8 = 8;
1345 jint i9 = 9;
1346 jint i10 = 10;
1347
1348 jfloat f1 = convert<jint, jfloat>(11);
1349 jfloat f2 = convert<jint, jfloat>(12);
1350 jfloat f3 = convert<jint, jfloat>(13);
1351 jfloat f4 = convert<jint, jfloat>(14);
1352 jfloat f5 = convert<jint, jfloat>(15);
1353 jfloat f6 = convert<jint, jfloat>(16);
1354 jfloat f7 = convert<jint, jfloat>(17);
1355 jfloat f8 = convert<jint, jfloat>(18);
1356 jfloat f9 = convert<jint, jfloat>(19);
1357 jfloat f10 = convert<jint, jfloat>(20);
1358
1359 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1360 f3, f4, f5, f6, f7, f8, f9, f10);
1361}
1362
1363void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv* env, jclass klass, jfloat f1, jfloat f2,
1364 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1365 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1366 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1367 jint i9, jint i10) {
1368 EXPECT_EQ(i1, 1);
1369 EXPECT_EQ(i2, 2);
1370 EXPECT_EQ(i3, 3);
1371 EXPECT_EQ(i4, 4);
1372 EXPECT_EQ(i5, 5);
1373 EXPECT_EQ(i6, 6);
1374 EXPECT_EQ(i7, 7);
1375 EXPECT_EQ(i8, 8);
1376 EXPECT_EQ(i9, 9);
1377 EXPECT_EQ(i10, 10);
1378
1379 jint i11 = convert<jfloat, jint>(f1);
1380 EXPECT_EQ(i11, 11);
1381 jint i12 = convert<jfloat, jint>(f2);
1382 EXPECT_EQ(i12, 12);
1383 jint i13 = convert<jfloat, jint>(f3);
1384 EXPECT_EQ(i13, 13);
1385 jint i14 = convert<jfloat, jint>(f4);
1386 EXPECT_EQ(i14, 14);
1387 jint i15 = convert<jfloat, jint>(f5);
1388 EXPECT_EQ(i15, 15);
1389 jint i16 = convert<jfloat, jint>(f6);
1390 EXPECT_EQ(i16, 16);
1391 jint i17 = convert<jfloat, jint>(f7);
1392 EXPECT_EQ(i17, 17);
1393 jint i18 = convert<jfloat, jint>(f8);
1394 EXPECT_EQ(i18, 18);
1395 jint i19 = convert<jfloat, jint>(f9);
1396 EXPECT_EQ(i19, 19);
1397 jint i20 = convert<jfloat, jint>(f10);
1398 EXPECT_EQ(i20, 20);
1399}
1400
1401TEST_F(JniCompilerTest, StackArgsFloatsFirst) {
1402 TEST_DISABLED_FOR_PORTABLE();
1403 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
1404 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst));
1405
1406 jint i1 = 1;
1407 jint i2 = 2;
1408 jint i3 = 3;
1409 jint i4 = 4;
1410 jint i5 = 5;
1411 jint i6 = 6;
1412 jint i7 = 7;
1413 jint i8 = 8;
1414 jint i9 = 9;
1415 jint i10 = 10;
1416
1417 jfloat f1 = convert<jint, jfloat>(11);
1418 jfloat f2 = convert<jint, jfloat>(12);
1419 jfloat f3 = convert<jint, jfloat>(13);
1420 jfloat f4 = convert<jint, jfloat>(14);
1421 jfloat f5 = convert<jint, jfloat>(15);
1422 jfloat f6 = convert<jint, jfloat>(16);
1423 jfloat f7 = convert<jint, jfloat>(17);
1424 jfloat f8 = convert<jint, jfloat>(18);
1425 jfloat f9 = convert<jint, jfloat>(19);
1426 jfloat f10 = convert<jint, jfloat>(20);
1427
1428 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
1429 i4, i5, i6, i7, i8, i9, i10);
1430}
1431
1432void Java_MyClassNatives_stackArgsMixed(JNIEnv* env, jclass klass, jint i1, jfloat f1, jint i2,
1433 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
1434 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
1435 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
1436 EXPECT_EQ(i1, 1);
1437 EXPECT_EQ(i2, 2);
1438 EXPECT_EQ(i3, 3);
1439 EXPECT_EQ(i4, 4);
1440 EXPECT_EQ(i5, 5);
1441 EXPECT_EQ(i6, 6);
1442 EXPECT_EQ(i7, 7);
1443 EXPECT_EQ(i8, 8);
1444 EXPECT_EQ(i9, 9);
1445 EXPECT_EQ(i10, 10);
1446
1447 jint i11 = convert<jfloat, jint>(f1);
1448 EXPECT_EQ(i11, 11);
1449 jint i12 = convert<jfloat, jint>(f2);
1450 EXPECT_EQ(i12, 12);
1451 jint i13 = convert<jfloat, jint>(f3);
1452 EXPECT_EQ(i13, 13);
1453 jint i14 = convert<jfloat, jint>(f4);
1454 EXPECT_EQ(i14, 14);
1455 jint i15 = convert<jfloat, jint>(f5);
1456 EXPECT_EQ(i15, 15);
1457 jint i16 = convert<jfloat, jint>(f6);
1458 EXPECT_EQ(i16, 16);
1459 jint i17 = convert<jfloat, jint>(f7);
1460 EXPECT_EQ(i17, 17);
1461 jint i18 = convert<jfloat, jint>(f8);
1462 EXPECT_EQ(i18, 18);
1463 jint i19 = convert<jfloat, jint>(f9);
1464 EXPECT_EQ(i19, 19);
1465 jint i20 = convert<jfloat, jint>(f10);
1466 EXPECT_EQ(i20, 20);
1467}
1468
1469TEST_F(JniCompilerTest, StackArgsMixed) {
1470 TEST_DISABLED_FOR_PORTABLE();
1471 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
1472 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed));
1473
1474 jint i1 = 1;
1475 jint i2 = 2;
1476 jint i3 = 3;
1477 jint i4 = 4;
1478 jint i5 = 5;
1479 jint i6 = 6;
1480 jint i7 = 7;
1481 jint i8 = 8;
1482 jint i9 = 9;
1483 jint i10 = 10;
1484
1485 jfloat f1 = convert<jint, jfloat>(11);
1486 jfloat f2 = convert<jint, jfloat>(12);
1487 jfloat f3 = convert<jint, jfloat>(13);
1488 jfloat f4 = convert<jint, jfloat>(14);
1489 jfloat f5 = convert<jint, jfloat>(15);
1490 jfloat f6 = convert<jint, jfloat>(16);
1491 jfloat f7 = convert<jint, jfloat>(17);
1492 jfloat f8 = convert<jint, jfloat>(18);
1493 jfloat f9 = convert<jint, jfloat>(19);
1494 jfloat f10 = convert<jint, jfloat>(20);
1495
1496 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
1497 f7, i8, f8, i9, f9, i10, f10);
1498}
1499
Ian Rogersb033c752011-07-20 12:22:35 -07001500} // namespace art