blob: 6035689f88e7659bdeb8f02205fb77aac51edc53 [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
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070017#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080018#include "common_compiler_test.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070019#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070020#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070021#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070022#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070023#include "mem_map.h"
Brian Carlstromea46f952013-07-30 01:26:50 -070024#include "mirror/art_method-inl.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070025#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080026#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080027#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070028#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080029#include "mirror/stack_trace_element.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070030#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070031#include "ScopedLocalRef.h"
32#include "scoped_thread_state_change.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070033#include "thread.h"
Elliott Hughesa168c832012-06-12 15:34:20 -070034#include "UniquePtr.h"
Ian Rogersb033c752011-07-20 12:22:35 -070035
Elliott Hughesb264f082012-04-06 17:10:10 -070036extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080037 return count + 1;
38}
39
Elliott Hughesb264f082012-04-06 17:10:10 -070040extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080041 return count + 1;
42}
43
Ian Rogersb033c752011-07-20 12:22:35 -070044namespace art {
45
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080046class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -070047 protected:
Ian Rogers00f7d0e2012-07-19 15:28:27 -070048 void CompileForTest(jobject class_loader, bool direct,
Brian Carlstrom40381fb2011-10-19 14:13:40 -070049 const char* method_name, const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070050 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -070051 StackHandleScope<1> hs(soa.Self());
52 Handle<mirror::ClassLoader> loader(
53 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -070054 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -080055 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Brian Carlstromea46f952013-07-30 01:26:50 -070056 mirror::ArtMethod* method;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070057 if (direct) {
buzbeec143c552011-08-20 17:38:58 -070058 method = c->FindDirectMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070059 } else {
buzbeec143c552011-08-20 17:38:58 -070060 method = c->FindVirtualMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070061 }
Brian Carlstromfc7120c2012-08-27 13:43:25 -070062 ASSERT_TRUE(method != NULL) << method_name << " " << method_sig;
Ian Rogersef7d42f2014-01-06 12:55:46 -080063 if (method->GetEntryPointFromQuickCompiledCode() == nullptr) {
64 ASSERT_TRUE(method->GetEntryPointFromPortableCompiledCode() == nullptr);
65 CompileMethod(method);
66 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
67 << method_name << " " << method_sig;
68 ASSERT_TRUE(method->GetEntryPointFromPortableCompiledCode() != nullptr)
69 << method_name << " " << method_sig;
Brian Carlstrom25c33252011-09-18 15:58:35 -070070 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070071 }
72
Ian Rogers00f7d0e2012-07-19 15:28:27 -070073 void SetUpForTest(bool direct, const char* method_name, const char* method_sig,
Brian Carlstrom25c33252011-09-18 15:58:35 -070074 void* native_fnptr) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070075 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -070076 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070077 {
78 ScopedObjectAccess soa(Thread::Current());
79 class_loader_ = LoadDex("MyClassNatives");
80 }
81 CompileForTest(class_loader_, direct, method_name, method_sig);
82 // Start runtime.
83 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -070084 bool started = runtime_->Start();
85 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -070086 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -070087 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -070088 env_ = Thread::Current()->GetJniEnv();
Elliott Hughesb264f082012-04-06 17:10:10 -070089 jklass_ = env_->FindClass("MyClassNatives");
Brian Carlstromfc7120c2012-08-27 13:43:25 -070090 ASSERT_TRUE(jklass_ != NULL) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070091
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070092 if (direct) {
93 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
94 } else {
95 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
96 }
Brian Carlstromfc7120c2012-08-27 13:43:25 -070097 ASSERT_TRUE(jmethod_ != NULL) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070098
Ian Rogersbdb03912011-09-14 00:55:44 -070099 if (native_fnptr != NULL) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700100 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700101 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
102 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700103 } else {
104 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700105 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700106
107 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
108 jobj_ = env_->NewObject(jklass_, constructor);
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700109 ASSERT_TRUE(jobj_ != NULL) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700110 }
111
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700112 public:
113 static jclass jklass_;
114 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700115 static jobject class_loader_;
116
Elliott Hughesa21039c2012-06-21 12:09:25 -0700117
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700118 protected:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700119 JNIEnv* env_;
120 jmethodID jmethod_;
Ian Rogersb033c752011-07-20 12:22:35 -0700121};
122
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700123jclass JniCompilerTest::jklass_;
124jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700125jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700126
Elliott Hughesb264f082012-04-06 17:10:10 -0700127int gJava_MyClassNatives_foo_calls = 0;
128void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700129 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700130 EXPECT_EQ(kNative, Thread::Current()->GetState());
131 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700132 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
133 EXPECT_TRUE(thisObj != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700134 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700135 gJava_MyClassNatives_foo_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800136 ScopedObjectAccess soa(Thread::Current());
137 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700138}
139
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700140TEST_F(JniCompilerTest, CompileAndRunNoArgMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800141 TEST_DISABLED_FOR_PORTABLE();
Ian Rogersef7d42f2014-01-06 12:55:46 -0800142 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700143
Elliott Hughesb264f082012-04-06 17:10:10 -0700144 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700145 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700146 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700147 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700148 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700149}
150
Shih-wei Liao31384c52011-09-06 15:27:45 -0700151TEST_F(JniCompilerTest, CompileAndRunIntMethodThroughStub) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800152 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700153 SetUpForTest(false, "bar", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700154 NULL /* calling through stub will link with &Java_MyClassNatives_bar */);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700155
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700156 ScopedObjectAccess soa(Thread::Current());
Shih-wei Liao31384c52011-09-06 15:27:45 -0700157 std::string reason;
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700158 StackHandleScope<1> hs(soa.Self());
159 Handle<mirror::ClassLoader> class_loader(
160 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader_)));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700161 ASSERT_TRUE(
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800162 Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader, &reason)) << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700163
164 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
165 EXPECT_EQ(25, result);
166}
167
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800168TEST_F(JniCompilerTest, CompileAndRunStaticIntMethodThroughStub) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800169 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700170 SetUpForTest(true, "sbar", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700171 NULL /* calling through stub will link with &Java_MyClassNatives_sbar */);
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800172
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700173 ScopedObjectAccess soa(Thread::Current());
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800174 std::string reason;
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700175 StackHandleScope<1> hs(soa.Self());
176 Handle<mirror::ClassLoader> class_loader(
177 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader_)));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700178 ASSERT_TRUE(
Mathieu Chartier055d46c2014-02-06 11:22:17 -0800179 Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader, &reason)) << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800180
181 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
182 EXPECT_EQ(43, result);
183}
184
Elliott Hughesb264f082012-04-06 17:10:10 -0700185int gJava_MyClassNatives_fooI_calls = 0;
186jint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700187 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700188 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700189 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
190 EXPECT_TRUE(thisObj != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700191 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700192 gJava_MyClassNatives_fooI_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800193 ScopedObjectAccess soa(Thread::Current());
194 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700195 return x;
196}
197
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700198TEST_F(JniCompilerTest, CompileAndRunIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800199 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700200 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700201 reinterpret_cast<void*>(&Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700202
Elliott Hughesb264f082012-04-06 17:10:10 -0700203 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700204 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
205 EXPECT_EQ(42, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700206 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700207 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
208 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700209 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700210}
211
Elliott Hughesb264f082012-04-06 17:10:10 -0700212int gJava_MyClassNatives_fooII_calls = 0;
213jint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700214 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700215 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700216 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
217 EXPECT_TRUE(thisObj != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700218 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700219 gJava_MyClassNatives_fooII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800220 ScopedObjectAccess soa(Thread::Current());
221 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700222 return x - y; // non-commutative operator
223}
224
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700225TEST_F(JniCompilerTest, CompileAndRunIntIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800226 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700227 SetUpForTest(false, "fooII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700228 reinterpret_cast<void*>(&Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700229
Elliott Hughesb264f082012-04-06 17:10:10 -0700230 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700231 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
232 EXPECT_EQ(99 - 10, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700233 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700234 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
235 0xCAFED00D);
236 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700237 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700238}
239
Elliott Hughesb264f082012-04-06 17:10:10 -0700240int gJava_MyClassNatives_fooJJ_calls = 0;
241jlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700242 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700243 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers9b269d22011-09-04 14:06:05 -0700244 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
245 EXPECT_TRUE(thisObj != NULL);
246 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700247 gJava_MyClassNatives_fooJJ_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800248 ScopedObjectAccess soa(Thread::Current());
249 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers9b269d22011-09-04 14:06:05 -0700250 return x - y; // non-commutative operator
251}
252
253TEST_F(JniCompilerTest, CompileAndRunLongLongMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800254 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700255 SetUpForTest(false, "fooJJ", "(JJ)J",
Elliott Hughesb264f082012-04-06 17:10:10 -0700256 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700257
Elliott Hughesb264f082012-04-06 17:10:10 -0700258 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers0f678472014-03-10 16:18:37 -0700259 jlong a = INT64_C(0x1234567890ABCDEF);
260 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700261 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
262 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700263 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700264 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
265 EXPECT_EQ(b - a, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700266 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls);
Ian Rogers9b269d22011-09-04 14:06:05 -0700267}
268
Elliott Hughesb264f082012-04-06 17:10:10 -0700269int gJava_MyClassNatives_fooDD_calls = 0;
270jdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700271 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700272 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700273 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
274 EXPECT_TRUE(thisObj != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700275 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700276 gJava_MyClassNatives_fooDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800277 ScopedObjectAccess soa(Thread::Current());
278 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700279 return x - y; // non-commutative operator
280}
281
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700282TEST_F(JniCompilerTest, CompileAndRunDoubleDoubleMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800283 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700284 SetUpForTest(false, "fooDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700285 reinterpret_cast<void*>(&Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700286
Elliott Hughesb264f082012-04-06 17:10:10 -0700287 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700288 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
289 99.0, 10.0);
290 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700291 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700292 jdouble a = 3.14159265358979323846;
293 jdouble b = 0.69314718055994530942;
294 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
295 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700296 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700297}
298
Elliott Hughes3e778f72012-05-21 15:29:52 -0700299int gJava_MyClassNatives_fooJJ_synchronized_calls = 0;
300jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700301 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700302 EXPECT_EQ(kNative, Thread::Current()->GetState());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700303 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
304 EXPECT_TRUE(thisObj != NULL);
305 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
306 gJava_MyClassNatives_fooJJ_synchronized_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800307 ScopedObjectAccess soa(Thread::Current());
308 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Elliott Hughes3e778f72012-05-21 15:29:52 -0700309 return x | y;
310}
311
312TEST_F(JniCompilerTest, CompileAndRun_fooJJ_synchronized) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800313 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700314 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Elliott Hughes3e778f72012-05-21 15:29:52 -0700315 reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ_synchronized));
316
317 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls);
318 jlong a = 0x1000000020000000ULL;
319 jlong b = 0x00ff000000aa0000ULL;
320 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
321 EXPECT_EQ(a | b, result);
322 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls);
323}
324
Elliott Hughesb264f082012-04-06 17:10:10 -0700325int gJava_MyClassNatives_fooIOO_calls = 0;
326jobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700327 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700328 // 3 = this + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700329 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700330 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
331 EXPECT_TRUE(thisObj != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700332 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700333 gJava_MyClassNatives_fooIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800334 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800335 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
336 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
337 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700338 switch (x) {
339 case 1:
340 return y;
341 case 2:
342 return z;
343 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700344 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700345 }
346}
347
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700348TEST_F(JniCompilerTest, CompileAndRunIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800349 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700350 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700351 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700352 reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700353
Elliott Hughesb264f082012-04-06 17:10:10 -0700354 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700355 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, NULL, NULL);
356 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700357 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700358
359 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, NULL, jklass_);
360 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700361 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700362 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, NULL, jklass_);
363 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700364 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700365 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, NULL, jklass_);
366 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700367 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700368
369 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, NULL);
370 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700371 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700372 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, NULL);
373 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700374 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700375 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, NULL);
376 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700377 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700378}
379
Elliott Hughesb264f082012-04-06 17:10:10 -0700380int gJava_MyClassNatives_fooSII_calls = 0;
381jint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700382 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700383 EXPECT_EQ(kNative, Thread::Current()->GetState());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700384 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
385 EXPECT_TRUE(klass != NULL);
386 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700387 gJava_MyClassNatives_fooSII_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800388 ScopedObjectAccess soa(Thread::Current());
389 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700390 return x + y;
391}
392
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700393TEST_F(JniCompilerTest, CompileAndRunStaticIntIntMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800394 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700395 SetUpForTest(true, "fooSII", "(II)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700396 reinterpret_cast<void*>(&Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700397
Elliott Hughesb264f082012-04-06 17:10:10 -0700398 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700399 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
400 EXPECT_EQ(50, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700401 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700402}
403
Elliott Hughesb264f082012-04-06 17:10:10 -0700404int gJava_MyClassNatives_fooSDD_calls = 0;
405jdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700406 // 1 = klass
Ian Rogers50b35e22012-10-04 10:09:15 -0700407 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogers7a99c112011-09-07 12:48:27 -0700408 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
409 EXPECT_TRUE(klass != NULL);
410 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700411 gJava_MyClassNatives_fooSDD_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800412 ScopedObjectAccess soa(Thread::Current());
413 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogers7a99c112011-09-07 12:48:27 -0700414 return x - y; // non-commutative operator
415}
416
417TEST_F(JniCompilerTest, CompileAndRunStaticDoubleDoubleMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800418 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700419 SetUpForTest(true, "fooSDD", "(DD)D",
Elliott Hughesb264f082012-04-06 17:10:10 -0700420 reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700421
Elliott Hughesb264f082012-04-06 17:10:10 -0700422 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700423 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
424 EXPECT_EQ(99.0 - 10.0, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700425 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700426 jdouble a = 3.14159265358979323846;
427 jdouble b = 0.69314718055994530942;
428 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
429 EXPECT_EQ(a - b, result);
Elliott Hughesb264f082012-04-06 17:10:10 -0700430 EXPECT_EQ(2, gJava_MyClassNatives_fooSDD_calls);
Ian Rogers7a99c112011-09-07 12:48:27 -0700431}
432
Elliott Hughesb264f082012-04-06 17:10:10 -0700433int gJava_MyClassNatives_fooSIOO_calls = 0;
434jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700435 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700436 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700437 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700438 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
439 EXPECT_TRUE(klass != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700440 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700441 gJava_MyClassNatives_fooSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800442 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800443 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
444 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
445 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700446 switch (x) {
447 case 1:
448 return y;
449 case 2:
450 return z;
451 default:
452 return klass;
453 }
454}
455
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700456
457TEST_F(JniCompilerTest, CompileAndRunStaticIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800458 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700459 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700460 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700461 reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700462
Elliott Hughesb264f082012-04-06 17:10:10 -0700463 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700464 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, NULL);
465 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700466 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700467
468 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, jobj_);
469 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700470 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700471 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, NULL, jobj_);
472 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700473 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700474 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, NULL, jobj_);
475 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700476 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700477
478 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, NULL);
479 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700480 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700481 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, NULL);
482 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700483 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700484 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, NULL);
485 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700486 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700487}
488
Elliott Hughesb264f082012-04-06 17:10:10 -0700489int gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700490jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
491 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700492 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700493 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
494 EXPECT_TRUE(klass != NULL);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700495 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700496 gJava_MyClassNatives_fooSSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800497 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800498 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
499 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
500 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersdf20fe02011-07-20 20:34:16 -0700501 switch (x) {
502 case 1:
503 return y;
504 case 2:
505 return z;
506 default:
507 return klass;
508 }
509}
510
Ian Rogersdf20fe02011-07-20 20:34:16 -0700511TEST_F(JniCompilerTest, CompileAndRunStaticSynchronizedIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800512 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700513 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700514 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700515 reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700516
Elliott Hughesb264f082012-04-06 17:10:10 -0700517 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700518 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, NULL);
519 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700520 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700521
522 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, jobj_);
523 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700524 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700525 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, NULL, jobj_);
526 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700527 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700528 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, NULL, jobj_);
529 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700530 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700531
532 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, NULL);
533 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700534 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700535 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, NULL);
536 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700537 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700538 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, NULL);
539 EXPECT_TRUE(env_->IsSameObject(NULL, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700540 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogersdf20fe02011-07-20 20:34:16 -0700541}
542
Elliott Hughesb264f082012-04-06 17:10:10 -0700543void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -0700544 jclass c = env->FindClass("java/lang/RuntimeException");
545 env->ThrowNew(c, "hello");
546}
Ian Rogers45a76cb2011-07-21 22:00:15 -0700547
Elliott Hughesa2501992011-08-26 19:39:54 -0700548TEST_F(JniCompilerTest, ExceptionHandling) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800549 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700550 {
551 ASSERT_FALSE(runtime_->IsStarted());
552 ScopedObjectAccess soa(Thread::Current());
553 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -0700554
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700555 // all compilation needs to happen before Runtime::Start
556 CompileForTest(class_loader_, false, "foo", "()V");
557 CompileForTest(class_loader_, false, "throwException", "()V");
558 CompileForTest(class_loader_, false, "foo", "()V");
559 }
560 // Start runtime to avoid re-initialization in SetupForTest.
561 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700562 bool started = runtime_->Start();
563 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700564
Elliott Hughesb264f082012-04-06 17:10:10 -0700565 gJava_MyClassNatives_foo_calls = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -0700566
Ian Rogers67375ac2011-09-14 00:55:44 -0700567 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700568 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700569 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700570 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers67375ac2011-09-14 00:55:44 -0700571 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -0700572
Ian Rogers67375ac2011-09-14 00:55:44 -0700573 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700574 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
575 SetUpForTest(false, "throwException", "()V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700576 reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
577 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -0700578 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700579 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700580 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
581 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
582 env_->ExceptionClear();
583 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -0700584
Ian Rogers67375ac2011-09-14 00:55:44 -0700585 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700586 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700587 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700588 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Ian Rogers45a76cb2011-07-21 22:00:15 -0700589}
590
Elliott Hughesb264f082012-04-06 17:10:10 -0700591jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700592 if (i <= 0) {
Ian Rogersaaa20802011-09-11 21:47:37 -0700593 // We want to check raw Object*/Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700594 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -0700595
596 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +0100597 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -0700598 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800599 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
600 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700601 EXPECT_TRUE(trace_array != NULL);
602 EXPECT_EQ(11, trace_array->GetLength());
603
Ian Rogersaaa20802011-09-11 21:47:37 -0700604 // Check stack trace entries have expected values
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700605 for (int32_t i = 0; i < trace_array->GetLength(); ++i) {
606 EXPECT_EQ(-2, trace_array->Get(i)->GetLineNumber());
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800607 mirror::StackTraceElement* ste = trace_array->Get(i);
Ian Rogersaaa20802011-09-11 21:47:37 -0700608 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -0700609 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Ian Rogersaaa20802011-09-11 21:47:37 -0700610 EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700611 }
Ian Rogersaaa20802011-09-11 21:47:37 -0700612
613 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700614 return 0;
615 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -0700616 jclass jklass = env->FindClass("MyClassNatives");
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700617 EXPECT_TRUE(jklass != NULL);
618 jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
619 EXPECT_TRUE(jmethod != NULL);
620
Ian Rogersaaa20802011-09-11 21:47:37 -0700621 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700622 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -0700623
624 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700625 return i + result;
626 }
627}
628
629TEST_F(JniCompilerTest, NativeStackTraceElement) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800630 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700631 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700632 reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700633 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Ian Rogersaaa20802011-09-11 21:47:37 -0700634 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700635}
636
Elliott Hughesb264f082012-04-06 17:10:10 -0700637jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -0700638 return env->NewGlobalRef(x);
639}
640
Ian Rogersb9231c82011-09-05 22:13:19 -0700641TEST_F(JniCompilerTest, ReturnGlobalRef) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800642 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700643 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700644 reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -0700645 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
646 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
647 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
648}
649
Ian Rogersdc51b792011-09-22 20:41:37 -0700650jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
651 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700652 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -0700653 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800654 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -0700655 }
656 return x+1;
657}
658
659TEST_F(JniCompilerTest, LocalReferenceTableClearingTest) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800660 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700661 SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -0700662 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700663 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -0700664 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
665 EXPECT_TRUE(result == i + 1);
666 }
667}
668
Ian Rogersb9231c82011-09-05 22:13:19 -0700669void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
670 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
671 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -0700672 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -0700673 EXPECT_EQ(1234, src_pos);
674 EXPECT_EQ(5678, dst_pos);
675 EXPECT_EQ(9876, length);
676}
677
678TEST_F(JniCompilerTest, JavaLangSystemArrayCopy) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800679 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700680 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Ian Rogersb9231c82011-09-05 22:13:19 -0700681 reinterpret_cast<void*>(&my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -0700682 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -0700683}
684
Ian Rogers67375ac2011-09-14 00:55:44 -0700685jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
686 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
687 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -0700688 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -0700689 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
690 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
691 return JNI_TRUE;
692}
693
694TEST_F(JniCompilerTest, CompareAndSwapInt) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800695 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700696 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Ian Rogers67375ac2011-09-14 00:55:44 -0700697 reinterpret_cast<void*>(&my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -0700698 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
699 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -0700700 EXPECT_EQ(result, JNI_TRUE);
701}
702
Ian Rogersc7792842012-03-03 15:36:20 -0800703jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
704 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
705 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
706 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
707 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
708 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
709 return 42;
710}
711
712TEST_F(JniCompilerTest, GetText) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800713 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700714 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Ian Rogersc7792842012-03-03 15:36:20 -0800715 reinterpret_cast<void*>(&my_gettext));
716 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -0700717 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -0800718 EXPECT_EQ(result, 42);
719}
720
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700721TEST_F(JniCompilerTest, GetSinkPropertiesNative) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800722 TEST_DISABLED_FOR_PORTABLE();
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700723 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;", NULL);
724 // This space intentionally left blank. Just testing compilation succeeds.
725}
726
Elliott Hughesb264f082012-04-06 17:10:10 -0700727// This should return jclass, but we're imitating a bug pattern.
728jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
729 return env->NewStringUTF("not a class!");
730}
731
732// This should return jclass, but we're imitating a bug pattern.
733jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
734 return env->NewStringUTF("not a class!");
735}
736
737TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800738 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700739 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700740 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
741
742 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700743 // TODO: check type of returns with portable JNI compiler.
744 // This native method is bad, and tries to return a jstring as a jclass.
745 env_->CallObjectMethod(jobj_, jmethod_);
746 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
747
748 // Here, we just call the method incorrectly; we should catch that too.
Elliott Hughesb264f082012-04-06 17:10:10 -0700749 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700750 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
751 env_->CallStaticVoidMethod(jklass_, jmethod_);
752 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700753}
754
755TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800756 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700757 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700758 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
759
760 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700761 // TODO: check type of returns with portable JNI compiler.
762 // This native method is bad, and tries to return a jstring as a jclass.
763 env_->CallStaticObjectMethod(jklass_, jmethod_);
764 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
765
766 // Here, we just call the method incorrectly; we should catch that too.
767 env_->CallStaticVoidMethod(jklass_, jmethod_);
768 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 -0700769 env_->CallVoidMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700770 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallVoidMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700771}
772
773// This should take jclass, but we're imitating a bug pattern.
774void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
775}
776
777// This should take jclass, but we're imitating a bug pattern.
778void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
779}
780
781TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800782 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700783 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700784 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
785
786 CheckJniAbortCatcher check_jni_abort_catcher;
787 // We deliberately pass a bad second argument here.
788 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700789 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700790}
791
792TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800793 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700794 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700795 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
796
797 CheckJniAbortCatcher check_jni_abort_catcher;
798 // We deliberately pass a bad second argument here.
799 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700800 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700801}
802
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800803jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
804 EXPECT_EQ(kNative, Thread::Current()->GetState());
805 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
806 EXPECT_TRUE(thisObj != NULL);
807 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
808 ScopedObjectAccess soa(Thread::Current());
809 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
810 return f1 - f2; // non-commutative operator
811}
812
813TEST_F(JniCompilerTest, CompileAndRunFloatFloatMethod) {
814 TEST_DISABLED_FOR_PORTABLE();
815 SetUpForTest(false, "checkFloats", "(FF)F",
816 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
817
818 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
819 99.0F, 10.0F);
820 EXPECT_EQ(99.0F - 10.0F, result);
821 jfloat a = 3.14159F;
822 jfloat b = 0.69314F;
823 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
824 EXPECT_EQ(a - b, result);
825}
826
827void Java_MyClassNatives_checkParameterAlign(JNIEnv* env, jobject thisObj, jint i1, jlong l1) {
828 /*EXPECT_EQ(kNative, Thread::Current()->GetState());
829 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
830 EXPECT_TRUE(thisObj != NULL);
831 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
832 ScopedObjectAccess soa(Thread::Current());
833 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());*/
834 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -0700835 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800836}
837
838TEST_F(JniCompilerTest, CheckParameterAlign) {
839 TEST_DISABLED_FOR_PORTABLE();
840 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
841 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
842
Ian Rogers0f678472014-03-10 16:18:37 -0700843 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800844}
845
846void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
847 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
848 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
849 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
850 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
851 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
852 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
853 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
854 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
855 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
856 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
857 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
858 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
859 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
860 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
861 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
862 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
863 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
864 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
865 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
866 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
867 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
868 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
869 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
870 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
871 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
872 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
873 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
874 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
875 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
876 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
877 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
878 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
879 EXPECT_EQ(kNative, Thread::Current()->GetState());
880 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
881 EXPECT_TRUE(thisObj != NULL);
882 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
883 ScopedObjectAccess soa(Thread::Current());
884 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
885
886 // two tests possible
887 if (o0 == nullptr) {
888 // 1) everything is null
889 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
890 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
891 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
892 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
893 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
894 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
895 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
896 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
897 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
898 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
899 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
900 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
901 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
902 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
903 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
904 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
905 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
906 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
907 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
908 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
909 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
910 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
911 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
912 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
913 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
914 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
915 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
916 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
917 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
918 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
919 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
920 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
921 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
922 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
923 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
924 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
925 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
926 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
927 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
928 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
929 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
930 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
931 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
932 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
933 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
934 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
935 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
936 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
937 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
938 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
939 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
940 } else {
941 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
942 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
943 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
944 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
945 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
946 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
947 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
948 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
949 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
950 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
951 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
952 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
953 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
954 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
955 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
956 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
957 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
958 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
959 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
960 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
961 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
962 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
963 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
964 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
965 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
966 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
967 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
968 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
969 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
970 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
971 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
972 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
973 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
974 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
975 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
976 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
977 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
978 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
979 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
980 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
981 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
982 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
983 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
984 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
985 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
986 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
987 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
988 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
989 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
990 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
991 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
992 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
993 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
994 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
995 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
996 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
997 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
998 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
999 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1000 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1001 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1002 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1003 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1004 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1005 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1006 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1007 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1008 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1009 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1010 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1011 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1012 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1013 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1014 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1015 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1016 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1017 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1018 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1019 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1020 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1021 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1022 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1023 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1024 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1025 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1026 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1027 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1028 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1029 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1030 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1031 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1032 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1033 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1034 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1035 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1036 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1037 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1038 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1039 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1040 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1041 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1042 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1043 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1044 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1045 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1046 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1047 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1048 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1049 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1050 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1051 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1052 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1053 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1054 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1055 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1056 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1057 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1058 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1059 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1060 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1061 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1062 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1063 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1064 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1065 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1066 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1067 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1068 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1069 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1070 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1071 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1072 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1073 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1074 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1075 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1076 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1077 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1078 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1079 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1080 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1081 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1082 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1083 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1084 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1085 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1086 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1087 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1088 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1089 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1090 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1091 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1092 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1093 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1094 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1095 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1096 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1097 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1098 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1099 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1100 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1101 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1102 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1103 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1104 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1105 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1106 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1107 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1108 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1109 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1110 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1111 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1112 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1113 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1114 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1115 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1116 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1117 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1118 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1119 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1120 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1121 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1122 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1123 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1124 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1125 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1126 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1127 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1128 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1129 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1130 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1131 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1132 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1133 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1134 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1135 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1136 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1137 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1138 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1139 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1140 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1141 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1142 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1143 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1144 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1145 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1146 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1147 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1148 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1149 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1150 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1151 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1152 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1153 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1154 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1155 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1156 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1157 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1158 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1159 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1160 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1161 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1162 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1163 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1164 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1165 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1166 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1167 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1168 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1169 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1170 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1171 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1172 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1173 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1174 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1175 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1176 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1177 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1178 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1179 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1180 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1181 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1182 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1183 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1184 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1185 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1186 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1187 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1188 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1189 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1190 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1191 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1192 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1193 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1194 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1195 }
1196}
1197
1198const char* longSig =
1199 "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
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;)V";
1250
1251TEST_F(JniCompilerTest, MaxParamNumber) {
1252 TEST_DISABLED_FOR_PORTABLE();
1253 SetUpForTest(false, "maxParamNumber", longSig,
1254 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1255
1256 jvalue args[254];
1257
1258 // First test: test with all arguments null.
1259 for (int i = 0; i < 254; ++i) {
1260 args[i].l = nullptr;
1261 }
1262
1263 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1264
1265 // Second test: test with int[] objects with increasing lengths
1266 for (int i = 0; i < 254; ++i) {
1267 jintArray tmp = env_->NewIntArray(i);
1268 args[i].l = tmp;
1269 EXPECT_NE(args[i].l, nullptr);
1270 }
1271
1272 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1273}
1274
Andreas Gampead615172014-04-04 16:20:13 -07001275TEST_F(JniCompilerTest, WithoutImplementation) {
1276 TEST_DISABLED_FOR_PORTABLE();
1277 SetUpForTest(false, "withoutImplementation", "()V", nullptr);
1278
1279 env_->CallVoidMethod(jobj_, jmethod_);
1280
1281 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1282 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1283}
1284
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001285template <typename U, typename V> V convert(U in) {
1286 DCHECK_LE(sizeof(U), sizeof(V));
1287 union { U u; V v; } tmp;
1288 tmp.u = in;
1289 return tmp.v;
1290}
1291
1292void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv* env, jclass klass, jint i1, jint i2, jint i3,
1293 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1294 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1295 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1296 jfloat f10) {
1297 EXPECT_EQ(i1, 1);
1298 EXPECT_EQ(i2, 2);
1299 EXPECT_EQ(i3, 3);
1300 EXPECT_EQ(i4, 4);
1301 EXPECT_EQ(i5, 5);
1302 EXPECT_EQ(i6, 6);
1303 EXPECT_EQ(i7, 7);
1304 EXPECT_EQ(i8, 8);
1305 EXPECT_EQ(i9, 9);
1306 EXPECT_EQ(i10, 10);
1307
1308 jint i11 = convert<jfloat, jint>(f1);
1309 EXPECT_EQ(i11, 11);
1310 jint i12 = convert<jfloat, jint>(f2);
1311 EXPECT_EQ(i12, 12);
1312 jint i13 = convert<jfloat, jint>(f3);
1313 EXPECT_EQ(i13, 13);
1314 jint i14 = convert<jfloat, jint>(f4);
1315 EXPECT_EQ(i14, 14);
1316 jint i15 = convert<jfloat, jint>(f5);
1317 EXPECT_EQ(i15, 15);
1318 jint i16 = convert<jfloat, jint>(f6);
1319 EXPECT_EQ(i16, 16);
1320 jint i17 = convert<jfloat, jint>(f7);
1321 EXPECT_EQ(i17, 17);
1322 jint i18 = convert<jfloat, jint>(f8);
1323 EXPECT_EQ(i18, 18);
1324 jint i19 = convert<jfloat, jint>(f9);
1325 EXPECT_EQ(i19, 19);
1326 jint i20 = convert<jfloat, jint>(f10);
1327 EXPECT_EQ(i20, 20);
1328}
1329
1330TEST_F(JniCompilerTest, StackArgsIntsFirst) {
1331 TEST_DISABLED_FOR_PORTABLE();
1332 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
1333 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst));
1334
1335 jint i1 = 1;
1336 jint i2 = 2;
1337 jint i3 = 3;
1338 jint i4 = 4;
1339 jint i5 = 5;
1340 jint i6 = 6;
1341 jint i7 = 7;
1342 jint i8 = 8;
1343 jint i9 = 9;
1344 jint i10 = 10;
1345
1346 jfloat f1 = convert<jint, jfloat>(11);
1347 jfloat f2 = convert<jint, jfloat>(12);
1348 jfloat f3 = convert<jint, jfloat>(13);
1349 jfloat f4 = convert<jint, jfloat>(14);
1350 jfloat f5 = convert<jint, jfloat>(15);
1351 jfloat f6 = convert<jint, jfloat>(16);
1352 jfloat f7 = convert<jint, jfloat>(17);
1353 jfloat f8 = convert<jint, jfloat>(18);
1354 jfloat f9 = convert<jint, jfloat>(19);
1355 jfloat f10 = convert<jint, jfloat>(20);
1356
1357 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1358 f3, f4, f5, f6, f7, f8, f9, f10);
1359}
1360
1361void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv* env, jclass klass, jfloat f1, jfloat f2,
1362 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1363 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1364 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1365 jint i9, jint i10) {
1366 EXPECT_EQ(i1, 1);
1367 EXPECT_EQ(i2, 2);
1368 EXPECT_EQ(i3, 3);
1369 EXPECT_EQ(i4, 4);
1370 EXPECT_EQ(i5, 5);
1371 EXPECT_EQ(i6, 6);
1372 EXPECT_EQ(i7, 7);
1373 EXPECT_EQ(i8, 8);
1374 EXPECT_EQ(i9, 9);
1375 EXPECT_EQ(i10, 10);
1376
1377 jint i11 = convert<jfloat, jint>(f1);
1378 EXPECT_EQ(i11, 11);
1379 jint i12 = convert<jfloat, jint>(f2);
1380 EXPECT_EQ(i12, 12);
1381 jint i13 = convert<jfloat, jint>(f3);
1382 EXPECT_EQ(i13, 13);
1383 jint i14 = convert<jfloat, jint>(f4);
1384 EXPECT_EQ(i14, 14);
1385 jint i15 = convert<jfloat, jint>(f5);
1386 EXPECT_EQ(i15, 15);
1387 jint i16 = convert<jfloat, jint>(f6);
1388 EXPECT_EQ(i16, 16);
1389 jint i17 = convert<jfloat, jint>(f7);
1390 EXPECT_EQ(i17, 17);
1391 jint i18 = convert<jfloat, jint>(f8);
1392 EXPECT_EQ(i18, 18);
1393 jint i19 = convert<jfloat, jint>(f9);
1394 EXPECT_EQ(i19, 19);
1395 jint i20 = convert<jfloat, jint>(f10);
1396 EXPECT_EQ(i20, 20);
1397}
1398
1399TEST_F(JniCompilerTest, StackArgsFloatsFirst) {
1400 TEST_DISABLED_FOR_PORTABLE();
1401 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
1402 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst));
1403
1404 jint i1 = 1;
1405 jint i2 = 2;
1406 jint i3 = 3;
1407 jint i4 = 4;
1408 jint i5 = 5;
1409 jint i6 = 6;
1410 jint i7 = 7;
1411 jint i8 = 8;
1412 jint i9 = 9;
1413 jint i10 = 10;
1414
1415 jfloat f1 = convert<jint, jfloat>(11);
1416 jfloat f2 = convert<jint, jfloat>(12);
1417 jfloat f3 = convert<jint, jfloat>(13);
1418 jfloat f4 = convert<jint, jfloat>(14);
1419 jfloat f5 = convert<jint, jfloat>(15);
1420 jfloat f6 = convert<jint, jfloat>(16);
1421 jfloat f7 = convert<jint, jfloat>(17);
1422 jfloat f8 = convert<jint, jfloat>(18);
1423 jfloat f9 = convert<jint, jfloat>(19);
1424 jfloat f10 = convert<jint, jfloat>(20);
1425
1426 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
1427 i4, i5, i6, i7, i8, i9, i10);
1428}
1429
1430void Java_MyClassNatives_stackArgsMixed(JNIEnv* env, jclass klass, jint i1, jfloat f1, jint i2,
1431 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
1432 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
1433 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
1434 EXPECT_EQ(i1, 1);
1435 EXPECT_EQ(i2, 2);
1436 EXPECT_EQ(i3, 3);
1437 EXPECT_EQ(i4, 4);
1438 EXPECT_EQ(i5, 5);
1439 EXPECT_EQ(i6, 6);
1440 EXPECT_EQ(i7, 7);
1441 EXPECT_EQ(i8, 8);
1442 EXPECT_EQ(i9, 9);
1443 EXPECT_EQ(i10, 10);
1444
1445 jint i11 = convert<jfloat, jint>(f1);
1446 EXPECT_EQ(i11, 11);
1447 jint i12 = convert<jfloat, jint>(f2);
1448 EXPECT_EQ(i12, 12);
1449 jint i13 = convert<jfloat, jint>(f3);
1450 EXPECT_EQ(i13, 13);
1451 jint i14 = convert<jfloat, jint>(f4);
1452 EXPECT_EQ(i14, 14);
1453 jint i15 = convert<jfloat, jint>(f5);
1454 EXPECT_EQ(i15, 15);
1455 jint i16 = convert<jfloat, jint>(f6);
1456 EXPECT_EQ(i16, 16);
1457 jint i17 = convert<jfloat, jint>(f7);
1458 EXPECT_EQ(i17, 17);
1459 jint i18 = convert<jfloat, jint>(f8);
1460 EXPECT_EQ(i18, 18);
1461 jint i19 = convert<jfloat, jint>(f9);
1462 EXPECT_EQ(i19, 19);
1463 jint i20 = convert<jfloat, jint>(f10);
1464 EXPECT_EQ(i20, 20);
1465}
1466
1467TEST_F(JniCompilerTest, StackArgsMixed) {
1468 TEST_DISABLED_FOR_PORTABLE();
1469 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
1470 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed));
1471
1472 jint i1 = 1;
1473 jint i2 = 2;
1474 jint i3 = 3;
1475 jint i4 = 4;
1476 jint i5 = 5;
1477 jint i6 = 6;
1478 jint i7 = 7;
1479 jint i8 = 8;
1480 jint i9 = 9;
1481 jint i10 = 10;
1482
1483 jfloat f1 = convert<jint, jfloat>(11);
1484 jfloat f2 = convert<jint, jfloat>(12);
1485 jfloat f3 = convert<jint, jfloat>(13);
1486 jfloat f4 = convert<jint, jfloat>(14);
1487 jfloat f5 = convert<jint, jfloat>(15);
1488 jfloat f6 = convert<jint, jfloat>(16);
1489 jfloat f7 = convert<jint, jfloat>(17);
1490 jfloat f8 = convert<jint, jfloat>(18);
1491 jfloat f9 = convert<jint, jfloat>(19);
1492 jfloat f10 = convert<jint, jfloat>(20);
1493
1494 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
1495 f7, i8, f8, i9, f9, i10, f10);
1496}
1497
Ian Rogersb033c752011-07-20 12:22:35 -07001498} // namespace art