blob: deefdecba0515a0bafc60c4427f3b10dc250f086 [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Ian Rogersb033c752011-07-20 12:22:35 -070016
Ian Rogers700a4022014-05-19 16:49:03 -070017#include <memory>
18
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010019#include <math.h>
20
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070021#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080022#include "common_compiler_test.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070023#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070024#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070025#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070026#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070027#include "mem_map.h"
Brian Carlstromea46f952013-07-30 01:26:50 -070028#include "mirror/art_method-inl.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070029#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080030#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080031#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070032#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080033#include "mirror/stack_trace_element.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070034#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070035#include "ScopedLocalRef.h"
36#include "scoped_thread_state_change.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070037#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070038
Elliott Hughesb264f082012-04-06 17:10:10 -070039extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080040 return count + 1;
41}
42
Elliott Hughesb264f082012-04-06 17:10:10 -070043extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080044 return count + 1;
45}
46
Ian Rogersb033c752011-07-20 12:22:35 -070047namespace art {
48
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080049class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -070050 protected:
Ian Rogers00f7d0e2012-07-19 15:28:27 -070051 void CompileForTest(jobject class_loader, bool direct,
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010052 const char* method_name, const char* method_sig, bool generic = false) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070053 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -070054 StackHandleScope<1> hs(soa.Self());
55 Handle<mirror::ClassLoader> loader(
56 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -070057 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -080058 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Brian Carlstromea46f952013-07-30 01:26:50 -070059 mirror::ArtMethod* method;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070060 if (direct) {
buzbeec143c552011-08-20 17:38:58 -070061 method = c->FindDirectMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070062 } else {
buzbeec143c552011-08-20 17:38:58 -070063 method = c->FindVirtualMethod(method_name, method_sig);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070064 }
Andreas Gampecf4035a2014-05-28 22:43:01 -070065 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010066 if (generic) {
67 method->SetEntryPointFromQuickCompiledCode(class_linker_->GetQuickGenericJniTrampoline());
68 } else {
69 if (method->GetEntryPointFromQuickCompiledCode() == nullptr ||
70 method->GetEntryPointFromQuickCompiledCode() == class_linker_->GetQuickGenericJniTrampoline()) {
71 CompileMethod(method);
72 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
73 << method_name << " " << method_sig;
74 ASSERT_TRUE(method->GetEntryPointFromPortableCompiledCode() != nullptr)
75 << method_name << " " << method_sig;
76 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070077 }
Brian Carlstrom25c33252011-09-18 15:58:35 -070078 }
79
Ian Rogers00f7d0e2012-07-19 15:28:27 -070080 void SetUpForTest(bool direct, const char* method_name, const char* method_sig,
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010081 void* native_fnptr, bool generic = false) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070082 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -070083 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -070084 {
85 ScopedObjectAccess soa(Thread::Current());
86 class_loader_ = LoadDex("MyClassNatives");
87 }
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010088 CompileForTest(class_loader_, direct, method_name, method_sig, generic);
Ian Rogers00f7d0e2012-07-19 15:28:27 -070089 // Start runtime.
90 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -070091 bool started = runtime_->Start();
92 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -070093 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -070094 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -070095 env_ = Thread::Current()->GetJniEnv();
Elliott Hughesb264f082012-04-06 17:10:10 -070096 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -070097 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070098
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070099 if (direct) {
100 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
101 } else {
102 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
103 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700104 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700105
Andreas Gampecf4035a2014-05-28 22:43:01 -0700106 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700107 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700108 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
109 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700110 } else {
111 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700112 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700113
114 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
115 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700116 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700117 }
118
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700119 public:
120 static jclass jklass_;
121 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700122 static jobject class_loader_;
123
Elliott Hughesa21039c2012-06-21 12:09:25 -0700124
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700125 protected:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700126 JNIEnv* env_;
127 jmethodID jmethod_;
Ian Rogersb033c752011-07-20 12:22:35 -0700128};
129
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700130jclass JniCompilerTest::jklass_;
131jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700132jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700133
Andreas Gampecf4035a2014-05-28 22:43:01 -0700134
Elliott Hughesb264f082012-04-06 17:10:10 -0700135int gJava_MyClassNatives_foo_calls = 0;
136void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700137 // 1 = thisObj
Ian Rogers50b35e22012-10-04 10:09:15 -0700138 EXPECT_EQ(kNative, Thread::Current()->GetState());
139 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700140 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700141 EXPECT_TRUE(thisObj != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700142 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
Elliott Hughesb264f082012-04-06 17:10:10 -0700143 gJava_MyClassNatives_foo_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800144 ScopedObjectAccess soa(Thread::Current());
145 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700146}
147
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700148TEST_F(JniCompilerTest, CompileAndRunNoArgMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800149 TEST_DISABLED_FOR_PORTABLE();
Ian Rogersef7d42f2014-01-06 12:55:46 -0800150 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700151
Elliott Hughesb264f082012-04-06 17:10:10 -0700152 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700153 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700154 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700155 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700156 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700157}
158
Shih-wei Liao31384c52011-09-06 15:27:45 -0700159TEST_F(JniCompilerTest, CompileAndRunIntMethodThroughStub) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800160 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700161 SetUpForTest(false, "bar", "(I)I", nullptr);
162 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700163
Shih-wei Liao31384c52011-09-06 15:27:45 -0700164 std::string reason;
Ian Rogers68d8b422014-07-17 11:09:10 -0700165 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->LoadNativeLibrary(env_, "", class_loader_, &reason))
166 << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700167
168 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
169 EXPECT_EQ(25, result);
170}
171
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800172TEST_F(JniCompilerTest, CompileAndRunStaticIntMethodThroughStub) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800173 TEST_DISABLED_FOR_PORTABLE();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700174 SetUpForTest(true, "sbar", "(I)I", nullptr);
175 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800176
177 std::string reason;
Ian Rogers68d8b422014-07-17 11:09:10 -0700178 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->LoadNativeLibrary(env_, "", class_loader_, &reason))
179 << 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);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700190 EXPECT_TRUE(thisObj != nullptr);
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);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700217 EXPECT_TRUE(thisObj != nullptr);
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);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700245 EXPECT_TRUE(thisObj != nullptr);
Ian Rogers9b269d22011-09-04 14:06:05 -0700246 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);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700274 EXPECT_TRUE(thisObj != nullptr);
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);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700304 EXPECT_TRUE(thisObj != nullptr);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700305 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);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700331 EXPECT_TRUE(thisObj != nullptr);
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);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700355 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700356 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
Andreas Gampecf4035a2014-05-28 22:43:01 -0700359 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700360 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700361 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700362 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
363 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700364 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700365 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700366 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
Andreas Gampecf4035a2014-05-28 22:43:01 -0700369 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700370 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700371 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700372 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700373 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700374 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700375 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
376 EXPECT_TRUE(env_->IsSameObject(nullptr, 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);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700385 EXPECT_TRUE(klass != nullptr);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700386 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);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700409 EXPECT_TRUE(klass != nullptr);
Ian Rogers7a99c112011-09-07 12:48:27 -0700410 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
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100433// The x86 generic JNI code had a bug where it assumed a floating
434// point return value would be in xmm0. We use log, to somehow ensure
435// the compiler will use the floating point stack.
436
437jdouble Java_MyClassNatives_logD(JNIEnv* env, jclass klass, jdouble x) {
438 return log(x);
439}
440
441TEST_F(JniCompilerTest, RunGenericStaticLogDoubleethod) {
442 TEST_DISABLED_FOR_PORTABLE();
443 TEST_DISABLED_FOR_MIPS();
444 SetUpForTest(true, "logD", "(D)D",
445 reinterpret_cast<void*>(&Java_MyClassNatives_logD), true);
446
447 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
448 EXPECT_EQ(log(2.0), result);
449}
450
451jfloat Java_MyClassNatives_logF(JNIEnv* env, jclass klass, jfloat x) {
452 return logf(x);
453}
454
455TEST_F(JniCompilerTest, RunGenericStaticLogFloatMethod) {
456 TEST_DISABLED_FOR_PORTABLE();
457 TEST_DISABLED_FOR_MIPS();
458 SetUpForTest(true, "logF", "(F)F",
459 reinterpret_cast<void*>(&Java_MyClassNatives_logF), true);
460
461 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
462 EXPECT_EQ(logf(2.0), result);
463}
464
465jboolean Java_MyClassNatives_returnTrue(JNIEnv* env, jclass klass) {
466 return JNI_TRUE;
467}
468
469jboolean Java_MyClassNatives_returnFalse(JNIEnv* env, jclass klass) {
470 return JNI_FALSE;
471}
472
473jint Java_MyClassNatives_returnInt(JNIEnv* env, jclass klass) {
474 return 42;
475}
476
477TEST_F(JniCompilerTest, RunGenericStaticReturnTrue) {
478 TEST_DISABLED_FOR_PORTABLE();
479 TEST_DISABLED_FOR_MIPS();
480 SetUpForTest(true, "returnTrue", "()Z",
481 reinterpret_cast<void*>(&Java_MyClassNatives_returnTrue), true);
482
483 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
484 EXPECT_TRUE(result);
485}
486
487TEST_F(JniCompilerTest, RunGenericStaticReturnFalse) {
488 TEST_DISABLED_FOR_PORTABLE();
489 TEST_DISABLED_FOR_MIPS();
490 SetUpForTest(true, "returnFalse", "()Z",
491 reinterpret_cast<void*>(&Java_MyClassNatives_returnFalse), true);
492
493 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
494 EXPECT_FALSE(result);
495}
496
497TEST_F(JniCompilerTest, RunGenericStaticReturnInt) {
498 TEST_DISABLED_FOR_PORTABLE();
499 TEST_DISABLED_FOR_MIPS();
500 SetUpForTest(true, "returnInt", "()I",
501 reinterpret_cast<void*>(&Java_MyClassNatives_returnInt), true);
502
503 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
504 EXPECT_EQ(42, result);
505}
506
Elliott Hughesb264f082012-04-06 17:10:10 -0700507int gJava_MyClassNatives_fooSIOO_calls = 0;
508jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700509 jobject z) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700510 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700511 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700512 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700513 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700514 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700515 gJava_MyClassNatives_fooSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800516 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800517 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
518 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
519 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersb033c752011-07-20 12:22:35 -0700520 switch (x) {
521 case 1:
522 return y;
523 case 2:
524 return z;
525 default:
526 return klass;
527 }
528}
529
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700530
531TEST_F(JniCompilerTest, CompileAndRunStaticIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800532 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700533 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700534 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700535 reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700536
Elliott Hughesb264f082012-04-06 17:10:10 -0700537 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700538 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700539 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700540 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700541
Andreas Gampecf4035a2014-05-28 22:43:01 -0700542 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700543 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700544 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700545 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
546 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700547 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700548 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700549 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700550 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700551
Andreas Gampecf4035a2014-05-28 22:43:01 -0700552 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700553 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700554 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700555 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700556 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700557 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700558 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
559 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700560 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700561}
562
Elliott Hughesb264f082012-04-06 17:10:10 -0700563int gJava_MyClassNatives_fooSSIOO_calls = 0;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700564jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
565 // 3 = klass + y + z
Ian Rogers50b35e22012-10-04 10:09:15 -0700566 EXPECT_EQ(kNative, Thread::Current()->GetState());
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700567 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700568 EXPECT_TRUE(klass != nullptr);
Ian Rogersa8cd9f42011-08-19 16:43:41 -0700569 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
Elliott Hughesb264f082012-04-06 17:10:10 -0700570 gJava_MyClassNatives_fooSSIOO_calls++;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800571 ScopedObjectAccess soa(Thread::Current());
Andreas Gampebf6b92a2014-03-05 16:11:04 -0800572 size_t null_args = (y == nullptr ? 1 : 0) + (z == nullptr ? 1 : 0);
573 EXPECT_TRUE(3U == Thread::Current()->NumStackReferences() ||
574 (3U - null_args) == Thread::Current()->NumStackReferences());
Ian Rogersdf20fe02011-07-20 20:34:16 -0700575 switch (x) {
576 case 1:
577 return y;
578 case 2:
579 return z;
580 default:
581 return klass;
582 }
583}
584
Ian Rogersdf20fe02011-07-20 20:34:16 -0700585TEST_F(JniCompilerTest, CompileAndRunStaticSynchronizedIntObjectObjectMethod) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800586 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700587 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700588 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700589 reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700590
Elliott Hughesb264f082012-04-06 17:10:10 -0700591 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700592 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700593 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700594 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700595
Andreas Gampecf4035a2014-05-28 22:43:01 -0700596 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700597 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700598 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700599 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
600 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700601 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700602 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700603 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700604 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700605
Andreas Gampecf4035a2014-05-28 22:43:01 -0700606 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700607 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700608 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700609 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700610 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700611 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700612 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
613 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Elliott Hughesb264f082012-04-06 17:10:10 -0700614 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
Ian Rogersdf20fe02011-07-20 20:34:16 -0700615}
616
Elliott Hughesb264f082012-04-06 17:10:10 -0700617void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -0700618 jclass c = env->FindClass("java/lang/RuntimeException");
619 env->ThrowNew(c, "hello");
620}
Ian Rogers45a76cb2011-07-21 22:00:15 -0700621
Elliott Hughesa2501992011-08-26 19:39:54 -0700622TEST_F(JniCompilerTest, ExceptionHandling) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800623 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700624 {
625 ASSERT_FALSE(runtime_->IsStarted());
626 ScopedObjectAccess soa(Thread::Current());
627 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -0700628
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700629 // all compilation needs to happen before Runtime::Start
630 CompileForTest(class_loader_, false, "foo", "()V");
631 CompileForTest(class_loader_, false, "throwException", "()V");
632 CompileForTest(class_loader_, false, "foo", "()V");
633 }
634 // Start runtime to avoid re-initialization in SetupForTest.
635 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700636 bool started = runtime_->Start();
637 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700638
Elliott Hughesb264f082012-04-06 17:10:10 -0700639 gJava_MyClassNatives_foo_calls = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -0700640
Ian Rogers67375ac2011-09-14 00:55:44 -0700641 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700642 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700643 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700644 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers67375ac2011-09-14 00:55:44 -0700645 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -0700646
Ian Rogers67375ac2011-09-14 00:55:44 -0700647 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700648 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
649 SetUpForTest(false, "throwException", "()V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700650 reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
651 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -0700652 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700653 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700654 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
655 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
656 env_->ExceptionClear();
657 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -0700658
Ian Rogers67375ac2011-09-14 00:55:44 -0700659 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700660 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700661 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Elliott Hughesb264f082012-04-06 17:10:10 -0700662 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
Ian Rogers45a76cb2011-07-21 22:00:15 -0700663}
664
Elliott Hughesb264f082012-04-06 17:10:10 -0700665jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700666 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700667 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700668 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -0700669
670 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +0100671 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -0700672 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800673 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
674 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700675 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700676 EXPECT_EQ(11, trace_array->GetLength());
677
Ian Rogersaaa20802011-09-11 21:47:37 -0700678 // Check stack trace entries have expected values
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700679 for (int32_t i = 0; i < trace_array->GetLength(); ++i) {
680 EXPECT_EQ(-2, trace_array->Get(i)->GetLineNumber());
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800681 mirror::StackTraceElement* ste = trace_array->Get(i);
Ian Rogersaaa20802011-09-11 21:47:37 -0700682 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -0700683 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Ian Rogersaaa20802011-09-11 21:47:37 -0700684 EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700685 }
Ian Rogersaaa20802011-09-11 21:47:37 -0700686
687 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700688 return 0;
689 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -0700690 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700691 EXPECT_TRUE(jklass != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700692 jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700693 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700694
Ian Rogersaaa20802011-09-11 21:47:37 -0700695 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700696 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -0700697
698 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700699 return i + result;
700 }
701}
702
703TEST_F(JniCompilerTest, NativeStackTraceElement) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800704 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700705 SetUpForTest(false, "fooI", "(I)I",
Elliott Hughesb264f082012-04-06 17:10:10 -0700706 reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700707 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Ian Rogersaaa20802011-09-11 21:47:37 -0700708 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -0700709}
710
Elliott Hughesb264f082012-04-06 17:10:10 -0700711jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -0700712 return env->NewGlobalRef(x);
713}
714
Ian Rogersb9231c82011-09-05 22:13:19 -0700715TEST_F(JniCompilerTest, ReturnGlobalRef) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800716 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700717 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700718 reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -0700719 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
720 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
721 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
722}
723
Ian Rogersdc51b792011-09-22 20:41:37 -0700724jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
725 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700726 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -0700727 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800728 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -0700729 }
730 return x+1;
731}
732
733TEST_F(JniCompilerTest, LocalReferenceTableClearingTest) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800734 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700735 SetUpForTest(false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -0700736 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700737 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -0700738 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
739 EXPECT_TRUE(result == i + 1);
740 }
741}
742
Ian Rogersb9231c82011-09-05 22:13:19 -0700743void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
744 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
745 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -0700746 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -0700747 EXPECT_EQ(1234, src_pos);
748 EXPECT_EQ(5678, dst_pos);
749 EXPECT_EQ(9876, length);
750}
751
752TEST_F(JniCompilerTest, JavaLangSystemArrayCopy) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800753 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700754 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Ian Rogersb9231c82011-09-05 22:13:19 -0700755 reinterpret_cast<void*>(&my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -0700756 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -0700757}
758
Ian Rogers67375ac2011-09-14 00:55:44 -0700759jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
760 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
761 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -0700762 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -0700763 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
764 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
765 return JNI_TRUE;
766}
767
768TEST_F(JniCompilerTest, CompareAndSwapInt) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800769 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700770 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Ian Rogers67375ac2011-09-14 00:55:44 -0700771 reinterpret_cast<void*>(&my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -0700772 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
773 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -0700774 EXPECT_EQ(result, JNI_TRUE);
775}
776
Ian Rogersc7792842012-03-03 15:36:20 -0800777jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
778 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
779 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
780 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
781 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
782 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
783 return 42;
784}
785
786TEST_F(JniCompilerTest, GetText) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800787 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700788 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Ian Rogersc7792842012-03-03 15:36:20 -0800789 reinterpret_cast<void*>(&my_gettext));
790 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -0700791 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -0800792 EXPECT_EQ(result, 42);
793}
794
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100795int gJava_MyClassNatives_GetSinkProperties_calls = 0;
796jarray Java_MyClassNatives_GetSinkProperties(JNIEnv* env, jobject thisObj, jstring s) {
797 // 1 = thisObj
798 Thread* self = Thread::Current();
799 EXPECT_EQ(kNative, self->GetState());
800 Locks::mutator_lock_->AssertNotHeld(self);
801 EXPECT_EQ(self->GetJniEnv(), env);
802 EXPECT_TRUE(thisObj != nullptr);
803 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
804 EXPECT_EQ(s, nullptr);
805 gJava_MyClassNatives_GetSinkProperties_calls++;
806 ScopedObjectAccess soa(self);
807 EXPECT_EQ(2U, self->NumStackReferences());
808 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object*>(thisObj)));
809 return nullptr;
810}
811
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700812TEST_F(JniCompilerTest, GetSinkPropertiesNative) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800813 TEST_DISABLED_FOR_PORTABLE();
Vladimir Marko4e24b9d2014-07-24 17:01:58 +0100814 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
815 reinterpret_cast<void*>(&Java_MyClassNatives_GetSinkProperties));
816
817 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls);
818 jarray result = down_cast<jarray>(
819 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
820 EXPECT_EQ(nullptr, result);
821 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls);
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700822}
823
Elliott Hughesb264f082012-04-06 17:10:10 -0700824// This should return jclass, but we're imitating a bug pattern.
825jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
826 return env->NewStringUTF("not a class!");
827}
828
829// This should return jclass, but we're imitating a bug pattern.
830jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
831 return env->NewStringUTF("not a class!");
832}
833
834TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800835 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700836 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700837 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
838
839 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700840 // TODO: check type of returns with portable JNI compiler.
841 // This native method is bad, and tries to return a jstring as a jclass.
842 env_->CallObjectMethod(jobj_, jmethod_);
843 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
844
845 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700846 env_->CallObjectMethod(jobj_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700847 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass()");
Ian Rogers68d8b422014-07-17 11:09:10 -0700848 env_->CallStaticObjectMethod(jklass_, jmethod_);
849 check_jni_abort_catcher.Check("calling non-static method java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass() with CallStaticObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700850}
851
852TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800853 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700854 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Elliott Hughesb264f082012-04-06 17:10:10 -0700855 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
856
857 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700858 // TODO: check type of returns with portable JNI compiler.
859 // This native method is bad, and tries to return a jstring as a jclass.
860 env_->CallStaticObjectMethod(jklass_, jmethod_);
861 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
862
863 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -0700864 env_->CallStaticObjectMethod(jklass_, jmethod_);
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700865 check_jni_abort_catcher.Check("attempt to return an instance of java.lang.String from java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass()");
Ian Rogers68d8b422014-07-17 11:09:10 -0700866 env_->CallObjectMethod(jobj_, jmethod_);
867 check_jni_abort_catcher.Check("calling static method java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass() with CallObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -0700868}
869
870// This should take jclass, but we're imitating a bug pattern.
871void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
872}
873
874// This should take jclass, but we're imitating a bug pattern.
875void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
876}
877
878TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Instance) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800879 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700880 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700881 reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
882
883 CheckJniAbortCatcher check_jni_abort_catcher;
884 // We deliberately pass a bad second argument here.
885 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700886 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.instanceMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700887}
888
889TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Static) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800890 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700891 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Elliott Hughesb264f082012-04-06 17:10:10 -0700892 reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
893
894 CheckJniAbortCatcher check_jni_abort_catcher;
895 // We deliberately pass a bad second argument here.
896 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700897 check_jni_abort_catcher.Check("bad arguments passed to void MyClassNatives.staticMethodThatShouldTakeClass(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -0700898}
899
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800900jfloat Java_MyClassNatives_checkFloats(JNIEnv* env, jobject thisObj, jfloat f1, jfloat f2) {
901 EXPECT_EQ(kNative, Thread::Current()->GetState());
902 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700903 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800904 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
905 ScopedObjectAccess soa(Thread::Current());
906 EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
907 return f1 - f2; // non-commutative operator
908}
909
910TEST_F(JniCompilerTest, CompileAndRunFloatFloatMethod) {
911 TEST_DISABLED_FOR_PORTABLE();
912 SetUpForTest(false, "checkFloats", "(FF)F",
913 reinterpret_cast<void*>(&Java_MyClassNatives_checkFloats));
914
915 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
916 99.0F, 10.0F);
917 EXPECT_EQ(99.0F - 10.0F, result);
918 jfloat a = 3.14159F;
919 jfloat b = 0.69314F;
920 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
921 EXPECT_EQ(a - b, result);
922}
923
924void Java_MyClassNatives_checkParameterAlign(JNIEnv* env, jobject thisObj, jint i1, jlong l1) {
Andreas Gampecf4035a2014-05-28 22:43:01 -0700925// EXPECT_EQ(kNative, Thread::Current()->GetState());
926// EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
927// EXPECT_TRUE(thisObj != nullptr);
928// EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
929// ScopedObjectAccess soa(Thread::Current());
930// EXPECT_EQ(1U, Thread::Current()->NumStackReferences());
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800931 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -0700932 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800933}
934
935TEST_F(JniCompilerTest, CheckParameterAlign) {
936 TEST_DISABLED_FOR_PORTABLE();
937 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
938 reinterpret_cast<void*>(&Java_MyClassNatives_checkParameterAlign));
939
Ian Rogers0f678472014-03-10 16:18:37 -0700940 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800941}
942
943void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject thisObj,
944 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
945 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
946 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
947 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
948 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
949 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
950 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
951 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
952 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
953 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
954 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
955 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
956 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
957 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
958 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
959 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
960 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
961 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
962 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
963 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
964 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
965 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
966 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
967 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
968 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
969 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
970 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
971 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
972 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
973 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
974 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
975 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
976 EXPECT_EQ(kNative, Thread::Current()->GetState());
977 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700978 EXPECT_TRUE(thisObj != nullptr);
Andreas Gampe7a0e5042014-03-07 13:03:19 -0800979 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
980 ScopedObjectAccess soa(Thread::Current());
981 EXPECT_GE(255U, Thread::Current()->NumStackReferences());
982
983 // two tests possible
984 if (o0 == nullptr) {
985 // 1) everything is null
986 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
987 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
988 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
989 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
990 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
991 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
992 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
993 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
994 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
995 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
996 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
997 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
998 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
999 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1000 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1001 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1002 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1003 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1004 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1005 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1006 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1007 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1008 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1009 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1010 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1011 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1012 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1013 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1014 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1015 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1016 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1017 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1018 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1019 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1020 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1021 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1022 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1023 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1024 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1025 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1026 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1027 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1028 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1029 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1030 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1031 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1032 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1033 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1034 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1035 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1036 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1037 } else {
1038 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1039 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1040 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1041 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1042 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1043 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1044 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1045 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1046 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1047 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1048 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1049 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1050 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1051 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1052 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1053 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1054 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1055 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1056 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1057 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1058 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1059 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1060 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1061 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1062 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1063 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1064 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1065 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1066 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1067 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1068 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1069 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1070 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1071 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1072 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1073 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1074 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1075 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1076 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1077 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1078 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1079 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1080 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1081 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1082 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1083 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1084 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1085 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1086 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1087 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1088 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1089 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1090 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1091 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1092 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1093 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1094 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1095 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1096 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1097 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1098 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1099 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1100 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1101 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1102 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1103 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1104 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1105 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1106 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1107 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1108 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1109 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1110 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1111 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1112 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1113 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1114 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1115 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1116 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1117 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1118 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1119 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1120 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1121 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1122 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1123 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1124 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1125 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1126 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1127 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1128 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1129 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1130 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1131 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1132 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1133 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1134 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1135 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1136 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1137 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1138 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1139 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1140 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1141 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1142 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1143 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1144 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1145 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1146 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1147 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1148 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1149 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1150 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1151 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1152 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1153 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1154 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1155 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1156 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1157 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1158 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1159 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1160 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1161 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1162 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1163 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1164 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1165 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1166 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1167 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1168 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1169 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1170 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1171 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1172 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1173 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1174 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1175 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1176 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1177 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1178 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1179 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1180 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1181 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1182 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1183 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1184 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1185 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1186 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1187 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1188 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1189 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1190 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1191 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1192 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1193 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1194 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1195 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1196 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1197 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1198 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1199 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1200 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1201 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1202 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1203 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1204 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1205 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1206 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1207 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1208 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1209 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1210 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1211 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1212 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1213 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1214 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1215 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1216 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1217 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1218 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1219 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1220 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1221 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1222 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1223 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1224 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1225 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1226 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1227 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1228 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1229 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1230 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1231 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1232 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1233 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1234 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1235 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1236 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1237 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1238 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1239 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1240 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1241 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1242 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1243 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1244 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1245 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1246 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1247 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1248 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1249 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1250 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1251 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1252 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1253 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1254 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1255 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1256 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1257 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1258 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1259 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1260 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1261 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1262 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1263 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1264 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1265 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1266 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1267 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1268 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1269 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1270 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1271 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1272 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1273 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1274 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1275 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1276 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1277 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1278 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1279 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1280 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1281 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1282 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1283 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1284 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1285 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1286 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1287 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1288 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1289 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1290 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1291 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1292 }
1293}
1294
1295const char* longSig =
1296 "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1297 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1298 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1299 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1300 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1301 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1302 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1303 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1304 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1305 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1306 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1307 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1308 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1309 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1310 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1311 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1312 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1313 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1314 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1315 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1316 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1317 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1318 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1319 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1320 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1321 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1322 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1323 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1324 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1325 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1326 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1327 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1328 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1329 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1330 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1331 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1332 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1333 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1334 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1335 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1336 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1337 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1338 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1339 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1340 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1341 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1342 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1343 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1344 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1345 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1346 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1347
1348TEST_F(JniCompilerTest, MaxParamNumber) {
1349 TEST_DISABLED_FOR_PORTABLE();
1350 SetUpForTest(false, "maxParamNumber", longSig,
1351 reinterpret_cast<void*>(&Java_MyClassNatives_maxParamNumber));
1352
1353 jvalue args[254];
1354
1355 // First test: test with all arguments null.
1356 for (int i = 0; i < 254; ++i) {
1357 args[i].l = nullptr;
1358 }
1359
1360 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1361
1362 // Second test: test with int[] objects with increasing lengths
1363 for (int i = 0; i < 254; ++i) {
1364 jintArray tmp = env_->NewIntArray(i);
1365 args[i].l = tmp;
1366 EXPECT_NE(args[i].l, nullptr);
1367 }
1368
1369 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1370}
1371
Andreas Gampead615172014-04-04 16:20:13 -07001372TEST_F(JniCompilerTest, WithoutImplementation) {
1373 TEST_DISABLED_FOR_PORTABLE();
1374 SetUpForTest(false, "withoutImplementation", "()V", nullptr);
1375
1376 env_->CallVoidMethod(jobj_, jmethod_);
1377
1378 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1379 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1380}
1381
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001382void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv* env, jclass klass, jint i1, jint i2, jint i3,
1383 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1384 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1385 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1386 jfloat f10) {
1387 EXPECT_EQ(i1, 1);
1388 EXPECT_EQ(i2, 2);
1389 EXPECT_EQ(i3, 3);
1390 EXPECT_EQ(i4, 4);
1391 EXPECT_EQ(i5, 5);
1392 EXPECT_EQ(i6, 6);
1393 EXPECT_EQ(i7, 7);
1394 EXPECT_EQ(i8, 8);
1395 EXPECT_EQ(i9, 9);
1396 EXPECT_EQ(i10, 10);
1397
Andreas Gampec200a4a2014-06-16 18:39:09 -07001398 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001399 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001400 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001401 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001402 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001403 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001404 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001405 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001406 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001407 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001408 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001409 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001410 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001411 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001412 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001413 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001414 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001415 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001416 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001417 EXPECT_EQ(i20, 20);
1418}
1419
1420TEST_F(JniCompilerTest, StackArgsIntsFirst) {
1421 TEST_DISABLED_FOR_PORTABLE();
1422 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
1423 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsIntsFirst));
1424
1425 jint i1 = 1;
1426 jint i2 = 2;
1427 jint i3 = 3;
1428 jint i4 = 4;
1429 jint i5 = 5;
1430 jint i6 = 6;
1431 jint i7 = 7;
1432 jint i8 = 8;
1433 jint i9 = 9;
1434 jint i10 = 10;
1435
Andreas Gampec200a4a2014-06-16 18:39:09 -07001436 jfloat f1 = bit_cast<jint, jfloat>(11);
1437 jfloat f2 = bit_cast<jint, jfloat>(12);
1438 jfloat f3 = bit_cast<jint, jfloat>(13);
1439 jfloat f4 = bit_cast<jint, jfloat>(14);
1440 jfloat f5 = bit_cast<jint, jfloat>(15);
1441 jfloat f6 = bit_cast<jint, jfloat>(16);
1442 jfloat f7 = bit_cast<jint, jfloat>(17);
1443 jfloat f8 = bit_cast<jint, jfloat>(18);
1444 jfloat f9 = bit_cast<jint, jfloat>(19);
1445 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001446
1447 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1448 f3, f4, f5, f6, f7, f8, f9, f10);
1449}
1450
1451void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv* env, jclass klass, jfloat f1, jfloat f2,
1452 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1453 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1454 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1455 jint i9, jint i10) {
1456 EXPECT_EQ(i1, 1);
1457 EXPECT_EQ(i2, 2);
1458 EXPECT_EQ(i3, 3);
1459 EXPECT_EQ(i4, 4);
1460 EXPECT_EQ(i5, 5);
1461 EXPECT_EQ(i6, 6);
1462 EXPECT_EQ(i7, 7);
1463 EXPECT_EQ(i8, 8);
1464 EXPECT_EQ(i9, 9);
1465 EXPECT_EQ(i10, 10);
1466
Andreas Gampec200a4a2014-06-16 18:39:09 -07001467 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001468 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001469 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001470 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001471 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001472 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001473 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001474 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001475 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001476 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001477 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001478 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001479 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001480 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001481 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001482 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001483 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001484 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001485 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001486 EXPECT_EQ(i20, 20);
1487}
1488
1489TEST_F(JniCompilerTest, StackArgsFloatsFirst) {
1490 TEST_DISABLED_FOR_PORTABLE();
1491 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
1492 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsFloatsFirst));
1493
1494 jint i1 = 1;
1495 jint i2 = 2;
1496 jint i3 = 3;
1497 jint i4 = 4;
1498 jint i5 = 5;
1499 jint i6 = 6;
1500 jint i7 = 7;
1501 jint i8 = 8;
1502 jint i9 = 9;
1503 jint i10 = 10;
1504
Andreas Gampec200a4a2014-06-16 18:39:09 -07001505 jfloat f1 = bit_cast<jint, jfloat>(11);
1506 jfloat f2 = bit_cast<jint, jfloat>(12);
1507 jfloat f3 = bit_cast<jint, jfloat>(13);
1508 jfloat f4 = bit_cast<jint, jfloat>(14);
1509 jfloat f5 = bit_cast<jint, jfloat>(15);
1510 jfloat f6 = bit_cast<jint, jfloat>(16);
1511 jfloat f7 = bit_cast<jint, jfloat>(17);
1512 jfloat f8 = bit_cast<jint, jfloat>(18);
1513 jfloat f9 = bit_cast<jint, jfloat>(19);
1514 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001515
1516 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
1517 i4, i5, i6, i7, i8, i9, i10);
1518}
1519
1520void Java_MyClassNatives_stackArgsMixed(JNIEnv* env, jclass klass, jint i1, jfloat f1, jint i2,
1521 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
1522 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
1523 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
1524 EXPECT_EQ(i1, 1);
1525 EXPECT_EQ(i2, 2);
1526 EXPECT_EQ(i3, 3);
1527 EXPECT_EQ(i4, 4);
1528 EXPECT_EQ(i5, 5);
1529 EXPECT_EQ(i6, 6);
1530 EXPECT_EQ(i7, 7);
1531 EXPECT_EQ(i8, 8);
1532 EXPECT_EQ(i9, 9);
1533 EXPECT_EQ(i10, 10);
1534
Andreas Gampec200a4a2014-06-16 18:39:09 -07001535 jint i11 = bit_cast<jfloat, jint>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001536 EXPECT_EQ(i11, 11);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001537 jint i12 = bit_cast<jfloat, jint>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001538 EXPECT_EQ(i12, 12);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001539 jint i13 = bit_cast<jfloat, jint>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001540 EXPECT_EQ(i13, 13);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001541 jint i14 = bit_cast<jfloat, jint>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001542 EXPECT_EQ(i14, 14);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001543 jint i15 = bit_cast<jfloat, jint>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001544 EXPECT_EQ(i15, 15);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001545 jint i16 = bit_cast<jfloat, jint>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001546 EXPECT_EQ(i16, 16);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001547 jint i17 = bit_cast<jfloat, jint>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001548 EXPECT_EQ(i17, 17);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001549 jint i18 = bit_cast<jfloat, jint>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001550 EXPECT_EQ(i18, 18);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001551 jint i19 = bit_cast<jfloat, jint>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001552 EXPECT_EQ(i19, 19);
Andreas Gampec200a4a2014-06-16 18:39:09 -07001553 jint i20 = bit_cast<jfloat, jint>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001554 EXPECT_EQ(i20, 20);
1555}
1556
1557TEST_F(JniCompilerTest, StackArgsMixed) {
1558 TEST_DISABLED_FOR_PORTABLE();
1559 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
1560 reinterpret_cast<void*>(&Java_MyClassNatives_stackArgsMixed));
1561
1562 jint i1 = 1;
1563 jint i2 = 2;
1564 jint i3 = 3;
1565 jint i4 = 4;
1566 jint i5 = 5;
1567 jint i6 = 6;
1568 jint i7 = 7;
1569 jint i8 = 8;
1570 jint i9 = 9;
1571 jint i10 = 10;
1572
Andreas Gampec200a4a2014-06-16 18:39:09 -07001573 jfloat f1 = bit_cast<jint, jfloat>(11);
1574 jfloat f2 = bit_cast<jint, jfloat>(12);
1575 jfloat f3 = bit_cast<jint, jfloat>(13);
1576 jfloat f4 = bit_cast<jint, jfloat>(14);
1577 jfloat f5 = bit_cast<jint, jfloat>(15);
1578 jfloat f6 = bit_cast<jint, jfloat>(16);
1579 jfloat f7 = bit_cast<jint, jfloat>(17);
1580 jfloat f8 = bit_cast<jint, jfloat>(18);
1581 jfloat f9 = bit_cast<jint, jfloat>(19);
1582 jfloat f10 = bit_cast<jint, jfloat>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001583
1584 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
1585 f7, i8, f8, i9, f9, i10, f10);
1586}
1587
Ian Rogersb033c752011-07-20 12:22:35 -07001588} // namespace art