blob: 4a8a8f82e0914e01bade438b35f06befb8a010a6 [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
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +010019#include <math.h>
20
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070021#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080022#include "common_compiler_test.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070023#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070024#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070025#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070026#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070027#include "mem_map.h"
Brian Carlstromea46f952013-07-30 01:26:50 -070028#include "mirror/art_method-inl.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070029#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080030#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080031#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070032#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080033#include "mirror/stack_trace_element.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070034#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070035#include "ScopedLocalRef.h"
36#include "scoped_thread_state_change.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070037#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070038
Elliott Hughesb264f082012-04-06 17:10:10 -070039extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080040 return count + 1;
41}
42
Elliott Hughesb264f082012-04-06 17:10:10 -070043extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080044 return count + 1;
45}
46
Ian Rogersb033c752011-07-20 12:22:35 -070047namespace art {
48
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080049class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -070050 protected:
Ian Rogers00f7d0e2012-07-19 15:28:27 -070051 void CompileForTest(jobject class_loader, bool direct,
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +010052 const char* method_name, const char* method_sig, bool generic = false) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070053 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -070054 StackHandleScope<1> hs(soa.Self());
55 Handle<mirror::ClassLoader> loader(
56 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -070057 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -080058 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Brian Carlstromea46f952013-07-30 01:26:50 -070059 mirror::ArtMethod* method;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070060 if (direct) {
buzbeec143c552011-08-20 17:38:58 -070061 method = c->FindDirectMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070062 } else {
buzbeec143c552011-08-20 17:38:58 -070063 method = c->FindVirtualMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070064 }
Andreas Gampecf4035a2014-05-28 22:43:01 -070065 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +010066 if (generic) {
67 method->SetEntryPointFromQuickCompiledCode(class_linker_->GetQuickGenericJniTrampoline());
68 } else {
69 if (method->GetEntryPointFromQuickCompiledCode() == nullptr ||
70 method->GetEntryPointFromQuickCompiledCode() == class_linker_->GetQuickGenericJniTrampoline()) {
71 CompileMethod(method);
72 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
73 << method_name << " " << method_sig;
74 ASSERT_TRUE(method->GetEntryPointFromPortableCompiledCode() != nullptr)
75 << method_name << " " << method_sig;
76 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070077 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070078 }
79
Ian Rogers00f7d0e2012-07-19 15:28:27 -070080 void SetUpForTest(bool direct, const char* method_name, const char* method_sig,
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +010081 void* native_fnptr, bool generic = false) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070082 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -070083 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070084 {
85 ScopedObjectAccess soa(Thread::Current());
86 class_loader_ = LoadDex("MyClassNatives");
87 }
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +010088 CompileForTest(class_loader_, direct, method_name, method_sig, generic);
Ian Rogers00f7d0e2012-07-19 15:28:27 -070089 // Start runtime.
90 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -070091 bool started = runtime_->Start();
92 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -070093 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -070094 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -070095 env_ = Thread::Current()->GetJniEnv();
Elliott Hughesb264f082012-04-06 17:10:10 -070096 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -070097 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070098
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070099 if (direct) {
100 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
101 } else {
102 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
103 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700104 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700105
Andreas Gampecf4035a2014-05-28 22:43:01 -0700106 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700107 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700108 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
109 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700110 } else {
111 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700112 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700113
114 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
115 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700116 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700117 }
118
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700119 public:
120 static jclass jklass_;
121 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700122 static jobject class_loader_;
123
Elliott Hughesa21039c2012-06-21 12:09:25 -0700124
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700125 protected:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700126 JNIEnv* env_;
127 jmethodID jmethod_;
Ian Rogersb033c752011-07-20 12:22:35 -0700128};
129
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700130jclass JniCompilerTest::jklass_;
131jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700132jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700133
Andreas Gampecf4035a2014-05-28 22:43:01 -0700134
Elliott Hughesb264f082012-04-06 17:10:10 -0700135int gJava_MyClassNatives_foo_calls = 0;
136void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700137 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700138 EXPECT_EQ(kNative, Thread::Current()->GetState());
139 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700140 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700141 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700142 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700143 gJava_MyClassNatives_foo_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800144 ScopedObjectAccess soa(Thread::Current());
145 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700146}
147
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700148TEST_F(JniCompilerTest, CompileAndRunNoArgMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800149 TEST_DISABLED_FOR_PORTABLE();
Ian Rogersef7d42f2014-01-06 12:55:46 -0800150 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700151
Elliott Hughesb264f082012-04-06 17:10:10 -0700152 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700153 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700154 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700155 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700156 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700157}
158
Shih-wei Liao31384c52011-09-06 15:27:45 -0700159TEST_F(JniCompilerTest, CompileAndRunIntMethodThroughStub) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800160 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700161 SetUpForTest(false, "bar", "(I)I", nullptr);
162 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700163
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700164 ScopedObjectAccess soa(Thread::Current());
Shih-wei Liao31384c52011-09-06 15:27:45 -0700165 std::string reason;
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700166 StackHandleScope<1> hs(soa.Self());
167 Handle<mirror::ClassLoader> class_loader(
168 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader_)));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700169 ASSERT_TRUE(
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800170 Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader, &reason)) << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700171
172 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
173 EXPECT_EQ(25, result);
174}
175
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800176TEST_F(JniCompilerTest, CompileAndRunStaticIntMethodThroughStub) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800177 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700178 SetUpForTest(true, "sbar", "(I)I", nullptr);
179 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800180
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700181 ScopedObjectAccess soa(Thread::Current());
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800182 std::string reason;
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700183 StackHandleScope<1> hs(soa.Self());
184 Handle<mirror::ClassLoader> class_loader(
185 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader_)));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700186 ASSERT_TRUE(
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800187 Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader, &reason)) << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800188
189 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
190 EXPECT_EQ(43, result);
191}
192
Elliott Hughesb264f082012-04-06 17:10:10 -0700193int gJava_MyClassNatives_fooI_calls = 0;
194jint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700195 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700196 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700197 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700198 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700199 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700200 gJava_MyClassNatives_fooI_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800201 ScopedObjectAccess soa(Thread::Current());
202 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700203 return x;
204}
205
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700206TEST_F(JniCompilerTest, CompileAndRunIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800207 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700208 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700209 reinterpret_cast<void*>(&Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700210
Elliott Hughesb264f082012-04-06 17:10:10 -0700211 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700212 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
213 EXPECT_EQ(42, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700214 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700215 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
216 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700217 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700218}
219
Elliott Hughesb264f082012-04-06 17:10:10 -0700220int gJava_MyClassNatives_fooII_calls = 0;
221jint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700222 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700223 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700224 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700225 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700226 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700227 gJava_MyClassNatives_fooII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800228 ScopedObjectAccess soa(Thread::Current());
229 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700230 return x - y; // non-commutative operator
231}
232
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700233TEST_F(JniCompilerTest, CompileAndRunIntIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800234 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700235 SetUpForTest(false, "fooII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700236 reinterpret_cast<void*>(&Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700237
Elliott Hughesb264f082012-04-06 17:10:10 -0700238 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700239 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
240 EXPECT_EQ(99 - 10, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700241 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700242 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
243 0xCAFED00D);
244 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700245 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700246}
247
Elliott Hughesb264f082012-04-06 17:10:10 -0700248int gJava_MyClassNatives_fooJJ_calls = 0;
249jlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700250 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700251 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers9b269d22011-09-04 14:06:05 -0700252 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700253 EXPECT_TRUE(thisObj != nullptr);
Ian Rogers9b269d22011-09-04 14:06:05 -0700254 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700255 gJava_MyClassNatives_fooJJ_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800256 ScopedObjectAccess soa(Thread::Current());
257 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers9b269d22011-09-04 14:06:05 -0700258 return x - y; // non-commutative operator
259}
260
261TEST_F(JniCompilerTest, CompileAndRunLongLongMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800262 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700263 SetUpForTest(false, "fooJJ", "(JJ)J",
Elliott Hughesb264f082012-04-06 17:10:10 -0700264 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700265
Elliott Hughesb264f082012-04-06 17:10:10 -0700266 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers0f678472014-03-10 16:18:37 -0700267 jlong a = INT64_C(0x1234567890ABCDEF);
268 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700269 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
270 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700271 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700272 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
273 EXPECT_EQ(b - a, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700274 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700275}
276
Elliott Hughesb264f082012-04-06 17:10:10 -0700277int gJava_MyClassNatives_fooDD_calls = 0;
278jdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700279 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700280 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700281 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700282 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700283 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700284 gJava_MyClassNatives_fooDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800285 ScopedObjectAccess soa(Thread::Current());
286 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700287 return x - y; // non-commutative operator
288}
289
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700290TEST_F(JniCompilerTest, CompileAndRunDoubleDoubleMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800291 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700292 SetUpForTest(false, "fooDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700293 reinterpret_cast<void*>(&Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700294
Elliott Hughesb264f082012-04-06 17:10:10 -0700295 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700296 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
297 99.0, 10.0);
298 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700299 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700300 jdouble a = 3.14159265358979323846;
301 jdouble b = 0.69314718055994530942;
302 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
303 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700304 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700305}
306
Elliott Hughes3e778f72012-05-21 15:29:52 -0700307int gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
308jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700309 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700310 EXPECT_EQ(kNative, Thread::Current()->GetState());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700311 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700312 EXPECT_TRUE(thisObj != nullptr);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700313 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
314 gJava_MyClassNatives_fooJJ_synchronized_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800315 ScopedObjectAccess soa(Thread::Current());
316 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700317 return x | y;
318}
319
320TEST_F(JniCompilerTest, CompileAndRun_fooJJ_synchronized) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800321 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700322 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Elliott Hughes3e778f72012-05-21 15:29:52 -0700323 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ_synchronized));
324
325 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls);
326 jlong a = 0x1000000020000000ULL;
327 jlong b = 0x00ff000000aa0000ULL;
328 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
329 EXPECT_EQ(a | b, result);
330 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls);
331}
332
Elliott Hughesb264f082012-04-06 17:10:10 -0700333int gJava_MyClassNatives_fooIOO_calls = 0;
334jobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700335 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700336 // 3 = this + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700337 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700338 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700339 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700340 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700341 gJava_MyClassNatives_fooIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800342 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800343 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
344 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
345 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700346 switch (x) {
347 case 1:
348 return y;
349 case 2:
350 return z;
351 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700352 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700353 }
354}
355
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700356TEST_F(JniCompilerTest, CompileAndRunIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800357 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700358 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700359 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700360 reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700361
Elliott Hughesb264f082012-04-06 17:10:10 -0700362 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700363 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700364 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700365 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700366
Andreas Gampecf4035a2014-05-28 22:43:01 -0700367 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700368 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700369 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700370 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
371 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700372 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700373 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700374 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700375 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700376
Andreas Gampecf4035a2014-05-28 22:43:01 -0700377 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700378 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700379 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700380 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700381 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700382 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700383 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
384 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700385 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700386}
387
Elliott Hughesb264f082012-04-06 17:10:10 -0700388int gJava_MyClassNatives_fooSII_calls = 0;
389jint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700390 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700391 EXPECT_EQ(kNative, Thread::Current()->GetState());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700392 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700393 EXPECT_TRUE(klass != nullptr);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700394 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700395 gJava_MyClassNatives_fooSII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800396 ScopedObjectAccess soa(Thread::Current());
397 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700398 return x + y;
399}
400
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700401TEST_F(JniCompilerTest, CompileAndRunStaticIntIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800402 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700403 SetUpForTest(true, "fooSII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700404 reinterpret_cast<void*>(&Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700405
Elliott Hughesb264f082012-04-06 17:10:10 -0700406 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700407 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
408 EXPECT_EQ(50, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700409 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700410}
411
Elliott Hughesb264f082012-04-06 17:10:10 -0700412int gJava_MyClassNatives_fooSDD_calls = 0;
413jdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700414 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700415 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers7a99c112011-09-07 12:48:27 -0700416 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700417 EXPECT_TRUE(klass != nullptr);
Ian Rogers7a99c112011-09-07 12:48:27 -0700418 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700419 gJava_MyClassNatives_fooSDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800420 ScopedObjectAccess soa(Thread::Current());
421 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers7a99c112011-09-07 12:48:27 -0700422 return x - y; // non-commutative operator
423}
424
425TEST_F(JniCompilerTest, CompileAndRunStaticDoubleDoubleMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800426 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700427 SetUpForTest(true, "fooSDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700428 reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700429
Elliott Hughesb264f082012-04-06 17:10:10 -0700430 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700431 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
432 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700433 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700434 jdouble a = 3.14159265358979323846;
435 jdouble b = 0.69314718055994530942;
436 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
437 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700438 EXPECT_EQ(2, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700439}
440
Nicolas Geoffrayebee8de2014-08-13 03:40:45 +0100441// The x86 generic JNI code had a bug where it assumed a floating
442// point return value would be in xmm0. We use log, to somehow ensure
443// the compiler will use the floating point stack.
444
445jdouble Java_MyClassNatives_logD(JNIEnv* env, jclass klass, jdouble x) {
446 return log(x);
447}
448
449TEST_F(JniCompilerTest, RunGenericStaticLogDoubleethod) {
450 TEST_DISABLED_FOR_PORTABLE();
451 TEST_DISABLED_FOR_MIPS();
452 SetUpForTest(true, "logD", "(D)D",
453 reinterpret_cast<void*>(&Java_MyClassNatives_logD), true);
454
455 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
456 EXPECT_EQ(log(2.0), result);
457}
458
459jfloat Java_MyClassNatives_logF(JNIEnv* env, jclass klass, jfloat x) {
460 return logf(x);
461}
462
463TEST_F(JniCompilerTest, RunGenericStaticLogFloatMethod) {
464 TEST_DISABLED_FOR_PORTABLE();
465 TEST_DISABLED_FOR_MIPS();
466 SetUpForTest(true, "logF", "(F)F",
467 reinterpret_cast<void*>(&Java_MyClassNatives_logF), true);
468
469 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
470 EXPECT_EQ(logf(2.0), result);
471}
472
473jboolean Java_MyClassNatives_returnTrue(JNIEnv* env, jclass klass) {
474 return JNI_TRUE;
475}
476
477jboolean Java_MyClassNatives_returnFalse(JNIEnv* env, jclass klass) {
478 return JNI_FALSE;
479}
480
481jint Java_MyClassNatives_returnInt(JNIEnv* env, jclass klass) {
482 return 42;
483}
484
485TEST_F(JniCompilerTest, RunGenericStaticReturnTrue) {
486 TEST_DISABLED_FOR_PORTABLE();
487 TEST_DISABLED_FOR_MIPS();
488 SetUpForTest(true, "returnTrue", "()Z",
489 reinterpret_cast<void*>(&Java_MyClassNatives_returnTrue), true);
490
491 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
492 EXPECT_TRUE(result);
493}
494
495TEST_F(JniCompilerTest, RunGenericStaticReturnFalse) {
496 TEST_DISABLED_FOR_PORTABLE();
497 TEST_DISABLED_FOR_MIPS();
498 SetUpForTest(true, "returnFalse", "()Z",
499 reinterpret_cast<void*>(&Java_MyClassNatives_returnFalse), true);
500
501 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
502 EXPECT_FALSE(result);
503}
504
505TEST_F(JniCompilerTest, RunGenericStaticReturnInt) {
506 TEST_DISABLED_FOR_PORTABLE();
507 TEST_DISABLED_FOR_MIPS();
508 SetUpForTest(true, "returnInt", "()I",
509 reinterpret_cast<void*>(&Java_MyClassNatives_returnInt), true);
510
511 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
512 EXPECT_EQ(42, result);
513}
514
Elliott Hughesb264f082012-04-06 17:10:10 -0700515int gJava_MyClassNatives_fooSIOO_calls = 0;
516jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700517 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700518 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700519 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700520 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700521 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700522 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700523 gJava_MyClassNatives_fooSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800524 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800525 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
526 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
527 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700528 switch (x) {
529 case 1:
530 return y;
531 case 2:
532 return z;
533 default:
534 return klass;
535 }
536}
537
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700538
539TEST_F(JniCompilerTest, CompileAndRunStaticIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800540 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700541 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700542 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700543 reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700544
Elliott Hughesb264f082012-04-06 17:10:10 -0700545 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700546 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700547 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700548 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700549
Andreas Gampecf4035a2014-05-28 22:43:01 -0700550 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700551 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700552 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700553 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
554 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700555 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700556 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700557 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700558 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700559
Andreas Gampecf4035a2014-05-28 22:43:01 -0700560 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700561 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700562 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700563 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700564 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700565 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700566 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
567 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700568 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700569}
570
Elliott Hughesb264f082012-04-06 17:10:10 -0700571int gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700572jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
573 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700574 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700575 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700576 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700577 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700578 gJava_MyClassNatives_fooSSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800579 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800580 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
581 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
582 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersdf20fe02011-07-20 20:34:16 -0700583 switch (x) {
584 case 1:
585 return y;
586 case 2:
587 return z;
588 default:
589 return klass;
590 }
591}
592
Ian Rogersdf20fe02011-07-20 20:34:16 -0700593TEST_F(JniCompilerTest, CompileAndRunStaticSynchronizedIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800594 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700595 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700596 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700597 reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700598
Elliott Hughesb264f082012-04-06 17:10:10 -0700599 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700600 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700601 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700602 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700603
Andreas Gampecf4035a2014-05-28 22:43:01 -0700604 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700605 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700606 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700607 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
608 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700609 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700610 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700611 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700612 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700613
Andreas Gampecf4035a2014-05-28 22:43:01 -0700614 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700615 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700616 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700617 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700618 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700619 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700620 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
621 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700622 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogersdf20fe02011-07-20 20:34:16 -0700623}
624
Elliott Hughesb264f082012-04-06 17:10:10 -0700625void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -0700626 jclass c = env->FindClass("java/lang/RuntimeException");
627 env->ThrowNew(c, "hello");
628}
Ian Rogers45a76cb2011-07-21 22:00:15 -0700629
Elliott Hughesa2501992011-08-26 19:39:54 -0700630TEST_F(JniCompilerTest, ExceptionHandling) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800631 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700632 {
633 ASSERT_FALSE(runtime_->IsStarted());
634 ScopedObjectAccess soa(Thread::Current());
635 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -0700636
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700637 // all compilation needs to happen before Runtime::Start
638 CompileForTest(class_loader_, false, "foo", "()V");
639 CompileForTest(class_loader_, false, "throwException", "()V");
640 CompileForTest(class_loader_, false, "foo", "()V");
641 }
642 // Start runtime to avoid re-initialization in SetupForTest.
643 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700644 bool started = runtime_->Start();
645 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700646
Elliott Hughesb264f082012-04-06 17:10:10 -0700647 gJava_MyClassNatives_foo_calls = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -0700648
Ian Rogers67375ac2011-09-14 00:55:44 -0700649 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700650 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700651 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700652 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers67375ac2011-09-14 00:55:44 -0700653 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -0700654
Ian Rogers67375ac2011-09-14 00:55:44 -0700655 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700656 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
657 SetUpForTest(false, "throwException", "()V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700658 reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
659 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -0700660 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700661 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700662 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
663 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
664 env_->ExceptionClear();
665 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -0700666
Ian Rogers67375ac2011-09-14 00:55:44 -0700667 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700668 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700669 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700670 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Ian Rogers45a76cb2011-07-21 22:00:15 -0700671}
672
Elliott Hughesb264f082012-04-06 17:10:10 -0700673jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700674 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700675 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700676 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -0700677
678 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +0100679 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -0700680 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800681 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
682 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700683 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700684 EXPECT_EQ(11, trace_array->GetLength());
685
Ian Rogersaaa20802011-09-11 21:47:37 -0700686 // Check stack trace entries have expected values
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700687 for (int32_t i = 0; i < trace_array->GetLength(); ++i) {
688 EXPECT_EQ(-2, trace_array->Get(i)->GetLineNumber());
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800689 mirror::StackTraceElement* ste = trace_array->Get(i);
Ian Rogersaaa20802011-09-11 21:47:37 -0700690 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -0700691 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Ian Rogersaaa20802011-09-11 21:47:37 -0700692 EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700693 }
Ian Rogersaaa20802011-09-11 21:47:37 -0700694
695 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700696 return 0;
697 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -0700698 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700699 EXPECT_TRUE(jklass != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700700 jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700701 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700702
Ian Rogersaaa20802011-09-11 21:47:37 -0700703 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700704 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -0700705
706 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700707 return i + result;
708 }
709}
710
711TEST_F(JniCompilerTest, NativeStackTraceElement) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800712 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700713 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700714 reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700715 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Ian Rogersaaa20802011-09-11 21:47:37 -0700716 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700717}
718
Elliott Hughesb264f082012-04-06 17:10:10 -0700719jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -0700720 return env->NewGlobalRef(x);
721}
722
Ian Rogersb9231c82011-09-05 22:13:19 -0700723TEST_F(JniCompilerTest, ReturnGlobalRef) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800724 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700725 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700726 reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -0700727 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
728 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
729 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
730}
731
Ian Rogersdc51b792011-09-22 20:41:37 -0700732jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
733 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700734 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -0700735 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800736 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -0700737 }
738 return x+1;
739}
740
741TEST_F(JniCompilerTest, LocalReferenceTableClearingTest) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800742 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700743 SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -0700744 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700745 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -0700746 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
747 EXPECT_TRUE(result == i + 1);
748 }
749}
750
Ian Rogersb9231c82011-09-05 22:13:19 -0700751void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
752 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
753 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -0700754 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -0700755 EXPECT_EQ(1234, src_pos);
756 EXPECT_EQ(5678, dst_pos);
757 EXPECT_EQ(9876, length);
758}
759
760TEST_F(JniCompilerTest, JavaLangSystemArrayCopy) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800761 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700762 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Ian Rogersb9231c82011-09-05 22:13:19 -0700763 reinterpret_cast<void*>(&my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -0700764 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -0700765}
766
Ian Rogers67375ac2011-09-14 00:55:44 -0700767jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
768 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
769 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -0700770 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -0700771 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
772 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
773 return JNI_TRUE;
774}
775
776TEST_F(JniCompilerTest, CompareAndSwapInt) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800777 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700778 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Ian Rogers67375ac2011-09-14 00:55:44 -0700779 reinterpret_cast<void*>(&my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -0700780 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
781 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -0700782 EXPECT_EQ(result, JNI_TRUE);
783}
784
Ian Rogersc7792842012-03-03 15:36:20 -0800785jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
786 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
787 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
788 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
789 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
790 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
791 return 42;
792}
793
794TEST_F(JniCompilerTest, GetText) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800795 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700796 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Ian Rogersc7792842012-03-03 15:36:20 -0800797 reinterpret_cast<void*>(&my_gettext));
798 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -0700799 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -0800800 EXPECT_EQ(result, 42);
801}
802
Vladimir Markoee2d1ad2014-07-24 17:01:58 +0100803int gJava_MyClassNatives_GetSinkProperties_calls = 0;
804jarray Java_MyClassNatives_GetSinkProperties(JNIEnv* env, jobject thisObj, jstring s) {
805 // 1 = thisObj
806 Thread* self = Thread::Current();
807 EXPECT_EQ(kNative, self->GetState());
808 Locks::mutator_lock_->AssertNotHeld(self);
809 EXPECT_EQ(self->GetJniEnv(), env);
810 EXPECT_TRUE(thisObj != nullptr);
811 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
812 EXPECT_EQ(s, nullptr);
813 gJava_MyClassNatives_GetSinkProperties_calls++;
814 ScopedObjectAccess soa(self);
815 EXPECT_EQ(2U, self->NumStackReferences());
816 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object*>(thisObj)));
817 return nullptr;
818}
819
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700820TEST_F(JniCompilerTest, GetSinkPropertiesNative) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800821 TEST_DISABLED_FOR_PORTABLE();
Vladimir Markoee2d1ad2014-07-24 17:01:58 +0100822 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
823 reinterpret_cast<void*>(&Java_MyClassNatives_GetSinkProperties));
824
825 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls);
826 jarray result = down_cast<jarray>(
827 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
828 EXPECT_EQ(nullptr, result);
829 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls);
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700830}
831
Elliott Hughesb264f082012-04-06 17:10:10 -0700832// This should return jclass, but we're imitating a bug pattern.
833jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
834 return env->NewStringUTF("not a class!");
835}
836
837// This should return jclass, but we're imitating a bug pattern.
838jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
839 return env->NewStringUTF("not a class!");
840}
841
842TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800843 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700844 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700845 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
846
847 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700848 // TODO: check type of returns with portable JNI compiler.
849 // This native method is bad, and tries to return a jstring as a jclass.
850 env_->CallObjectMethod(jobj_, jmethod_);
851 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
852
853 // Here, we just call the method incorrectly; we should catch that too.
Elliott Hughesb264f082012-04-06 17:10:10 -0700854 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700855 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
856 env_->CallStaticVoidMethod(jklass_, jmethod_);
857 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700858}
859
860TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800861 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700862 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700863 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
864
865 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700866 // TODO: check type of returns with portable JNI compiler.
867 // This native method is bad, and tries to return a jstring as a jclass.
868 env_->CallStaticObjectMethod(jklass_, jmethod_);
869 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
870
871 // Here, we just call the method incorrectly; we should catch that too.
872 env_->CallStaticVoidMethod(jklass_, jmethod_);
873 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 -0700874 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700875 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700876}
877
878// This should take jclass, but we're imitating a bug pattern.
879void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
880}
881
882// This should take jclass, but we're imitating a bug pattern.
883void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
884}
885
886TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800887 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700888 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700889 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
890
891 CheckJniAbortCatcher check_jni_abort_catcher;
892 // We deliberately pass a bad second argument here.
893 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700894 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700895}
896
897TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800898 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700899 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700900 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
901
902 CheckJniAbortCatcher check_jni_abort_catcher;
903 // We deliberately pass a bad second argument here.
904 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700905 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700906}
907
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800908jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
909 EXPECT_EQ(kNative, Thread::Current()->GetState());
910 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700911 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800912 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
913 ScopedObjectAccess soa(Thread::Current());
914 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
915 return f1 - f2; // non-commutative operator
916}
917
918TEST_F(JniCompilerTest, CompileAndRunFloatFloatMethod) {
919 TEST_DISABLED_FOR_PORTABLE();
920 SetUpForTest(false, "checkFloats", "(FF)F",
921 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
922
923 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
924 99.0F, 10.0F);
925 EXPECT_EQ(99.0F - 10.0F, result);
926 jfloat a = 3.14159F;
927 jfloat b = 0.69314F;
928 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
929 EXPECT_EQ(a - b, result);
930}
931
932void Java_MyClassNatives_checkParameterAlign(JNIEnv* env, jobject thisObj, jint i1, jlong l1) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700933// EXPECT_EQ(kNative, Thread::Current()->GetState());
934// EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
935// EXPECT_TRUE(thisObj != nullptr);
936// EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
937// ScopedObjectAccess soa(Thread::Current());
938// EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800939 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -0700940 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800941}
942
943TEST_F(JniCompilerTest, CheckParameterAlign) {
944 TEST_DISABLED_FOR_PORTABLE();
945 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
946 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
947
Ian Rogers0f678472014-03-10 16:18:37 -0700948 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800949}
950
951void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
952 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
953 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
954 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
955 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
956 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
957 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
958 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
959 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
960 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
961 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
962 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
963 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
964 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
965 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
966 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
967 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
968 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
969 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
970 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
971 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
972 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
973 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
974 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
975 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
976 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
977 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
978 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
979 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
980 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
981 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
982 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
983 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
984 EXPECT_EQ(kNative, Thread::Current()->GetState());
985 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700986 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800987 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
988 ScopedObjectAccess soa(Thread::Current());
989 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
990
991 // two tests possible
992 if (o0 == nullptr) {
993 // 1) everything is null
994 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
995 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
996 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
997 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
998 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
999 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1000 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1001 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1002 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1003 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1004 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1005 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1006 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1007 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1008 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1009 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1010 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1011 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1012 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1013 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1014 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1015 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1016 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1017 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1018 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1019 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1020 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1021 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1022 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1023 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1024 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1025 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1026 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1027 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1028 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1029 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1030 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1031 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1032 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1033 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1034 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1035 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1036 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1037 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1038 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1039 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1040 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1041 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1042 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1043 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1044 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1045 } else {
1046 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1047 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1048 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1049 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1050 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1051 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1052 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1053 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1054 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1055 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1056 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1057 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1058 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1059 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1060 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1061 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1062 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1063 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1064 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1065 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1066 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1067 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1068 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1069 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1070 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1071 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1072 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1073 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1074 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1075 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1076 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1077 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1078 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1079 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1080 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1081 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1082 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1083 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1084 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1085 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1086 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1087 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1088 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1089 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1090 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1091 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1092 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1093 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1094 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1095 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1096 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1097 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1098 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1099 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1100 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1101 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1102 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1103 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1104 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1105 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1106 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1107 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1108 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1109 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1110 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1111 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1112 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1113 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1114 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1115 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1116 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1117 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1118 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1119 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1120 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1121 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1122 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1123 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1124 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1125 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1126 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1127 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1128 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1129 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1130 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1131 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1132 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1133 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1134 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1135 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1136 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1137 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1138 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1139 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1140 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1141 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1142 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1143 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1144 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1145 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1146 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1147 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1148 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1149 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1150 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1151 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1152 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1153 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1154 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1155 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1156 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1157 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1158 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1159 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1160 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1161 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1162 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1163 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1164 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1165 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1166 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1167 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1168 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1169 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1170 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1171 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1172 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1173 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1174 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1175 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1176 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1177 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1178 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1179 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1180 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1181 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1182 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1183 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1184 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1185 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1186 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1187 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1188 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1189 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1190 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1191 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1192 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1193 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1194 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1195 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1196 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1197 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1198 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1199 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1200 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1201 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1202 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1203 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1204 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1205 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1206 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1207 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1208 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1209 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1210 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1211 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1212 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1213 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1214 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1215 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1216 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1217 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1218 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1219 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1220 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1221 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1222 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1223 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1224 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1225 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1226 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1227 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1228 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1229 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1230 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1231 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1232 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1233 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1234 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1235 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1236 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1237 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1238 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1239 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1240 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1241 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1242 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1243 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1244 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1245 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1246 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1247 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1248 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1249 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1250 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1251 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1252 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1253 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1254 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1255 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1256 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1257 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1258 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1259 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1260 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1261 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1262 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1263 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1264 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1265 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1266 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1267 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1268 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1269 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1270 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1271 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1272 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1273 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1274 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1275 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1276 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1277 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1278 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1279 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1280 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1281 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1282 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1283 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1284 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1285 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1286 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1287 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1288 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1289 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1290 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1291 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1292 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1293 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1294 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1295 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1296 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1297 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1298 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1299 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1300 }
1301}
1302
1303const char* longSig =
1304 "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1305 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1306 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1307 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1308 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1309 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1310 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1311 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1312 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1313 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1314 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1315 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1316 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1317 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1318 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1319 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1320 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1321 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1322 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1323 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1324 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1325 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1326 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1327 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1328 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1329 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1330 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1331 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1332 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1333 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1334 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1335 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1336 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1337 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1338 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1339 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1340 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1341 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1342 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1343 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1344 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1345 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1346 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1347 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1348 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1349 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1350 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1351 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1352 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1353 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1354 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1355
1356TEST_F(JniCompilerTest, MaxParamNumber) {
1357 TEST_DISABLED_FOR_PORTABLE();
1358 SetUpForTest(false, "maxParamNumber", longSig,
1359 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1360
1361 jvalue args[254];
1362
1363 // First test: test with all arguments null.
1364 for (int i = 0; i < 254; ++i) {
1365 args[i].l = nullptr;
1366 }
1367
1368 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1369
1370 // Second test: test with int[] objects with increasing lengths
1371 for (int i = 0; i < 254; ++i) {
1372 jintArray tmp = env_->NewIntArray(i);
1373 args[i].l = tmp;
1374 EXPECT_NE(args[i].l, nullptr);
1375 }
1376
1377 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1378}
1379
Andreas Gampead615172014-04-04 16:20:13 -07001380TEST_F(JniCompilerTest, WithoutImplementation) {
1381 TEST_DISABLED_FOR_PORTABLE();
1382 SetUpForTest(false, "withoutImplementation", "()V", nullptr);
1383
1384 env_->CallVoidMethod(jobj_, jmethod_);
1385
1386 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1387 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1388}
1389
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001390void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv* env, jclass klass, jint i1, jint i2, jint i3,
1391 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1392 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1393 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1394 jfloat f10) {
1395 EXPECT_EQ(i1, 1);
1396 EXPECT_EQ(i2, 2);
1397 EXPECT_EQ(i3, 3);
1398 EXPECT_EQ(i4, 4);
1399 EXPECT_EQ(i5, 5);
1400 EXPECT_EQ(i6, 6);
1401 EXPECT_EQ(i7, 7);
1402 EXPECT_EQ(i8, 8);
1403 EXPECT_EQ(i9, 9);
1404 EXPECT_EQ(i10, 10);
1405
Andreas Gampec200a4a2014-06-16 18:39:09 -07001406 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001407 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001408 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001409 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001410 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001411 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001412 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001413 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001414 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001415 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001416 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001417 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001418 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001419 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001420 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001421 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001422 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001423 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001424 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001425 EXPECT_EQ(i20, 20);
1426}
1427
1428TEST_F(JniCompilerTest, StackArgsIntsFirst) {
1429 TEST_DISABLED_FOR_PORTABLE();
1430 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
1431 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst));
1432
1433 jint i1 = 1;
1434 jint i2 = 2;
1435 jint i3 = 3;
1436 jint i4 = 4;
1437 jint i5 = 5;
1438 jint i6 = 6;
1439 jint i7 = 7;
1440 jint i8 = 8;
1441 jint i9 = 9;
1442 jint i10 = 10;
1443
Andreas Gampec200a4a2014-06-16 18:39:09 -07001444 jfloat f1 = bit_cast<jint, jfloat>(11);
1445 jfloat f2 = bit_cast<jint, jfloat>(12);
1446 jfloat f3 = bit_cast<jint, jfloat>(13);
1447 jfloat f4 = bit_cast<jint, jfloat>(14);
1448 jfloat f5 = bit_cast<jint, jfloat>(15);
1449 jfloat f6 = bit_cast<jint, jfloat>(16);
1450 jfloat f7 = bit_cast<jint, jfloat>(17);
1451 jfloat f8 = bit_cast<jint, jfloat>(18);
1452 jfloat f9 = bit_cast<jint, jfloat>(19);
1453 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001454
1455 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1456 f3, f4, f5, f6, f7, f8, f9, f10);
1457}
1458
1459void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv* env, jclass klass, jfloat f1, jfloat f2,
1460 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1461 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1462 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1463 jint i9, jint i10) {
1464 EXPECT_EQ(i1, 1);
1465 EXPECT_EQ(i2, 2);
1466 EXPECT_EQ(i3, 3);
1467 EXPECT_EQ(i4, 4);
1468 EXPECT_EQ(i5, 5);
1469 EXPECT_EQ(i6, 6);
1470 EXPECT_EQ(i7, 7);
1471 EXPECT_EQ(i8, 8);
1472 EXPECT_EQ(i9, 9);
1473 EXPECT_EQ(i10, 10);
1474
Andreas Gampec200a4a2014-06-16 18:39:09 -07001475 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001476 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001477 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001478 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001479 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001480 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001481 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001482 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001483 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001484 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001485 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001486 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001487 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001488 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001489 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001490 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001491 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001492 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001493 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001494 EXPECT_EQ(i20, 20);
1495}
1496
1497TEST_F(JniCompilerTest, StackArgsFloatsFirst) {
1498 TEST_DISABLED_FOR_PORTABLE();
1499 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
1500 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst));
1501
1502 jint i1 = 1;
1503 jint i2 = 2;
1504 jint i3 = 3;
1505 jint i4 = 4;
1506 jint i5 = 5;
1507 jint i6 = 6;
1508 jint i7 = 7;
1509 jint i8 = 8;
1510 jint i9 = 9;
1511 jint i10 = 10;
1512
Andreas Gampec200a4a2014-06-16 18:39:09 -07001513 jfloat f1 = bit_cast<jint, jfloat>(11);
1514 jfloat f2 = bit_cast<jint, jfloat>(12);
1515 jfloat f3 = bit_cast<jint, jfloat>(13);
1516 jfloat f4 = bit_cast<jint, jfloat>(14);
1517 jfloat f5 = bit_cast<jint, jfloat>(15);
1518 jfloat f6 = bit_cast<jint, jfloat>(16);
1519 jfloat f7 = bit_cast<jint, jfloat>(17);
1520 jfloat f8 = bit_cast<jint, jfloat>(18);
1521 jfloat f9 = bit_cast<jint, jfloat>(19);
1522 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001523
1524 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
1525 i4, i5, i6, i7, i8, i9, i10);
1526}
1527
1528void Java_MyClassNatives_stackArgsMixed(JNIEnv* env, jclass klass, jint i1, jfloat f1, jint i2,
1529 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
1530 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
1531 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
1532 EXPECT_EQ(i1, 1);
1533 EXPECT_EQ(i2, 2);
1534 EXPECT_EQ(i3, 3);
1535 EXPECT_EQ(i4, 4);
1536 EXPECT_EQ(i5, 5);
1537 EXPECT_EQ(i6, 6);
1538 EXPECT_EQ(i7, 7);
1539 EXPECT_EQ(i8, 8);
1540 EXPECT_EQ(i9, 9);
1541 EXPECT_EQ(i10, 10);
1542
Andreas Gampec200a4a2014-06-16 18:39:09 -07001543 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001544 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001545 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001546 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001547 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001548 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001549 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001550 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001551 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001552 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001553 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001554 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001555 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001556 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001557 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001558 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001559 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001560 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001561 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001562 EXPECT_EQ(i20, 20);
1563}
1564
1565TEST_F(JniCompilerTest, StackArgsMixed) {
1566 TEST_DISABLED_FOR_PORTABLE();
1567 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
1568 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed));
1569
1570 jint i1 = 1;
1571 jint i2 = 2;
1572 jint i3 = 3;
1573 jint i4 = 4;
1574 jint i5 = 5;
1575 jint i6 = 6;
1576 jint i7 = 7;
1577 jint i8 = 8;
1578 jint i9 = 9;
1579 jint i10 = 10;
1580
Andreas Gampec200a4a2014-06-16 18:39:09 -07001581 jfloat f1 = bit_cast<jint, jfloat>(11);
1582 jfloat f2 = bit_cast<jint, jfloat>(12);
1583 jfloat f3 = bit_cast<jint, jfloat>(13);
1584 jfloat f4 = bit_cast<jint, jfloat>(14);
1585 jfloat f5 = bit_cast<jint, jfloat>(15);
1586 jfloat f6 = bit_cast<jint, jfloat>(16);
1587 jfloat f7 = bit_cast<jint, jfloat>(17);
1588 jfloat f8 = bit_cast<jint, jfloat>(18);
1589 jfloat f9 = bit_cast<jint, jfloat>(19);
1590 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001591
1592 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
1593 f7, i8, f8, i9, f9, i10, f10);
1594}
1595
Ian Rogersb033c752011-07-20 12:22:35 -07001596} // namespace art