blob: 9927fe1aa34772c906504ab943bf193c9751feea [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Ian Rogersb033c752011-07-20 12:22:35 -070016
Ian Rogers700a4022014-05-19 16:49:03 -070017#include <memory>
18
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070019#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080020#include "common_compiler_test.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070021#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070022#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070023#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070024#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070025#include "mem_map.h"
Brian Carlstromea46f952013-07-30 01:26:50 -070026#include "mirror/art_method-inl.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070027#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080028#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080029#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070030#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080031#include "mirror/stack_trace_element.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070032#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070033#include "ScopedLocalRef.h"
34#include "scoped_thread_state_change.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070035#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070036
Elliott Hughesb264f082012-04-06 17:10:10 -070037extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080038 return count + 1;
39}
40
Elliott Hughesb264f082012-04-06 17:10:10 -070041extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080042 return count + 1;
43}
44
Ian Rogersb033c752011-07-20 12:22:35 -070045namespace art {
46
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080047class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -070048 protected:
Ian Rogers00f7d0e2012-07-19 15:28:27 -070049 void CompileForTest(jobject class_loader, bool direct,
Brian Carlstrom40381fb2011-10-19 14:13:40 -070050 const char* method_name, const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070051 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -070052 StackHandleScope<1> hs(soa.Self());
53 Handle<mirror::ClassLoader> loader(
54 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -070055 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -080056 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Brian Carlstromea46f952013-07-30 01:26:50 -070057 mirror::ArtMethod* method;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070058 if (direct) {
buzbeec143c552011-08-20 17:38:58 -070059 method = c->FindDirectMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070060 } else {
buzbeec143c552011-08-20 17:38:58 -070061 method = c->FindVirtualMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070062 }
Brian Carlstromfc7120c2012-08-27 13:43:25 -070063 ASSERT_TRUE(method != NULL) << method_name << " " << method_sig;
Ian Rogersef7d42f2014-01-06 12:55:46 -080064 if (method->GetEntryPointFromQuickCompiledCode() == nullptr) {
65 ASSERT_TRUE(method->GetEntryPointFromPortableCompiledCode() == nullptr);
66 CompileMethod(method);
67 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
68 << method_name << " " << method_sig;
69 ASSERT_TRUE(method->GetEntryPointFromPortableCompiledCode() != nullptr)
70 << method_name << " " << method_sig;
Brian Carlstrom25c33252011-09-18 15:58:35 -070071 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070072 }
73
Ian Rogers00f7d0e2012-07-19 15:28:27 -070074 void SetUpForTest(bool direct, const char* method_name, const char* method_sig,
Brian Carlstrom25c33252011-09-18 15:58:35 -070075 void* native_fnptr) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070076 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -070077 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070078 {
79 ScopedObjectAccess soa(Thread::Current());
80 class_loader_ = LoadDex("MyClassNatives");
81 }
82 CompileForTest(class_loader_, direct, method_name, method_sig);
83 // Start runtime.
84 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -070085 bool started = runtime_->Start();
86 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -070087 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -070088 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -070089 env_ = Thread::Current()->GetJniEnv();
Elliott Hughesb264f082012-04-06 17:10:10 -070090 jklass_ = env_->FindClass("MyClassNatives");
Brian Carlstromfc7120c2012-08-27 13:43:25 -070091 ASSERT_TRUE(jklass_ != NULL) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070092
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070093 if (direct) {
94 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
95 } else {
96 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
97 }
Brian Carlstromfc7120c2012-08-27 13:43:25 -070098 ASSERT_TRUE(jmethod_ != NULL) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070099
Ian Rogersbdb03912011-09-14 00:55:44 -0700100 if (native_fnptr != NULL) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700101 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700102 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
103 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700104 } else {
105 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700106 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700107
108 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
109 jobj_ = env_->NewObject(jklass_, constructor);
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700110 ASSERT_TRUE(jobj_ != NULL) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700111 }
112
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700113 public:
114 static jclass jklass_;
115 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700116 static jobject class_loader_;
117
Elliott Hughesa21039c2012-06-21 12:09:25 -0700118
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700119 protected:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700120 JNIEnv* env_;
121 jmethodID jmethod_;
Ian Rogersb033c752011-07-20 12:22:35 -0700122};
123
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700124jclass JniCompilerTest::jklass_;
125jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700126jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700127
Elliott Hughesb264f082012-04-06 17:10:10 -0700128int gJava_MyClassNatives_foo_calls = 0;
129void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700130 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700131 EXPECT_EQ(kNative, Thread::Current()->GetState());
132 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700133 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
134 EXPECT_TRUE(thisObj != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700135 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700136 gJava_MyClassNatives_foo_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800137 ScopedObjectAccess soa(Thread::Current());
138 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700139}
140
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700141TEST_F(JniCompilerTest, CompileAndRunNoArgMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800142 TEST_DISABLED_FOR_PORTABLE();
Ian Rogersef7d42f2014-01-06 12:55:46 -0800143 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700144
Elliott Hughesb264f082012-04-06 17:10:10 -0700145 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700146 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700147 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700148 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700149 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700150}
151
Shih-wei Liao31384c52011-09-06 15:27:45 -0700152TEST_F(JniCompilerTest, CompileAndRunIntMethodThroughStub) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800153 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700154 SetUpForTest(false, "bar", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700155 NULL /* calling through stub will link with &Java_MyClassNatives_bar */);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700156
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700157 ScopedObjectAccess soa(Thread::Current());
Shih-wei Liao31384c52011-09-06 15:27:45 -0700158 std::string reason;
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700159 StackHandleScope<1> hs(soa.Self());
160 Handle<mirror::ClassLoader> class_loader(
161 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader_)));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700162 ASSERT_TRUE(
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800163 Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader, &reason)) << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700164
165 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
166 EXPECT_EQ(25, result);
167}
168
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800169TEST_F(JniCompilerTest, CompileAndRunStaticIntMethodThroughStub) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800170 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700171 SetUpForTest(true, "sbar", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700172 NULL /* calling through stub will link with &Java_MyClassNatives_sbar */);
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800173
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700174 ScopedObjectAccess soa(Thread::Current());
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800175 std::string reason;
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700176 StackHandleScope<1> hs(soa.Self());
177 Handle<mirror::ClassLoader> class_loader(
178 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader_)));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700179 ASSERT_TRUE(
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800180 Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader, &reason)) << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800181
182 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
183 EXPECT_EQ(43, result);
184}
185
Elliott Hughesb264f082012-04-06 17:10:10 -0700186int gJava_MyClassNatives_fooI_calls = 0;
187jint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700188 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700189 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700190 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
191 EXPECT_TRUE(thisObj != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700192 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700193 gJava_MyClassNatives_fooI_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800194 ScopedObjectAccess soa(Thread::Current());
195 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700196 return x;
197}
198
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700199TEST_F(JniCompilerTest, CompileAndRunIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800200 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700201 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700202 reinterpret_cast<void*>(&Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700203
Elliott Hughesb264f082012-04-06 17:10:10 -0700204 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700205 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
206 EXPECT_EQ(42, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700207 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700208 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
209 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700210 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700211}
212
Elliott Hughesb264f082012-04-06 17:10:10 -0700213int gJava_MyClassNatives_fooII_calls = 0;
214jint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700215 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700216 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700217 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
218 EXPECT_TRUE(thisObj != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700219 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700220 gJava_MyClassNatives_fooII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800221 ScopedObjectAccess soa(Thread::Current());
222 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700223 return x - y; // non-commutative operator
224}
225
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700226TEST_F(JniCompilerTest, CompileAndRunIntIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800227 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700228 SetUpForTest(false, "fooII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700229 reinterpret_cast<void*>(&Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700230
Elliott Hughesb264f082012-04-06 17:10:10 -0700231 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700232 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
233 EXPECT_EQ(99 - 10, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700234 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700235 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
236 0xCAFED00D);
237 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700238 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700239}
240
Elliott Hughesb264f082012-04-06 17:10:10 -0700241int gJava_MyClassNatives_fooJJ_calls = 0;
242jlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700243 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700244 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers9b269d22011-09-04 14:06:05 -0700245 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
246 EXPECT_TRUE(thisObj != NULL);
247 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700248 gJava_MyClassNatives_fooJJ_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800249 ScopedObjectAccess soa(Thread::Current());
250 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers9b269d22011-09-04 14:06:05 -0700251 return x - y; // non-commutative operator
252}
253
254TEST_F(JniCompilerTest, CompileAndRunLongLongMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800255 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700256 SetUpForTest(false, "fooJJ", "(JJ)J",
Elliott Hughesb264f082012-04-06 17:10:10 -0700257 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700258
Elliott Hughesb264f082012-04-06 17:10:10 -0700259 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers0f678472014-03-10 16:18:37 -0700260 jlong a = INT64_C(0x1234567890ABCDEF);
261 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700262 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
263 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700264 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700265 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
266 EXPECT_EQ(b - a, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700267 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700268}
269
Elliott Hughesb264f082012-04-06 17:10:10 -0700270int gJava_MyClassNatives_fooDD_calls = 0;
271jdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700272 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700273 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700274 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
275 EXPECT_TRUE(thisObj != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700276 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700277 gJava_MyClassNatives_fooDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800278 ScopedObjectAccess soa(Thread::Current());
279 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700280 return x - y; // non-commutative operator
281}
282
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700283TEST_F(JniCompilerTest, CompileAndRunDoubleDoubleMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800284 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700285 SetUpForTest(false, "fooDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700286 reinterpret_cast<void*>(&Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700287
Elliott Hughesb264f082012-04-06 17:10:10 -0700288 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700289 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
290 99.0, 10.0);
291 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700292 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700293 jdouble a = 3.14159265358979323846;
294 jdouble b = 0.69314718055994530942;
295 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
296 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700297 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700298}
299
Elliott Hughes3e778f72012-05-21 15:29:52 -0700300int gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
301jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700302 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700303 EXPECT_EQ(kNative, Thread::Current()->GetState());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700304 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
305 EXPECT_TRUE(thisObj != NULL);
306 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
307 gJava_MyClassNatives_fooJJ_synchronized_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800308 ScopedObjectAccess soa(Thread::Current());
309 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700310 return x | y;
311}
312
313TEST_F(JniCompilerTest, CompileAndRun_fooJJ_synchronized) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800314 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700315 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Elliott Hughes3e778f72012-05-21 15:29:52 -0700316 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ_synchronized));
317
318 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls);
319 jlong a = 0x1000000020000000ULL;
320 jlong b = 0x00ff000000aa0000ULL;
321 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
322 EXPECT_EQ(a | b, result);
323 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls);
324}
325
Elliott Hughesb264f082012-04-06 17:10:10 -0700326int gJava_MyClassNatives_fooIOO_calls = 0;
327jobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700328 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700329 // 3 = this + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700330 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700331 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
332 EXPECT_TRUE(thisObj != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700333 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700334 gJava_MyClassNatives_fooIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800335 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800336 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
337 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
338 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700339 switch (x) {
340 case 1:
341 return y;
342 case 2:
343 return z;
344 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700345 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700346 }
347}
348
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700349TEST_F(JniCompilerTest, CompileAndRunIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800350 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700351 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700352 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700353 reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700354
Elliott Hughesb264f082012-04-06 17:10:10 -0700355 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700356 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, NULL, NULL);
357 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700358 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700359
360 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, NULL, jklass_);
361 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700362 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700363 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, NULL, jklass_);
364 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700365 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700366 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, NULL, jklass_);
367 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700368 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700369
370 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, NULL);
371 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700372 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700373 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, NULL);
374 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700375 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700376 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, NULL);
377 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700378 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700379}
380
Elliott Hughesb264f082012-04-06 17:10:10 -0700381int gJava_MyClassNatives_fooSII_calls = 0;
382jint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700383 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700384 EXPECT_EQ(kNative, Thread::Current()->GetState());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700385 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
386 EXPECT_TRUE(klass != NULL);
387 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700388 gJava_MyClassNatives_fooSII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800389 ScopedObjectAccess soa(Thread::Current());
390 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700391 return x + y;
392}
393
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700394TEST_F(JniCompilerTest, CompileAndRunStaticIntIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800395 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700396 SetUpForTest(true, "fooSII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700397 reinterpret_cast<void*>(&Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700398
Elliott Hughesb264f082012-04-06 17:10:10 -0700399 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700400 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
401 EXPECT_EQ(50, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700402 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700403}
404
Elliott Hughesb264f082012-04-06 17:10:10 -0700405int gJava_MyClassNatives_fooSDD_calls = 0;
406jdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700407 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700408 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers7a99c112011-09-07 12:48:27 -0700409 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
410 EXPECT_TRUE(klass != NULL);
411 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700412 gJava_MyClassNatives_fooSDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800413 ScopedObjectAccess soa(Thread::Current());
414 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers7a99c112011-09-07 12:48:27 -0700415 return x - y; // non-commutative operator
416}
417
418TEST_F(JniCompilerTest, CompileAndRunStaticDoubleDoubleMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800419 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700420 SetUpForTest(true, "fooSDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700421 reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700422
Elliott Hughesb264f082012-04-06 17:10:10 -0700423 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700424 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
425 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700426 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700427 jdouble a = 3.14159265358979323846;
428 jdouble b = 0.69314718055994530942;
429 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
430 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700431 EXPECT_EQ(2, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700432}
433
Elliott Hughesb264f082012-04-06 17:10:10 -0700434int gJava_MyClassNatives_fooSIOO_calls = 0;
435jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700436 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700437 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700438 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700439 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
440 EXPECT_TRUE(klass != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700441 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700442 gJava_MyClassNatives_fooSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800443 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800444 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
445 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
446 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700447 switch (x) {
448 case 1:
449 return y;
450 case 2:
451 return z;
452 default:
453 return klass;
454 }
455}
456
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700457
458TEST_F(JniCompilerTest, CompileAndRunStaticIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800459 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700460 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700461 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700462 reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700463
Elliott Hughesb264f082012-04-06 17:10:10 -0700464 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700465 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, NULL);
466 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700467 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700468
469 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, jobj_);
470 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700471 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700472 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, NULL, jobj_);
473 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700474 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700475 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, NULL, jobj_);
476 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700477 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700478
479 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, NULL);
480 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700481 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700482 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, NULL);
483 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700484 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700485 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, NULL);
486 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700487 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700488}
489
Elliott Hughesb264f082012-04-06 17:10:10 -0700490int gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700491jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
492 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700493 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700494 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
495 EXPECT_TRUE(klass != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700496 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700497 gJava_MyClassNatives_fooSSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800498 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800499 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
500 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
501 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersdf20fe02011-07-20 20:34:16 -0700502 switch (x) {
503 case 1:
504 return y;
505 case 2:
506 return z;
507 default:
508 return klass;
509 }
510}
511
Ian Rogersdf20fe02011-07-20 20:34:16 -0700512TEST_F(JniCompilerTest, CompileAndRunStaticSynchronizedIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800513 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700514 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700515 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700516 reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700517
Elliott Hughesb264f082012-04-06 17:10:10 -0700518 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700519 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, NULL);
520 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700521 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700522
523 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, jobj_);
524 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700525 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700526 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, NULL, jobj_);
527 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700528 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700529 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, NULL, jobj_);
530 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700531 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700532
533 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, NULL);
534 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700535 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700536 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, NULL);
537 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700538 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700539 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, NULL);
540 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700541 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogersdf20fe02011-07-20 20:34:16 -0700542}
543
Elliott Hughesb264f082012-04-06 17:10:10 -0700544void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -0700545 jclass c = env->FindClass("java/lang/RuntimeException");
546 env->ThrowNew(c, "hello");
547}
Ian Rogers45a76cb2011-07-21 22:00:15 -0700548
Elliott Hughesa2501992011-08-26 19:39:54 -0700549TEST_F(JniCompilerTest, ExceptionHandling) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800550 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700551 {
552 ASSERT_FALSE(runtime_->IsStarted());
553 ScopedObjectAccess soa(Thread::Current());
554 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -0700555
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700556 // all compilation needs to happen before Runtime::Start
557 CompileForTest(class_loader_, false, "foo", "()V");
558 CompileForTest(class_loader_, false, "throwException", "()V");
559 CompileForTest(class_loader_, false, "foo", "()V");
560 }
561 // Start runtime to avoid re-initialization in SetupForTest.
562 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700563 bool started = runtime_->Start();
564 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700565
Elliott Hughesb264f082012-04-06 17:10:10 -0700566 gJava_MyClassNatives_foo_calls = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -0700567
Ian Rogers67375ac2011-09-14 00:55:44 -0700568 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700569 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700570 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700571 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers67375ac2011-09-14 00:55:44 -0700572 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -0700573
Ian Rogers67375ac2011-09-14 00:55:44 -0700574 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700575 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
576 SetUpForTest(false, "throwException", "()V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700577 reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
578 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -0700579 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700580 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700581 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
582 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
583 env_->ExceptionClear();
584 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -0700585
Ian Rogers67375ac2011-09-14 00:55:44 -0700586 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700587 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700588 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700589 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Ian Rogers45a76cb2011-07-21 22:00:15 -0700590}
591
Elliott Hughesb264f082012-04-06 17:10:10 -0700592jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700593 if (i <= 0) {
Ian Rogersaaa20802011-09-11 21:47:37 -0700594 // We want to check raw Object*/Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700595 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -0700596
597 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +0100598 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -0700599 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800600 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
601 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700602 EXPECT_TRUE(trace_array != NULL);
603 EXPECT_EQ(11, trace_array->GetLength());
604
Ian Rogersaaa20802011-09-11 21:47:37 -0700605 // Check stack trace entries have expected values
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700606 for (int32_t i = 0; i < trace_array->GetLength(); ++i) {
607 EXPECT_EQ(-2, trace_array->Get(i)->GetLineNumber());
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800608 mirror::StackTraceElement* ste = trace_array->Get(i);
Ian Rogersaaa20802011-09-11 21:47:37 -0700609 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -0700610 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Ian Rogersaaa20802011-09-11 21:47:37 -0700611 EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700612 }
Ian Rogersaaa20802011-09-11 21:47:37 -0700613
614 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700615 return 0;
616 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -0700617 jclass jklass = env->FindClass("MyClassNatives");
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700618 EXPECT_TRUE(jklass != NULL);
619 jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
620 EXPECT_TRUE(jmethod != NULL);
621
Ian Rogersaaa20802011-09-11 21:47:37 -0700622 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700623 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -0700624
625 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700626 return i + result;
627 }
628}
629
630TEST_F(JniCompilerTest, NativeStackTraceElement) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800631 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700632 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700633 reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700634 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Ian Rogersaaa20802011-09-11 21:47:37 -0700635 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700636}
637
Elliott Hughesb264f082012-04-06 17:10:10 -0700638jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -0700639 return env->NewGlobalRef(x);
640}
641
Ian Rogersb9231c82011-09-05 22:13:19 -0700642TEST_F(JniCompilerTest, ReturnGlobalRef) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800643 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700644 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700645 reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -0700646 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
647 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
648 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
649}
650
Ian Rogersdc51b792011-09-22 20:41:37 -0700651jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
652 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700653 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -0700654 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800655 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -0700656 }
657 return x+1;
658}
659
660TEST_F(JniCompilerTest, LocalReferenceTableClearingTest) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800661 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700662 SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -0700663 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700664 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -0700665 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
666 EXPECT_TRUE(result == i + 1);
667 }
668}
669
Ian Rogersb9231c82011-09-05 22:13:19 -0700670void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
671 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
672 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -0700673 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -0700674 EXPECT_EQ(1234, src_pos);
675 EXPECT_EQ(5678, dst_pos);
676 EXPECT_EQ(9876, length);
677}
678
679TEST_F(JniCompilerTest, JavaLangSystemArrayCopy) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800680 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700681 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Ian Rogersb9231c82011-09-05 22:13:19 -0700682 reinterpret_cast<void*>(&my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -0700683 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -0700684}
685
Ian Rogers67375ac2011-09-14 00:55:44 -0700686jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
687 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
688 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -0700689 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -0700690 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
691 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
692 return JNI_TRUE;
693}
694
695TEST_F(JniCompilerTest, CompareAndSwapInt) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800696 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700697 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Ian Rogers67375ac2011-09-14 00:55:44 -0700698 reinterpret_cast<void*>(&my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -0700699 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
700 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -0700701 EXPECT_EQ(result, JNI_TRUE);
702}
703
Ian Rogersc7792842012-03-03 15:36:20 -0800704jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
705 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
706 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
707 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
708 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
709 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
710 return 42;
711}
712
713TEST_F(JniCompilerTest, GetText) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800714 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700715 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Ian Rogersc7792842012-03-03 15:36:20 -0800716 reinterpret_cast<void*>(&my_gettext));
717 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -0700718 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -0800719 EXPECT_EQ(result, 42);
720}
721
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700722TEST_F(JniCompilerTest, GetSinkPropertiesNative) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800723 TEST_DISABLED_FOR_PORTABLE();
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700724 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;", NULL);
725 // This space intentionally left blank. Just testing compilation succeeds.
726}
727
Elliott Hughesb264f082012-04-06 17:10:10 -0700728// This should return jclass, but we're imitating a bug pattern.
729jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
730 return env->NewStringUTF("not a class!");
731}
732
733// This should return jclass, but we're imitating a bug pattern.
734jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
735 return env->NewStringUTF("not a class!");
736}
737
738TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800739 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700740 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700741 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
742
743 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700744 // TODO: check type of returns with portable JNI compiler.
745 // This native method is bad, and tries to return a jstring as a jclass.
746 env_->CallObjectMethod(jobj_, jmethod_);
747 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
748
749 // Here, we just call the method incorrectly; we should catch that too.
Elliott Hughesb264f082012-04-06 17:10:10 -0700750 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700751 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
752 env_->CallStaticVoidMethod(jklass_, jmethod_);
753 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700754}
755
756TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800757 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700758 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700759 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
760
761 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700762 // TODO: check type of returns with portable JNI compiler.
763 // This native method is bad, and tries to return a jstring as a jclass.
764 env_->CallStaticObjectMethod(jklass_, jmethod_);
765 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
766
767 // Here, we just call the method incorrectly; we should catch that too.
768 env_->CallStaticVoidMethod(jklass_, jmethod_);
769 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 -0700770 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700771 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700772}
773
774// This should take jclass, but we're imitating a bug pattern.
775void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
776}
777
778// This should take jclass, but we're imitating a bug pattern.
779void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
780}
781
782TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800783 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700784 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700785 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
786
787 CheckJniAbortCatcher check_jni_abort_catcher;
788 // We deliberately pass a bad second argument here.
789 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700790 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700791}
792
793TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800794 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700795 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700796 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
797
798 CheckJniAbortCatcher check_jni_abort_catcher;
799 // We deliberately pass a bad second argument here.
800 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700801 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700802}
803
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800804jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
805 EXPECT_EQ(kNative, Thread::Current()->GetState());
806 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
807 EXPECT_TRUE(thisObj != NULL);
808 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
809 ScopedObjectAccess soa(Thread::Current());
810 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
811 return f1 - f2; // non-commutative operator
812}
813
814TEST_F(JniCompilerTest, CompileAndRunFloatFloatMethod) {
815 TEST_DISABLED_FOR_PORTABLE();
816 SetUpForTest(false, "checkFloats", "(FF)F",
817 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
818
819 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
820 99.0F, 10.0F);
821 EXPECT_EQ(99.0F - 10.0F, result);
822 jfloat a = 3.14159F;
823 jfloat b = 0.69314F;
824 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
825 EXPECT_EQ(a - b, result);
826}
827
828void Java_MyClassNatives_checkParameterAlign(JNIEnv* env, jobject thisObj, jint i1, jlong l1) {
829 /*EXPECT_EQ(kNative, Thread::Current()->GetState());
830 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
831 EXPECT_TRUE(thisObj != NULL);
832 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
833 ScopedObjectAccess soa(Thread::Current());
834 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());*/
835 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -0700836 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800837}
838
839TEST_F(JniCompilerTest, CheckParameterAlign) {
840 TEST_DISABLED_FOR_PORTABLE();
841 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
842 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
843
Ian Rogers0f678472014-03-10 16:18:37 -0700844 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800845}
846
847void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
848 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
849 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
850 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
851 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
852 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
853 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
854 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
855 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
856 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
857 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
858 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
859 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
860 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
861 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
862 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
863 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
864 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
865 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
866 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
867 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
868 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
869 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
870 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
871 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
872 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
873 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
874 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
875 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
876 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
877 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
878 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
879 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
880 EXPECT_EQ(kNative, Thread::Current()->GetState());
881 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
882 EXPECT_TRUE(thisObj != NULL);
883 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
884 ScopedObjectAccess soa(Thread::Current());
885 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
886
887 // two tests possible
888 if (o0 == nullptr) {
889 // 1) everything is null
890 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
891 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
892 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
893 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
894 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
895 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
896 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
897 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
898 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
899 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
900 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
901 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
902 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
903 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
904 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
905 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
906 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
907 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
908 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
909 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
910 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
911 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
912 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
913 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
914 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
915 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
916 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
917 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
918 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
919 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
920 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
921 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
922 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
923 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
924 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
925 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
926 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
927 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
928 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
929 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
930 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
931 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
932 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
933 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
934 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
935 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
936 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
937 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
938 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
939 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
940 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
941 } else {
942 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
943 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
944 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
945 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
946 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
947 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
948 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
949 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
950 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
951 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
952 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
953 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
954 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
955 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
956 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
957 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
958 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
959 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
960 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
961 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
962 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
963 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
964 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
965 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
966 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
967 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
968 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
969 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
970 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
971 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
972 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
973 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
974 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
975 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
976 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
977 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
978 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
979 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
980 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
981 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
982 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
983 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
984 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
985 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
986 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
987 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
988 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
989 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
990 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
991 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
992 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
993 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
994 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
995 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
996 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
997 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
998 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
999 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1000 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1001 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1002 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1003 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1004 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1005 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1006 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1007 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1008 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1009 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1010 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1011 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1012 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1013 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1014 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1015 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1016 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1017 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1018 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1019 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1020 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1021 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1022 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1023 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1024 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1025 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1026 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1027 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1028 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1029 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1030 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1031 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1032 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1033 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1034 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1035 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1036 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1037 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1038 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1039 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1040 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1041 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1042 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1043 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1044 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1045 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1046 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1047 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1048 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1049 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1050 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1051 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1052 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1053 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1054 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1055 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1056 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1057 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1058 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1059 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1060 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1061 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1062 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1063 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1064 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1065 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1066 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1067 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1068 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1069 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1070 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1071 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1072 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1073 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1074 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1075 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1076 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1077 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1078 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1079 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1080 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1081 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1082 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1083 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1084 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1085 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1086 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1087 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1088 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1089 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1090 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1091 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1092 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1093 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1094 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1095 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1096 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1097 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1098 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1099 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1100 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1101 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1102 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1103 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1104 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1105 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1106 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1107 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1108 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1109 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1110 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1111 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1112 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1113 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1114 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1115 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1116 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1117 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1118 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1119 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1120 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1121 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1122 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1123 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1124 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1125 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1126 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1127 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1128 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1129 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1130 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1131 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1132 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1133 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1134 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1135 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1136 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1137 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1138 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1139 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1140 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1141 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1142 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1143 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1144 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1145 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1146 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1147 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1148 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1149 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1150 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1151 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1152 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1153 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1154 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1155 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1156 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1157 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1158 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1159 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1160 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1161 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1162 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1163 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1164 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1165 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1166 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1167 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1168 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1169 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1170 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1171 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1172 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1173 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1174 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1175 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1176 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1177 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1178 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1179 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1180 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1181 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1182 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1183 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1184 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1185 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1186 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1187 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1188 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1189 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1190 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1191 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1192 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1193 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1194 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1195 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1196 }
1197}
1198
1199const char* longSig =
1200 "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1201 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1202 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1203 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1204 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1205 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1206 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1207 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1208 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1209 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1210 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1211 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1212 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1213 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1214 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1215 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1216 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1217 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1218 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1219 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1220 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1221 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1222 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1223 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1224 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1225 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1226 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1227 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1228 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1229 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1230 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1231 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1232 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1233 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1234 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1235 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1236 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1237 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1238 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1239 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1240 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1241 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1242 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1243 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1244 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1245 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1246 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1247 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1248 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1249 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1250 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1251
1252TEST_F(JniCompilerTest, MaxParamNumber) {
1253 TEST_DISABLED_FOR_PORTABLE();
1254 SetUpForTest(false, "maxParamNumber", longSig,
1255 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1256
1257 jvalue args[254];
1258
1259 // First test: test with all arguments null.
1260 for (int i = 0; i < 254; ++i) {
1261 args[i].l = nullptr;
1262 }
1263
1264 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1265
1266 // Second test: test with int[] objects with increasing lengths
1267 for (int i = 0; i < 254; ++i) {
1268 jintArray tmp = env_->NewIntArray(i);
1269 args[i].l = tmp;
1270 EXPECT_NE(args[i].l, nullptr);
1271 }
1272
1273 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1274}
1275
Andreas Gampead615172014-04-04 16:20:13 -07001276TEST_F(JniCompilerTest, WithoutImplementation) {
1277 TEST_DISABLED_FOR_PORTABLE();
1278 SetUpForTest(false, "withoutImplementation", "()V", nullptr);
1279
1280 env_->CallVoidMethod(jobj_, jmethod_);
1281
1282 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1283 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1284}
1285
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001286template <typename U, typename V> V convert(U in) {
1287 DCHECK_LE(sizeof(U), sizeof(V));
1288 union { U u; V v; } tmp;
1289 tmp.u = in;
1290 return tmp.v;
1291}
1292
1293void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv* env, jclass klass, jint i1, jint i2, jint i3,
1294 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1295 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1296 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1297 jfloat f10) {
1298 EXPECT_EQ(i1, 1);
1299 EXPECT_EQ(i2, 2);
1300 EXPECT_EQ(i3, 3);
1301 EXPECT_EQ(i4, 4);
1302 EXPECT_EQ(i5, 5);
1303 EXPECT_EQ(i6, 6);
1304 EXPECT_EQ(i7, 7);
1305 EXPECT_EQ(i8, 8);
1306 EXPECT_EQ(i9, 9);
1307 EXPECT_EQ(i10, 10);
1308
1309 jint i11 = convert<jfloat, jint>(f1);
1310 EXPECT_EQ(i11, 11);
1311 jint i12 = convert<jfloat, jint>(f2);
1312 EXPECT_EQ(i12, 12);
1313 jint i13 = convert<jfloat, jint>(f3);
1314 EXPECT_EQ(i13, 13);
1315 jint i14 = convert<jfloat, jint>(f4);
1316 EXPECT_EQ(i14, 14);
1317 jint i15 = convert<jfloat, jint>(f5);
1318 EXPECT_EQ(i15, 15);
1319 jint i16 = convert<jfloat, jint>(f6);
1320 EXPECT_EQ(i16, 16);
1321 jint i17 = convert<jfloat, jint>(f7);
1322 EXPECT_EQ(i17, 17);
1323 jint i18 = convert<jfloat, jint>(f8);
1324 EXPECT_EQ(i18, 18);
1325 jint i19 = convert<jfloat, jint>(f9);
1326 EXPECT_EQ(i19, 19);
1327 jint i20 = convert<jfloat, jint>(f10);
1328 EXPECT_EQ(i20, 20);
1329}
1330
1331TEST_F(JniCompilerTest, StackArgsIntsFirst) {
1332 TEST_DISABLED_FOR_PORTABLE();
1333 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
1334 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst));
1335
1336 jint i1 = 1;
1337 jint i2 = 2;
1338 jint i3 = 3;
1339 jint i4 = 4;
1340 jint i5 = 5;
1341 jint i6 = 6;
1342 jint i7 = 7;
1343 jint i8 = 8;
1344 jint i9 = 9;
1345 jint i10 = 10;
1346
1347 jfloat f1 = convert<jint, jfloat>(11);
1348 jfloat f2 = convert<jint, jfloat>(12);
1349 jfloat f3 = convert<jint, jfloat>(13);
1350 jfloat f4 = convert<jint, jfloat>(14);
1351 jfloat f5 = convert<jint, jfloat>(15);
1352 jfloat f6 = convert<jint, jfloat>(16);
1353 jfloat f7 = convert<jint, jfloat>(17);
1354 jfloat f8 = convert<jint, jfloat>(18);
1355 jfloat f9 = convert<jint, jfloat>(19);
1356 jfloat f10 = convert<jint, jfloat>(20);
1357
1358 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1359 f3, f4, f5, f6, f7, f8, f9, f10);
1360}
1361
1362void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv* env, jclass klass, jfloat f1, jfloat f2,
1363 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1364 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1365 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1366 jint i9, jint i10) {
1367 EXPECT_EQ(i1, 1);
1368 EXPECT_EQ(i2, 2);
1369 EXPECT_EQ(i3, 3);
1370 EXPECT_EQ(i4, 4);
1371 EXPECT_EQ(i5, 5);
1372 EXPECT_EQ(i6, 6);
1373 EXPECT_EQ(i7, 7);
1374 EXPECT_EQ(i8, 8);
1375 EXPECT_EQ(i9, 9);
1376 EXPECT_EQ(i10, 10);
1377
1378 jint i11 = convert<jfloat, jint>(f1);
1379 EXPECT_EQ(i11, 11);
1380 jint i12 = convert<jfloat, jint>(f2);
1381 EXPECT_EQ(i12, 12);
1382 jint i13 = convert<jfloat, jint>(f3);
1383 EXPECT_EQ(i13, 13);
1384 jint i14 = convert<jfloat, jint>(f4);
1385 EXPECT_EQ(i14, 14);
1386 jint i15 = convert<jfloat, jint>(f5);
1387 EXPECT_EQ(i15, 15);
1388 jint i16 = convert<jfloat, jint>(f6);
1389 EXPECT_EQ(i16, 16);
1390 jint i17 = convert<jfloat, jint>(f7);
1391 EXPECT_EQ(i17, 17);
1392 jint i18 = convert<jfloat, jint>(f8);
1393 EXPECT_EQ(i18, 18);
1394 jint i19 = convert<jfloat, jint>(f9);
1395 EXPECT_EQ(i19, 19);
1396 jint i20 = convert<jfloat, jint>(f10);
1397 EXPECT_EQ(i20, 20);
1398}
1399
1400TEST_F(JniCompilerTest, StackArgsFloatsFirst) {
1401 TEST_DISABLED_FOR_PORTABLE();
1402 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
1403 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst));
1404
1405 jint i1 = 1;
1406 jint i2 = 2;
1407 jint i3 = 3;
1408 jint i4 = 4;
1409 jint i5 = 5;
1410 jint i6 = 6;
1411 jint i7 = 7;
1412 jint i8 = 8;
1413 jint i9 = 9;
1414 jint i10 = 10;
1415
1416 jfloat f1 = convert<jint, jfloat>(11);
1417 jfloat f2 = convert<jint, jfloat>(12);
1418 jfloat f3 = convert<jint, jfloat>(13);
1419 jfloat f4 = convert<jint, jfloat>(14);
1420 jfloat f5 = convert<jint, jfloat>(15);
1421 jfloat f6 = convert<jint, jfloat>(16);
1422 jfloat f7 = convert<jint, jfloat>(17);
1423 jfloat f8 = convert<jint, jfloat>(18);
1424 jfloat f9 = convert<jint, jfloat>(19);
1425 jfloat f10 = convert<jint, jfloat>(20);
1426
1427 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
1428 i4, i5, i6, i7, i8, i9, i10);
1429}
1430
1431void Java_MyClassNatives_stackArgsMixed(JNIEnv* env, jclass klass, jint i1, jfloat f1, jint i2,
1432 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
1433 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
1434 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
1435 EXPECT_EQ(i1, 1);
1436 EXPECT_EQ(i2, 2);
1437 EXPECT_EQ(i3, 3);
1438 EXPECT_EQ(i4, 4);
1439 EXPECT_EQ(i5, 5);
1440 EXPECT_EQ(i6, 6);
1441 EXPECT_EQ(i7, 7);
1442 EXPECT_EQ(i8, 8);
1443 EXPECT_EQ(i9, 9);
1444 EXPECT_EQ(i10, 10);
1445
1446 jint i11 = convert<jfloat, jint>(f1);
1447 EXPECT_EQ(i11, 11);
1448 jint i12 = convert<jfloat, jint>(f2);
1449 EXPECT_EQ(i12, 12);
1450 jint i13 = convert<jfloat, jint>(f3);
1451 EXPECT_EQ(i13, 13);
1452 jint i14 = convert<jfloat, jint>(f4);
1453 EXPECT_EQ(i14, 14);
1454 jint i15 = convert<jfloat, jint>(f5);
1455 EXPECT_EQ(i15, 15);
1456 jint i16 = convert<jfloat, jint>(f6);
1457 EXPECT_EQ(i16, 16);
1458 jint i17 = convert<jfloat, jint>(f7);
1459 EXPECT_EQ(i17, 17);
1460 jint i18 = convert<jfloat, jint>(f8);
1461 EXPECT_EQ(i18, 18);
1462 jint i19 = convert<jfloat, jint>(f9);
1463 EXPECT_EQ(i19, 19);
1464 jint i20 = convert<jfloat, jint>(f10);
1465 EXPECT_EQ(i20, 20);
1466}
1467
1468TEST_F(JniCompilerTest, StackArgsMixed) {
1469 TEST_DISABLED_FOR_PORTABLE();
1470 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
1471 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed));
1472
1473 jint i1 = 1;
1474 jint i2 = 2;
1475 jint i3 = 3;
1476 jint i4 = 4;
1477 jint i5 = 5;
1478 jint i6 = 6;
1479 jint i7 = 7;
1480 jint i8 = 8;
1481 jint i9 = 9;
1482 jint i10 = 10;
1483
1484 jfloat f1 = convert<jint, jfloat>(11);
1485 jfloat f2 = convert<jint, jfloat>(12);
1486 jfloat f3 = convert<jint, jfloat>(13);
1487 jfloat f4 = convert<jint, jfloat>(14);
1488 jfloat f5 = convert<jint, jfloat>(15);
1489 jfloat f6 = convert<jint, jfloat>(16);
1490 jfloat f7 = convert<jint, jfloat>(17);
1491 jfloat f8 = convert<jint, jfloat>(18);
1492 jfloat f9 = convert<jint, jfloat>(19);
1493 jfloat f10 = convert<jint, jfloat>(20);
1494
1495 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
1496 f7, i8, f8, i9, f9, i10, f10);
1497}
1498
Ian Rogersb033c752011-07-20 12:22:35 -07001499} // namespace art