blob: 995ea46993a6848d8bcfb876736d600e078e609a [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Ian Rogersb033c752011-07-20 12:22:35 -070016
Ian Rogers700a4022014-05-19 16:49:03 -070017#include <memory>
18
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070019#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080020#include "common_compiler_test.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070021#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070022#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070023#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070024#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070025#include "mem_map.h"
Brian Carlstromea46f952013-07-30 01:26:50 -070026#include "mirror/art_method-inl.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070027#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080028#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080029#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070030#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080031#include "mirror/stack_trace_element.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070032#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070033#include "ScopedLocalRef.h"
34#include "scoped_thread_state_change.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070035#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070036
Elliott Hughesb264f082012-04-06 17:10:10 -070037extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080038 return count + 1;
39}
40
Elliott Hughesb264f082012-04-06 17:10:10 -070041extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080042 return count + 1;
43}
44
Ian Rogersb033c752011-07-20 12:22:35 -070045namespace art {
46
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080047class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -070048 protected:
Ian Rogers00f7d0e2012-07-19 15:28:27 -070049 void CompileForTest(jobject class_loader, bool direct,
Brian Carlstrom40381fb2011-10-19 14:13:40 -070050 const char* method_name, const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070051 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -070052 StackHandleScope<1> hs(soa.Self());
53 Handle<mirror::ClassLoader> loader(
54 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -070055 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -080056 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Brian Carlstromea46f952013-07-30 01:26:50 -070057 mirror::ArtMethod* method;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070058 if (direct) {
buzbeec143c552011-08-20 17:38:58 -070059 method = c->FindDirectMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070060 } else {
buzbeec143c552011-08-20 17:38:58 -070061 method = c->FindVirtualMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070062 }
Andreas Gampecf4035a2014-05-28 22:43:01 -070063 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Ian Rogers04c31d22014-07-07 21:44:06 -070064 if (method->GetEntryPointFromQuickCompiledCode() == nullptr ||
65 method->GetEntryPointFromQuickCompiledCode() == class_linker_->GetQuickGenericJniTrampoline()) {
Ian Rogersef7d42f2014-01-06 12:55:46 -080066 CompileMethod(method);
67 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
68 << method_name << " " << method_sig;
69 ASSERT_TRUE(method->GetEntryPointFromPortableCompiledCode() != nullptr)
70 << method_name << " " << method_sig;
Brian Carlstrom25c33252011-09-18 15:58:35 -070071 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070072 }
73
Ian Rogers00f7d0e2012-07-19 15:28:27 -070074 void SetUpForTest(bool direct, const char* method_name, const char* method_sig,
Brian Carlstrom25c33252011-09-18 15:58:35 -070075 void* native_fnptr) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070076 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -070077 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070078 {
79 ScopedObjectAccess soa(Thread::Current());
80 class_loader_ = LoadDex("MyClassNatives");
81 }
82 CompileForTest(class_loader_, direct, method_name, method_sig);
83 // Start runtime.
84 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -070085 bool started = runtime_->Start();
86 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -070087 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -070088 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -070089 env_ = Thread::Current()->GetJniEnv();
Elliott Hughesb264f082012-04-06 17:10:10 -070090 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -070091 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070092
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070093 if (direct) {
94 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
95 } else {
96 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
97 }
Andreas Gampecf4035a2014-05-28 22:43:01 -070098 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070099
Andreas Gampecf4035a2014-05-28 22:43:01 -0700100 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700101 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700102 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
103 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700104 } else {
105 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700106 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700107
108 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
109 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700110 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700111 }
112
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700113 public:
114 static jclass jklass_;
115 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700116 static jobject class_loader_;
117
Elliott Hughesa21039c2012-06-21 12:09:25 -0700118
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700119 protected:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700120 JNIEnv* env_;
121 jmethodID jmethod_;
Ian Rogersb033c752011-07-20 12:22:35 -0700122};
123
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700124jclass JniCompilerTest::jklass_;
125jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700126jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700127
Andreas Gampecf4035a2014-05-28 22:43:01 -0700128
Elliott Hughesb264f082012-04-06 17:10:10 -0700129int gJava_MyClassNatives_foo_calls = 0;
130void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700131 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700132 EXPECT_EQ(kNative, Thread::Current()->GetState());
133 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700134 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700135 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700136 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700137 gJava_MyClassNatives_foo_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800138 ScopedObjectAccess soa(Thread::Current());
139 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700140}
141
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700142TEST_F(JniCompilerTest, CompileAndRunNoArgMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800143 TEST_DISABLED_FOR_PORTABLE();
Ian Rogersef7d42f2014-01-06 12:55:46 -0800144 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700145
Elliott Hughesb264f082012-04-06 17:10:10 -0700146 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700147 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700148 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700149 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700150 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700151}
152
Shih-wei Liao31384c52011-09-06 15:27:45 -0700153TEST_F(JniCompilerTest, CompileAndRunIntMethodThroughStub) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800154 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700155 SetUpForTest(false, "bar", "(I)I", nullptr);
156 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700157
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
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100723int gJava_MyClassNatives_GetSinkProperties_calls = 0;
724jarray Java_MyClassNatives_GetSinkProperties(JNIEnv* env, jobject thisObj, jstring s) {
725 // 1 = thisObj
726 Thread* self = Thread::Current();
727 EXPECT_EQ(kNative, self->GetState());
728 Locks::mutator_lock_->AssertNotHeld(self);
729 EXPECT_EQ(self->GetJniEnv(), env);
730 EXPECT_TRUE(thisObj != nullptr);
731 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
732 EXPECT_EQ(s, nullptr);
733 gJava_MyClassNatives_GetSinkProperties_calls++;
734 ScopedObjectAccess soa(self);
735 EXPECT_EQ(2U, self->NumStackReferences());
736 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object*>(thisObj)));
737 return nullptr;
738}
739
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700740TEST_F(JniCompilerTest, GetSinkPropertiesNative) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800741 TEST_DISABLED_FOR_PORTABLE();
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100742 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
743 reinterpret_cast<void*>(&Java_MyClassNatives_GetSinkProperties));
744
745 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls);
746 jarray result = down_cast<jarray>(
747 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
748 EXPECT_EQ(nullptr, result);
749 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls);
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700750}
751
Elliott Hughesb264f082012-04-06 17:10:10 -0700752// This should return jclass, but we're imitating a bug pattern.
753jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
754 return env->NewStringUTF("not a class!");
755}
756
757// This should return jclass, but we're imitating a bug pattern.
758jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
759 return env->NewStringUTF("not a class!");
760}
761
762TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800763 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700764 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700765 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
766
767 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700768 // TODO: check type of returns with portable JNI compiler.
769 // This native method is bad, and tries to return a jstring as a jclass.
770 env_->CallObjectMethod(jobj_, jmethod_);
771 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
772
773 // Here, we just call the method incorrectly; we should catch that too.
Elliott Hughesb264f082012-04-06 17:10:10 -0700774 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700775 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
776 env_->CallStaticVoidMethod(jklass_, jmethod_);
777 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700778}
779
780TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800781 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700782 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700783 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
784
785 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700786 // TODO: check type of returns with portable JNI compiler.
787 // This native method is bad, and tries to return a jstring as a jclass.
788 env_->CallStaticObjectMethod(jklass_, jmethod_);
789 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
790
791 // Here, we just call the method incorrectly; we should catch that too.
792 env_->CallStaticVoidMethod(jklass_, jmethod_);
793 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 -0700794 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700795 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700796}
797
798// This should take jclass, but we're imitating a bug pattern.
799void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
800}
801
802// This should take jclass, but we're imitating a bug pattern.
803void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
804}
805
806TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800807 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700808 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700809 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
810
811 CheckJniAbortCatcher check_jni_abort_catcher;
812 // We deliberately pass a bad second argument here.
813 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700814 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700815}
816
817TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800818 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700819 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700820 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
821
822 CheckJniAbortCatcher check_jni_abort_catcher;
823 // We deliberately pass a bad second argument here.
824 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700825 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700826}
827
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800828jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
829 EXPECT_EQ(kNative, Thread::Current()->GetState());
830 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700831 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800832 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
833 ScopedObjectAccess soa(Thread::Current());
834 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
835 return f1 - f2; // non-commutative operator
836}
837
838TEST_F(JniCompilerTest, CompileAndRunFloatFloatMethod) {
839 TEST_DISABLED_FOR_PORTABLE();
840 SetUpForTest(false, "checkFloats", "(FF)F",
841 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
842
843 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
844 99.0F, 10.0F);
845 EXPECT_EQ(99.0F - 10.0F, result);
846 jfloat a = 3.14159F;
847 jfloat b = 0.69314F;
848 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
849 EXPECT_EQ(a - b, result);
850}
851
852void Java_MyClassNatives_checkParameterAlign(JNIEnv* env, jobject thisObj, jint i1, jlong l1) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700853// EXPECT_EQ(kNative, Thread::Current()->GetState());
854// EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
855// EXPECT_TRUE(thisObj != nullptr);
856// EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
857// ScopedObjectAccess soa(Thread::Current());
858// EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800859 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -0700860 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800861}
862
863TEST_F(JniCompilerTest, CheckParameterAlign) {
864 TEST_DISABLED_FOR_PORTABLE();
865 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
866 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
867
Ian Rogers0f678472014-03-10 16:18:37 -0700868 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800869}
870
871void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
872 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
873 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
874 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
875 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
876 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
877 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
878 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
879 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
880 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
881 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
882 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
883 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
884 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
885 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
886 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
887 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
888 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
889 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
890 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
891 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
892 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
893 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
894 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
895 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
896 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
897 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
898 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
899 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
900 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
901 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
902 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
903 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
904 EXPECT_EQ(kNative, Thread::Current()->GetState());
905 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700906 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800907 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
908 ScopedObjectAccess soa(Thread::Current());
909 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
910
911 // two tests possible
912 if (o0 == nullptr) {
913 // 1) everything is null
914 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
915 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
916 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
917 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
918 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
919 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
920 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
921 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
922 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
923 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
924 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
925 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
926 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
927 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
928 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
929 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
930 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
931 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
932 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
933 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
934 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
935 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
936 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
937 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
938 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
939 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
940 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
941 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
942 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
943 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
944 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
945 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
946 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
947 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
948 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
949 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
950 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
951 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
952 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
953 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
954 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
955 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
956 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
957 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
958 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
959 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
960 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
961 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
962 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
963 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
964 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
965 } else {
966 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
967 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
968 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
969 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
970 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
971 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
972 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
973 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
974 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
975 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
976 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
977 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
978 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
979 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
980 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
981 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
982 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
983 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
984 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
985 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
986 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
987 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
988 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
989 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
990 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
991 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
992 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
993 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
994 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
995 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
996 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
997 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
998 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
999 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1000 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1001 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1002 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1003 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1004 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1005 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1006 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1007 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1008 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1009 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1010 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1011 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1012 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1013 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1014 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1015 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1016 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1017 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1018 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1019 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1020 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1021 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1022 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1023 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1024 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1025 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1026 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1027 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1028 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1029 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1030 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1031 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1032 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1033 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1034 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1035 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1036 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1037 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1038 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1039 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1040 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1041 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1042 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1043 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1044 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1045 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1046 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1047 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1048 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1049 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1050 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1051 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1052 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1053 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1054 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1055 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1056 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1057 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1058 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1059 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1060 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1061 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1062 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1063 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1064 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1065 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1066 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1067 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1068 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1069 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1070 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1071 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1072 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1073 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1074 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1075 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1076 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1077 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1078 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1079 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1080 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1081 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1082 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1083 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1084 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1085 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1086 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1087 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1088 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1089 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1090 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1091 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1092 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1093 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1094 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1095 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1096 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1097 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1098 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1099 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1100 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1101 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1102 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1103 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1104 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1105 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1106 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1107 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1108 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1109 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1110 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1111 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1112 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1113 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1114 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1115 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1116 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1117 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1118 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1119 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1120 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1121 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1122 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1123 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1124 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1125 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1126 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1127 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1128 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1129 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1130 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1131 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1132 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1133 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1134 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1135 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1136 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1137 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1138 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1139 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1140 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1141 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1142 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1143 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1144 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1145 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1146 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1147 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1148 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1149 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1150 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1151 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1152 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1153 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1154 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1155 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1156 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1157 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1158 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1159 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1160 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1161 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1162 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1163 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1164 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1165 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1166 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1167 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1168 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1169 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1170 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1171 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1172 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1173 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1174 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1175 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1176 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1177 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1178 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1179 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1180 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1181 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1182 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1183 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1184 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1185 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1186 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1187 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1188 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1189 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1190 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1191 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1192 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1193 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1194 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1195 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1196 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1197 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1198 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1199 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1200 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1201 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1202 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1203 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1204 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1205 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1206 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1207 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1208 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1209 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1210 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1211 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1212 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1213 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1214 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1215 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1216 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1217 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1218 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1219 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1220 }
1221}
1222
1223const char* longSig =
1224 "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1225 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1226 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1227 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1228 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1229 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1230 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1231 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1232 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1233 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1234 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1235 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1236 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1237 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1238 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1239 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1240 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1241 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1242 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1243 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1244 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1245 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1246 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1247 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1248 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1249 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1250 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1251 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1252 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1253 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1254 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1255 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1256 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1257 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1258 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1259 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1260 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1261 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1262 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1263 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1264 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1265 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1266 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1267 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1268 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1269 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1270 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1271 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1272 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1273 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1274 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1275
1276TEST_F(JniCompilerTest, MaxParamNumber) {
1277 TEST_DISABLED_FOR_PORTABLE();
1278 SetUpForTest(false, "maxParamNumber", longSig,
1279 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1280
1281 jvalue args[254];
1282
1283 // First test: test with all arguments null.
1284 for (int i = 0; i < 254; ++i) {
1285 args[i].l = nullptr;
1286 }
1287
1288 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1289
1290 // Second test: test with int[] objects with increasing lengths
1291 for (int i = 0; i < 254; ++i) {
1292 jintArray tmp = env_->NewIntArray(i);
1293 args[i].l = tmp;
1294 EXPECT_NE(args[i].l, nullptr);
1295 }
1296
1297 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1298}
1299
Andreas Gampead615172014-04-04 16:20:13 -07001300TEST_F(JniCompilerTest, WithoutImplementation) {
1301 TEST_DISABLED_FOR_PORTABLE();
1302 SetUpForTest(false, "withoutImplementation", "()V", nullptr);
1303
1304 env_->CallVoidMethod(jobj_, jmethod_);
1305
1306 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1307 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1308}
1309
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001310void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv* env, jclass klass, jint i1, jint i2, jint i3,
1311 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1312 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1313 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1314 jfloat f10) {
1315 EXPECT_EQ(i1, 1);
1316 EXPECT_EQ(i2, 2);
1317 EXPECT_EQ(i3, 3);
1318 EXPECT_EQ(i4, 4);
1319 EXPECT_EQ(i5, 5);
1320 EXPECT_EQ(i6, 6);
1321 EXPECT_EQ(i7, 7);
1322 EXPECT_EQ(i8, 8);
1323 EXPECT_EQ(i9, 9);
1324 EXPECT_EQ(i10, 10);
1325
Andreas Gampec200a4a2014-06-16 18:39:09 -07001326 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001327 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001328 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001329 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001330 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001331 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001332 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001333 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001334 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001335 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001336 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001337 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001338 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001339 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001340 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001341 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001342 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001343 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001344 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001345 EXPECT_EQ(i20, 20);
1346}
1347
1348TEST_F(JniCompilerTest, StackArgsIntsFirst) {
1349 TEST_DISABLED_FOR_PORTABLE();
1350 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
1351 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst));
1352
1353 jint i1 = 1;
1354 jint i2 = 2;
1355 jint i3 = 3;
1356 jint i4 = 4;
1357 jint i5 = 5;
1358 jint i6 = 6;
1359 jint i7 = 7;
1360 jint i8 = 8;
1361 jint i9 = 9;
1362 jint i10 = 10;
1363
Andreas Gampec200a4a2014-06-16 18:39:09 -07001364 jfloat f1 = bit_cast<jint, jfloat>(11);
1365 jfloat f2 = bit_cast<jint, jfloat>(12);
1366 jfloat f3 = bit_cast<jint, jfloat>(13);
1367 jfloat f4 = bit_cast<jint, jfloat>(14);
1368 jfloat f5 = bit_cast<jint, jfloat>(15);
1369 jfloat f6 = bit_cast<jint, jfloat>(16);
1370 jfloat f7 = bit_cast<jint, jfloat>(17);
1371 jfloat f8 = bit_cast<jint, jfloat>(18);
1372 jfloat f9 = bit_cast<jint, jfloat>(19);
1373 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001374
1375 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1376 f3, f4, f5, f6, f7, f8, f9, f10);
1377}
1378
1379void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv* env, jclass klass, jfloat f1, jfloat f2,
1380 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1381 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1382 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1383 jint i9, jint i10) {
1384 EXPECT_EQ(i1, 1);
1385 EXPECT_EQ(i2, 2);
1386 EXPECT_EQ(i3, 3);
1387 EXPECT_EQ(i4, 4);
1388 EXPECT_EQ(i5, 5);
1389 EXPECT_EQ(i6, 6);
1390 EXPECT_EQ(i7, 7);
1391 EXPECT_EQ(i8, 8);
1392 EXPECT_EQ(i9, 9);
1393 EXPECT_EQ(i10, 10);
1394
Andreas Gampec200a4a2014-06-16 18:39:09 -07001395 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001396 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001397 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001398 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001399 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001400 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001401 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001402 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001403 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001404 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001405 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001406 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001407 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001408 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001409 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001410 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001411 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001412 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001413 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001414 EXPECT_EQ(i20, 20);
1415}
1416
1417TEST_F(JniCompilerTest, StackArgsFloatsFirst) {
1418 TEST_DISABLED_FOR_PORTABLE();
1419 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
1420 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst));
1421
1422 jint i1 = 1;
1423 jint i2 = 2;
1424 jint i3 = 3;
1425 jint i4 = 4;
1426 jint i5 = 5;
1427 jint i6 = 6;
1428 jint i7 = 7;
1429 jint i8 = 8;
1430 jint i9 = 9;
1431 jint i10 = 10;
1432
Andreas Gampec200a4a2014-06-16 18:39:09 -07001433 jfloat f1 = bit_cast<jint, jfloat>(11);
1434 jfloat f2 = bit_cast<jint, jfloat>(12);
1435 jfloat f3 = bit_cast<jint, jfloat>(13);
1436 jfloat f4 = bit_cast<jint, jfloat>(14);
1437 jfloat f5 = bit_cast<jint, jfloat>(15);
1438 jfloat f6 = bit_cast<jint, jfloat>(16);
1439 jfloat f7 = bit_cast<jint, jfloat>(17);
1440 jfloat f8 = bit_cast<jint, jfloat>(18);
1441 jfloat f9 = bit_cast<jint, jfloat>(19);
1442 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001443
1444 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
1445 i4, i5, i6, i7, i8, i9, i10);
1446}
1447
1448void Java_MyClassNatives_stackArgsMixed(JNIEnv* env, jclass klass, jint i1, jfloat f1, jint i2,
1449 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
1450 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
1451 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
1452 EXPECT_EQ(i1, 1);
1453 EXPECT_EQ(i2, 2);
1454 EXPECT_EQ(i3, 3);
1455 EXPECT_EQ(i4, 4);
1456 EXPECT_EQ(i5, 5);
1457 EXPECT_EQ(i6, 6);
1458 EXPECT_EQ(i7, 7);
1459 EXPECT_EQ(i8, 8);
1460 EXPECT_EQ(i9, 9);
1461 EXPECT_EQ(i10, 10);
1462
Andreas Gampec200a4a2014-06-16 18:39:09 -07001463 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001464 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001465 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001466 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001467 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001468 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001469 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001470 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001471 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001472 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001473 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001474 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001475 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001476 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001477 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001478 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001479 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001480 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001481 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001482 EXPECT_EQ(i20, 20);
1483}
1484
1485TEST_F(JniCompilerTest, StackArgsMixed) {
1486 TEST_DISABLED_FOR_PORTABLE();
1487 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
1488 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed));
1489
1490 jint i1 = 1;
1491 jint i2 = 2;
1492 jint i3 = 3;
1493 jint i4 = 4;
1494 jint i5 = 5;
1495 jint i6 = 6;
1496 jint i7 = 7;
1497 jint i8 = 8;
1498 jint i9 = 9;
1499 jint i10 = 10;
1500
Andreas Gampec200a4a2014-06-16 18:39:09 -07001501 jfloat f1 = bit_cast<jint, jfloat>(11);
1502 jfloat f2 = bit_cast<jint, jfloat>(12);
1503 jfloat f3 = bit_cast<jint, jfloat>(13);
1504 jfloat f4 = bit_cast<jint, jfloat>(14);
1505 jfloat f5 = bit_cast<jint, jfloat>(15);
1506 jfloat f6 = bit_cast<jint, jfloat>(16);
1507 jfloat f7 = bit_cast<jint, jfloat>(17);
1508 jfloat f8 = bit_cast<jint, jfloat>(18);
1509 jfloat f9 = bit_cast<jint, jfloat>(19);
1510 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001511
1512 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
1513 f7, i8, f8, i9, f9, i10, f10);
1514}
1515
Ian Rogersb033c752011-07-20 12:22:35 -07001516} // namespace art