blob: a9044a2047edb837f8ef0a0631a41e3523d9f2aa [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>
Igor Murashkin367f3dd2016-09-01 17:00:24 -070018#include <type_traits>
Ian Rogers700a4022014-05-19 16:49:03 -070019
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010020#include <math.h>
21
Mathieu Chartiere401d142015-04-22 13:56:20 -070022#include "art_method-inl.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070023#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080024#include "common_compiler_test.h"
Igor Murashkin367f3dd2016-09-01 17:00:24 -070025#include "compiler.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070026#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070027#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070028#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070029#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070030#include "mem_map.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070031#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080032#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080033#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070034#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080035#include "mirror/stack_trace_element.h"
Dimitry Ivanov5edb0632016-04-29 11:14:25 -070036#include "nativeloader/native_loader.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070037#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070038#include "ScopedLocalRef.h"
Mathieu Chartier0795f232016-09-27 18:43:30 -070039#include "scoped_thread_state_change-inl.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070040#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070041
Elliott Hughesb264f082012-04-06 17:10:10 -070042extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080043 return count + 1;
44}
45
Elliott Hughesb264f082012-04-06 17:10:10 -070046extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080047 return count + 1;
48}
49
Ian Rogersb033c752011-07-20 12:22:35 -070050namespace art {
51
Igor Murashkin367f3dd2016-09-01 17:00:24 -070052enum class JniKind {
53 kNormal = Compiler::kNone, // Regular kind of un-annotated natives.
54 kFast = Compiler::kFastNative, // Native method annotated with @FastNative.
55 kCritical = Compiler::kCriticalNative, // Native method annotated with @CriticalNative.
56 kCount = Compiler::kCriticalNative + 1 // How many different types of JNIs we can have.
57};
58
59// Used to initialize array sizes that want to have different state per current jni.
60static constexpr size_t kJniKindCount = static_cast<size_t>(JniKind::kCount);
61// Do not use directly, use the helpers instead.
62uint32_t gCurrentJni = static_cast<uint32_t>(JniKind::kNormal);
63
64// Is the current native method under test @CriticalNative?
65static bool IsCurrentJniCritical() {
66 return gCurrentJni == static_cast<uint32_t>(JniKind::kCritical);
67}
68
69// Is the current native method a plain-old non-annotated native?
70static bool IsCurrentJniNormal() {
71 return gCurrentJni == static_cast<uint32_t>(JniKind::kNormal);
72}
73
74// Signifify that a different kind of JNI is about to be tested.
75static void UpdateCurrentJni(JniKind kind) {
76 gCurrentJni = static_cast<uint32_t>(kind);
77}
78
79// (Match the name suffixes of native methods in MyClassNatives.java)
80static std::string CurrentJniStringSuffix() {
81 switch (gCurrentJni) {
82 case static_cast<uint32_t>(JniKind::kNormal): {
83 return "";
84 }
85 case static_cast<uint32_t>(JniKind::kFast): {
86 return "_Fast";
87 }
88 case static_cast<uint32_t>(JniKind::kCritical): {
89 return "_Critical";
90 }
91 default:
92 LOG(FATAL) << "Invalid current JNI value: " << gCurrentJni;
93 UNREACHABLE();
94 }
95}
96
97// Dummy values passed to our JNI handlers when we enter @CriticalNative.
98// Normally @CriticalNative calling convention strips out the "JNIEnv*, jclass" parameters.
99// However to avoid duplicating every single test method we have a templated handler
100// that inserts dummy parameters (0,1) to make it compatible with a regular JNI handler.
101static JNIEnv* const kCriticalDummyJniEnv = reinterpret_cast<JNIEnv*>(0xDEADFEAD);
102static jclass const kCriticalDummyJniClass = reinterpret_cast<jclass>(0xBEAFBEEF);
103
104// Type trait. Returns true if "T" is the same type as one of the types in Args...
105//
106// Logically equal to OR(std::same_type<T, U> for all U in Args).
107template <typename T, typename ... Args>
108struct is_any_of;
109
110template <typename T, typename U, typename ... Args>
111struct is_any_of<T, U, Args ...> {
112 using value_type = bool;
113 static constexpr const bool value = std::is_same<T, U>::value || is_any_of<T, Args ...>::value;
114};
115
116template <typename T, typename U>
117struct is_any_of<T, U> {
118 using value_type = bool;
119 static constexpr const bool value = std::is_same<T, U>::value;
120};
121
122// Type traits for JNI types.
123template <typename T>
124struct jni_type_traits {
125 // True if type T ends up holding an object reference. False otherwise.
126 // (Non-JNI types will also be false).
127 static constexpr const bool is_ref =
128 is_any_of<T, jclass, jobject, jstring, jobjectArray, jintArray,
129 jcharArray, jfloatArray, jshortArray, jdoubleArray, jlongArray>::value;
130};
131
132template <typename ... Args>
133struct count_refs_helper {
134 using value_type = size_t;
135 static constexpr const size_t value = 0;
136};
137
138template <typename Arg, typename ... Args>
139struct count_refs_helper<Arg, Args ...> {
140 using value_type = size_t;
141 static constexpr size_t value =
142 (jni_type_traits<Arg>::is_ref ? 1 : 0) + count_refs_helper<Args ...>::value;
143};
144
145template <typename T, T fn>
146struct count_refs_fn_helper;
147
148template <typename R, typename ... Args, R fn(Args...)>
149struct count_refs_fn_helper<R(Args...), fn> : public count_refs_helper<Args...> {};
150
151// Given a function type 'T' figure out how many of the parameter types are a reference.
152// -- The implicit jclass and thisObject also count as 1 reference.
153//
154// Fields:
155// * value - the result counting # of refs
156// * value_type - the type of value (size_t)
157template <typename T, T fn>
158struct count_refs : public count_refs_fn_helper<T, fn> {};
159
160// Base case: No parameters = 0 refs.
161size_t count_nonnull_refs_helper() {
162 return 0;
163}
164
165// SFINAE for ref types. 1 if non-null, 0 otherwise.
166template <typename T>
167size_t count_nonnull_refs_single_helper(T arg,
168 typename std::enable_if<jni_type_traits<T>::is_ref>::type*
169 = nullptr) {
170 return ((arg == NULL) ? 0 : 1);
171}
172
173// SFINAE for non-ref-types. Always 0.
174template <typename T>
175size_t count_nonnull_refs_single_helper(T arg ATTRIBUTE_UNUSED,
176 typename std::enable_if<!jni_type_traits<T>::is_ref>::type*
177 = nullptr) {
178 return 0;
179}
180
181// Recursive case.
182template <typename T, typename ... Args>
183size_t count_nonnull_refs_helper(T arg, Args ... args) {
184 return count_nonnull_refs_single_helper(arg) + count_nonnull_refs_helper(args...);
185}
186
187// Given any list of parameters, check how many object refs there are and only count
188// them if their runtime value is non-null.
189//
190// For example given (jobject, jint, jclass) we can get (2) if both #0/#2 are non-null,
191// (1) if either #0/#2 are null but not both, and (0) if all parameters are null.
192// Primitive parameters (including JNIEnv*, if present) are ignored.
193template <typename ... Args>
194size_t count_nonnull_refs(Args ... args) {
195 return count_nonnull_refs_helper(args...);
196}
197
198template <typename T, T fn>
199struct remove_extra_parameters_helper;
200
201template <typename R, typename Arg1, typename Arg2, typename ... Args, R fn(Arg1, Arg2, Args...)>
202struct remove_extra_parameters_helper<R(Arg1, Arg2, Args...), fn> {
203 // Note: Do not use Args&& here to maintain C-style parameter types.
204 static R apply(Args... args) {
205 JNIEnv* env = kCriticalDummyJniEnv;
206 jclass kls = kCriticalDummyJniClass;
207 return fn(env, kls, args...);
208 }
209};
210
211// Given a function 'fn' create a function 'apply' which will omit the JNIEnv/jklass parameters
212//
213// i.e. if fn(JNIEnv*,jklass,a,b,c,d,e...) then apply(a,b,c,d,e,...)
214template <typename T, T fn>
215struct jni_remove_extra_parameters : public remove_extra_parameters_helper<T, fn> {};
216
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -0800217class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -0700218 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700219 void SetUp() OVERRIDE {
220 CommonCompilerTest::SetUp();
221 check_generic_jni_ = false;
222 }
223
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700224 void TearDown() OVERRIDE {
225 android::ResetNativeLoader();
226 CommonCompilerTest::TearDown();
227 }
228
Andreas Gampe6e498692014-08-18 16:43:12 -0700229 void SetCheckGenericJni(bool generic) {
230 check_generic_jni_ = generic;
231 }
232
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700233 private:
234 void CompileForTest(jobject class_loader,
235 bool direct,
236 const char* method_name,
237 const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700238 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700239 StackHandleScope<1> hs(soa.Self());
240 Handle<mirror::ClassLoader> loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -0700241 hs.NewHandle(soa.Decode<mirror::ClassLoader>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -0700242 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -0800243 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700244 const auto pointer_size = class_linker_->GetImagePointerSize();
245 ArtMethod* method = direct ? c->FindDirectMethod(method_name, method_sig, pointer_size) :
246 c->FindVirtualMethod(method_name, method_sig, pointer_size);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700247 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Andreas Gampe6e498692014-08-18 16:43:12 -0700248 if (check_generic_jni_) {
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700249 method->SetEntryPointFromQuickCompiledCode(class_linker_->GetRuntimeQuickGenericJniStub());
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100250 } else {
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700251 const void* code = method->GetEntryPointFromQuickCompiledCode();
252 if (code == nullptr || class_linker_->IsQuickGenericJniStub(code)) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100253 CompileMethod(method);
254 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
255 << method_name << " " << method_sig;
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100256 }
Brian Carlstrom25c33252011-09-18 15:58:35 -0700257 }
Brian Carlstrom25c33252011-09-18 15:58:35 -0700258 }
259
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700260 protected:
261 void CompileForTestWithCurrentJni(jobject class_loader,
262 bool direct,
263 const char* method_name_orig,
264 const char* method_sig) {
265 // Append the JNI kind to the method name, so that we automatically get the
266 // fast or critical versions of the same method.
267 std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
268 const char* method_name = method_name_str.c_str();
269
270 CompileForTest(class_loader, direct, method_name, method_sig);
271 }
272
273 void SetUpForTest(bool direct,
274 const char* method_name_orig,
275 const char* method_sig,
Andreas Gampe6e498692014-08-18 16:43:12 -0700276 void* native_fnptr) {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700277 // Append the JNI kind to the method name, so that we automatically get the
278 // fast or critical versions of the same method.
279 std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
280 const char* method_name = method_name_str.c_str();
281
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700282 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -0700283 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700284 {
285 ScopedObjectAccess soa(Thread::Current());
286 class_loader_ = LoadDex("MyClassNatives");
287 }
Andreas Gampe6e498692014-08-18 16:43:12 -0700288 CompileForTest(class_loader_, direct, method_name, method_sig);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700289 // Start runtime.
290 Thread::Current()->TransitionFromSuspendedToRunnable();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700291 android::InitializeNativeLoader();
Dimitry Ivanovc544f342016-05-09 16:26:13 -0700292 bool started = runtime_->Start();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700293 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700294 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700295 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700296 env_ = Thread::Current()->GetJniEnv();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700297 library_search_path_ = env_->NewStringUTF("");
Elliott Hughesb264f082012-04-06 17:10:10 -0700298 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700299 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700300
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700301 if (direct) {
302 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
303 } else {
304 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
305 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700306 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700307
Andreas Gampecf4035a2014-05-28 22:43:01 -0700308 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700309 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700310 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
311 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700312 } else {
313 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700314 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700315
316 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
317 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700318 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700319 }
320
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700321 public:
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700322 // Available as statics so our JNI handlers can access these.
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700323 static jclass jklass_;
324 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700325 static jobject class_loader_;
326
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700327 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700328 // We have to list the methods here so we can share them between default and generic JNI.
329 void CompileAndRunNoArgMethodImpl();
330 void CompileAndRunIntMethodThroughStubImpl();
331 void CompileAndRunStaticIntMethodThroughStubImpl();
332 void CompileAndRunIntMethodImpl();
333 void CompileAndRunIntIntMethodImpl();
334 void CompileAndRunLongLongMethodImpl();
335 void CompileAndRunDoubleDoubleMethodImpl();
336 void CompileAndRun_fooJJ_synchronizedImpl();
337 void CompileAndRunIntObjectObjectMethodImpl();
338 void CompileAndRunStaticIntIntMethodImpl();
339 void CompileAndRunStaticDoubleDoubleMethodImpl();
340 void RunStaticLogDoubleMethodImpl();
341 void RunStaticLogFloatMethodImpl();
342 void RunStaticReturnTrueImpl();
343 void RunStaticReturnFalseImpl();
344 void RunGenericStaticReturnIntImpl();
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700345 void RunGenericStaticReturnDoubleImpl();
346 void RunGenericStaticReturnLongImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700347 void CompileAndRunStaticIntObjectObjectMethodImpl();
348 void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl();
349 void ExceptionHandlingImpl();
350 void NativeStackTraceElementImpl();
351 void ReturnGlobalRefImpl();
352 void LocalReferenceTableClearingTestImpl();
353 void JavaLangSystemArrayCopyImpl();
354 void CompareAndSwapIntImpl();
355 void GetTextImpl();
356 void GetSinkPropertiesNativeImpl();
357 void UpcallReturnTypeChecking_InstanceImpl();
358 void UpcallReturnTypeChecking_StaticImpl();
359 void UpcallArgumentTypeChecking_InstanceImpl();
360 void UpcallArgumentTypeChecking_StaticImpl();
361 void CompileAndRunFloatFloatMethodImpl();
362 void CheckParameterAlignImpl();
363 void MaxParamNumberImpl();
364 void WithoutImplementationImpl();
Andreas Gampe48ee3562015-04-10 19:57:29 -0700365 void WithoutImplementationRefReturnImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700366 void StackArgsIntsFirstImpl();
367 void StackArgsFloatsFirstImpl();
368 void StackArgsMixedImpl();
Lazar Trsicf652d602015-06-24 16:30:21 +0200369 void StackArgsSignExtendedMips64Impl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700370
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700371 void NormalNativeImpl();
372 void FastNativeImpl();
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700373 void CriticalNativeImpl();
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700374
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700375 JNIEnv* env_;
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700376 jstring library_search_path_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700377 jmethodID jmethod_;
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700378
379 private:
Andreas Gampe6e498692014-08-18 16:43:12 -0700380 bool check_generic_jni_;
Ian Rogersb033c752011-07-20 12:22:35 -0700381};
382
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700383jclass JniCompilerTest::jklass_;
384jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700385jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700386
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700387// Test the normal compiler and normal generic JNI only.
388// The following features are unsupported in @FastNative:
389// 1) JNI stubs (lookup via dlsym) when methods aren't explicitly registered
Igor Murashkinaf1e2992016-10-12 17:44:50 -0700390// 2) synchronized keyword
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700391// -- TODO: We can support (1) if we remove the mutator lock assert during stub lookup.
392# define JNI_TEST_NORMAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700393 TEST_F(JniCompilerTest, TestName ## NormalCompiler) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700394 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700395 SCOPED_TRACE("Normal JNI with compiler"); \
396 gCurrentJni = static_cast<uint32_t>(JniKind::kNormal); \
Andreas Gampe6e498692014-08-18 16:43:12 -0700397 TestName ## Impl(); \
398 } \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700399 TEST_F(JniCompilerTest, TestName ## NormalGeneric) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700400 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700401 SCOPED_TRACE("Normal JNI with generic"); \
402 gCurrentJni = static_cast<uint32_t>(JniKind::kNormal); \
Andreas Gampe6e498692014-08-18 16:43:12 -0700403 SetCheckGenericJni(true); \
404 TestName ## Impl(); \
405 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700406
Igor Murashkin06a04e02016-09-13 15:57:37 -0700407// Test (normal, @FastNative) x (compiler, generic).
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700408#define JNI_TEST(TestName) \
409 JNI_TEST_NORMAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700410 TEST_F(JniCompilerTest, TestName ## FastCompiler) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700411 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700412 SCOPED_TRACE("@FastNative JNI with compiler"); \
413 gCurrentJni = static_cast<uint32_t>(JniKind::kFast); \
414 TestName ## Impl(); \
415 } \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700416 \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700417 TEST_F(JniCompilerTest, TestName ## FastGeneric) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700418 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700419 SCOPED_TRACE("@FastNative JNI with generic"); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700420 gCurrentJni = static_cast<uint32_t>(JniKind::kFast); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700421 SetCheckGenericJni(true); \
422 TestName ## Impl(); \
423 }
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700424
Igor Murashkin06a04e02016-09-13 15:57:37 -0700425// Test (@CriticalNative) x (compiler, generic) only.
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700426#define JNI_TEST_CRITICAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700427 TEST_F(JniCompilerTest, TestName ## CriticalCompiler) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700428 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700429 SCOPED_TRACE("@CriticalNative JNI with compiler"); \
430 gCurrentJni = static_cast<uint32_t>(JniKind::kCritical); \
431 TestName ## Impl(); \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700432 } \
433 TEST_F(JniCompilerTest, TestName ## CriticalGeneric) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700434 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700435 SCOPED_TRACE("@CriticalNative JNI with generic"); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700436 gCurrentJni = static_cast<uint32_t>(JniKind::kCritical); \
Igor Murashkin294a9152016-09-28 13:23:19 -0700437 SetCheckGenericJni(true); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700438 TestName ## Impl(); \
439 }
Igor Murashkin06a04e02016-09-13 15:57:37 -0700440
441// Test everything: (normal, @FastNative, @CriticalNative) x (compiler, generic).
442#define JNI_TEST_CRITICAL(TestName) \
443 JNI_TEST(TestName) \
444 JNI_TEST_CRITICAL_ONLY(TestName) \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700445
446static void expectValidThreadState() {
447 // Normal JNI always transitions to "Native". Other JNIs stay in the "Runnable" state.
448 if (IsCurrentJniNormal()) {
449 EXPECT_EQ(kNative, Thread::Current()->GetState());
450 } else {
451 EXPECT_EQ(kRunnable, Thread::Current()->GetState());
452 }
453}
454
455#define EXPECT_THREAD_STATE_FOR_CURRENT_JNI() expectValidThreadState()
456
457static void expectValidMutatorLockHeld() {
458 if (IsCurrentJniNormal()) {
459 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
460 } else {
461 Locks::mutator_lock_->AssertSharedHeld(Thread::Current());
462 }
463}
464
465#define EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI() expectValidMutatorLockHeld()
466
467static void expectValidJniEnvAndObject(JNIEnv* env, jobject thisObj) {
468 if (!IsCurrentJniCritical()) {
469 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
470 ASSERT_TRUE(thisObj != nullptr);
471 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
472 } else {
473 LOG(FATAL) << "Objects are not supported for @CriticalNative, why is this being tested?";
474 UNREACHABLE();
475 }
476}
477
478// Validates the JNIEnv to be the same as the current thread's JNIEnv, and makes sure
479// that the object here is an instance of the class we registered the method with.
480//
481// Hard-fails if this somehow gets invoked for @CriticalNative since objects are unsupported.
482#define EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj) \
483 expectValidJniEnvAndObject(env, thisObj)
484
485static void expectValidJniEnvAndClass(JNIEnv* env, jclass kls) {
486 if (!IsCurrentJniCritical()) {
487 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
488 ASSERT_TRUE(kls != nullptr);
489 EXPECT_TRUE(env->IsSameObject(static_cast<jobject>(JniCompilerTest::jklass_),
490 static_cast<jobject>(kls)));
491 } else {
492 // This is pretty much vacuously true but catch any testing setup mistakes.
493 EXPECT_EQ(env, kCriticalDummyJniEnv);
494 EXPECT_EQ(kls, kCriticalDummyJniClass);
495 }
496}
497
498// Validates the JNIEnv is the same as the current thread's JNIenv, and makes sure
499// that the jclass we got in the JNI handler is the same one as the class the method was looked
500// up for.
501//
502// (Checks are skipped for @CriticalNative since the two values are dummy).
503#define EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls) expectValidJniEnvAndClass(env, kls)
504
505// Temporarily disable the EXPECT_NUM_STACK_REFERENCES check (for a single test).
506struct ScopedDisableCheckNumStackReferences {
507 ScopedDisableCheckNumStackReferences() {
Igor Murashkin06a04e02016-09-13 15:57:37 -0700508 CHECK(sCheckNumStackReferences); // No nested support.
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700509 sCheckNumStackReferences = false;
510 }
511
512 ~ScopedDisableCheckNumStackReferences() {
513 sCheckNumStackReferences = true;
514 }
515
516 static bool sCheckNumStackReferences;
517};
518
519bool ScopedDisableCheckNumStackReferences::sCheckNumStackReferences = true;
520
Igor Murashkina51d8b72016-10-05 14:33:30 -0700521// Check that the handle scope at the start of this block is the same as the handle scope at the end of the block.
522struct ScopedCheckHandleScope {
Igor Murashkin42298112016-10-06 10:51:11 -0700523 ScopedCheckHandleScope() : handle_scope_(Thread::Current()->GetTopHandleScope()) {
Igor Murashkina51d8b72016-10-05 14:33:30 -0700524 }
525
526 ~ScopedCheckHandleScope() {
527 EXPECT_EQ(handle_scope_, Thread::Current()->GetTopHandleScope())
528 << "Top-most handle scope must be the same after all the JNI "
529 << "invocations have finished (as before they were invoked).";
530 }
531
Mathieu Chartiere8a3c572016-10-11 16:52:17 -0700532 BaseHandleScope* const handle_scope_;
Igor Murashkina51d8b72016-10-05 14:33:30 -0700533};
534
Andreas Gampe0a855762016-10-26 13:43:14 -0700535// Number of references allocated in JNI ShadowFrames on the given thread.
536static size_t NumJniShadowFrameReferences(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_) {
537 return self->GetManagedStack()->NumJniShadowFrameReferences();
538}
539
540// Number of references in handle scope on the given thread.
541static size_t NumHandleReferences(Thread* self) {
542 size_t count = 0;
543 for (BaseHandleScope* cur = self->GetTopHandleScope(); cur != nullptr; cur = cur->GetLink()) {
544 count += cur->NumberOfReferences();
545 }
546 return count;
547}
548
549// Number of references allocated in handle scopes & JNI shadow frames on this thread.
550static size_t NumStackReferences(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_) {
551 return NumHandleReferences(self) + NumJniShadowFrameReferences(self);
552}
553
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700554static void expectNumStackReferences(size_t val1, size_t val2) {
555 // In rare cases when JNI functions call themselves recursively,
556 // disable this test because it will have a false negative.
557 if (!IsCurrentJniCritical() && ScopedDisableCheckNumStackReferences::sCheckNumStackReferences) {
558 /* @CriticalNative doesn't build a HandleScope, so this test is meaningless then. */
559 ScopedObjectAccess soa(Thread::Current());
560
Andreas Gampe0a855762016-10-26 13:43:14 -0700561 size_t actual_num = NumStackReferences(Thread::Current());
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700562 // XX: Not too sure what's going on.
563 // Sometimes null references get placed and sometimes they don't?
564 EXPECT_TRUE(val1 == actual_num || val2 == actual_num)
565 << "expected either " << val1 << " or " << val2
566 << " number of stack references, but got: " << actual_num;
567 }
568}
569
570#define EXPECT_NUM_STACK_REFERENCES(val1, val2) expectNumStackReferences(val1, val2)
571
572template <typename T, T fn>
573struct make_jni_test_decorator;
574
575// Decorator for "static" JNI callbacks.
576template <typename R, typename ... Args, R fn(JNIEnv*, jclass, Args...)>
577struct make_jni_test_decorator<R(JNIEnv*, jclass kls, Args...), fn> {
578 static R apply(JNIEnv* env, jclass kls, Args ... args) {
579 EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
580 EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
581 EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls);
582 // All incoming parameters + the jclass get put into the transition's StackHandleScope.
583 EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(kls, args...),
584 (count_refs_helper<jclass, Args...>::value));
585
586 return fn(env, kls, args...);
587 }
588};
589
590// Decorator for instance JNI callbacks.
591template <typename R, typename ... Args, R fn(JNIEnv*, jobject, Args...)>
592struct make_jni_test_decorator<R(JNIEnv*, jobject, Args...), fn> {
593 static R apply(JNIEnv* env, jobject thisObj, Args ... args) {
594 EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
595 EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
596 EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj);
597 // All incoming parameters + the implicit 'this' get put into the transition's StackHandleScope.
598 EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(thisObj, args...),
599 (count_refs_helper<jobject, Args...>::value));
600
601 return fn(env, thisObj, args...);
602 }
603};
604
605// Decorate the regular JNI callee with the extra gtest checks.
606// This way we can have common test logic for everything generic like checking if a lock is held,
607// checking handle scope state, etc.
608#define MAKE_JNI_TEST_DECORATOR(fn) make_jni_test_decorator<decltype(fn), (fn)>::apply
609
610// Convert function f(JNIEnv*,jclass,a,b,c,d...) into f2(a,b,c,d...)
611// -- This way we don't have to write out each implementation twice for @CriticalNative.
612#define JNI_CRITICAL_WRAPPER(func) jni_remove_extra_parameters<decltype(func), (func)>::apply
613// Get a function pointer whose calling convention either matches a regular native
614// or a critical native depending on which kind of jni is currently under test.
615// -- This also has the benefit of genering a compile time error if the 'func' doesn't properly
616// have JNIEnv and jclass parameters first.
617#define CURRENT_JNI_WRAPPER(func) \
618 (IsCurrentJniCritical() \
619 ? reinterpret_cast<void*>(&JNI_CRITICAL_WRAPPER(MAKE_JNI_TEST_DECORATOR(func))) \
620 : reinterpret_cast<void*>(&MAKE_JNI_TEST_DECORATOR(func)))
621
622// Do the opposite of the above. Do *not* wrap the function, instead just cast it to a void*.
623// Only for "TEST_JNI_NORMAL_ONLY" configs, and it inserts a test assert to ensure this is the case.
624#define NORMAL_JNI_ONLY_NOWRAP(func) \
625 ({ ASSERT_TRUE(IsCurrentJniNormal()); reinterpret_cast<void*>(&(func)); })
626// Same as above, but with nullptr. When we want to test the stub functionality.
627#define NORMAL_JNI_ONLY_NULLPTR \
628 ({ ASSERT_TRUE(IsCurrentJniNormal()); nullptr; })
629
630
631int gJava_MyClassNatives_foo_calls[kJniKindCount] = {};
632void Java_MyClassNatives_foo(JNIEnv*, jobject) {
633 gJava_MyClassNatives_foo_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700634}
635
Andreas Gampe6e498692014-08-18 16:43:12 -0700636void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700637 SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700638
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700639 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700640 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700641 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700642 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700643 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700644
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700645 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700646}
647
Andreas Gampe6e498692014-08-18 16:43:12 -0700648JNI_TEST(CompileAndRunNoArgMethod)
649
650void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700651 SetUpForTest(false, "bar", "(I)I", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700652 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700653
Shih-wei Liao31384c52011-09-06 15:27:45 -0700654 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800655 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700656 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700657 << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700658
659 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
660 EXPECT_EQ(25, result);
661}
662
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700663// TODO: Support @FastNative and @CriticalNative through stubs.
664JNI_TEST_NORMAL_ONLY(CompileAndRunIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700665
666void JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700667 SetUpForTest(true, "sbar", "(I)I", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700668 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800669
670 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800671 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700672 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700673 << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800674
675 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
676 EXPECT_EQ(43, result);
677}
678
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700679// TODO: Support @FastNative and @CriticalNative through stubs.
680JNI_TEST_NORMAL_ONLY(CompileAndRunStaticIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700681
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700682int gJava_MyClassNatives_fooI_calls[kJniKindCount] = {};
683jint Java_MyClassNatives_fooI(JNIEnv*, jobject, jint x) {
684 gJava_MyClassNatives_fooI_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700685 return x;
686}
687
Andreas Gampe6e498692014-08-18 16:43:12 -0700688void JniCompilerTest::CompileAndRunIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700689 SetUpForTest(false, "fooI", "(I)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700690 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700691
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700692 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700693 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
694 EXPECT_EQ(42, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700695 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700696 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
697 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700698 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700699
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700700 gJava_MyClassNatives_fooI_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700701}
702
Andreas Gampe6e498692014-08-18 16:43:12 -0700703JNI_TEST(CompileAndRunIntMethod)
704
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700705int gJava_MyClassNatives_fooII_calls[kJniKindCount] = {};
706jint Java_MyClassNatives_fooII(JNIEnv*, jobject, jint x, jint y) {
707 gJava_MyClassNatives_fooII_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700708 return x - y; // non-commutative operator
709}
710
Andreas Gampe6e498692014-08-18 16:43:12 -0700711void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700712 SetUpForTest(false, "fooII", "(II)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700713 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700714
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700715 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700716 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
717 EXPECT_EQ(99 - 10, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700718 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700719 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
720 0xCAFED00D);
721 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700722 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700723
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700724 gJava_MyClassNatives_fooII_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700725}
726
Andreas Gampe6e498692014-08-18 16:43:12 -0700727JNI_TEST(CompileAndRunIntIntMethod)
728
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700729int gJava_MyClassNatives_fooJJ_calls[kJniKindCount] = {};
730jlong Java_MyClassNatives_fooJJ(JNIEnv*, jobject, jlong x, jlong y) {
731 gJava_MyClassNatives_fooJJ_calls[gCurrentJni]++;
Ian Rogers9b269d22011-09-04 14:06:05 -0700732 return x - y; // non-commutative operator
733}
734
Andreas Gampe6e498692014-08-18 16:43:12 -0700735void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700736 SetUpForTest(false, "fooJJ", "(JJ)J",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700737 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700738
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700739 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Ian Rogers0f678472014-03-10 16:18:37 -0700740 jlong a = INT64_C(0x1234567890ABCDEF);
741 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700742 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
743 EXPECT_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700744 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Ian Rogers9b269d22011-09-04 14:06:05 -0700745 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
746 EXPECT_EQ(b - a, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700747 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700748
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700749 gJava_MyClassNatives_fooJJ_calls[gCurrentJni] = 0;
Ian Rogers9b269d22011-09-04 14:06:05 -0700750}
751
Andreas Gampe6e498692014-08-18 16:43:12 -0700752JNI_TEST(CompileAndRunLongLongMethod)
753
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700754int gJava_MyClassNatives_fooDD_calls[kJniKindCount] = {};
755jdouble Java_MyClassNatives_fooDD(JNIEnv*, jobject, jdouble x, jdouble y) {
756 gJava_MyClassNatives_fooDD_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700757 return x - y; // non-commutative operator
758}
759
Andreas Gampe6e498692014-08-18 16:43:12 -0700760void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700761 SetUpForTest(false, "fooDD", "(DD)D",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700762 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700763
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700764 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700765 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
766 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700767 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700768 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700769 jdouble a = 3.14159265358979323846;
770 jdouble b = 0.69314718055994530942;
771 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700772 EXPECT_DOUBLE_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700773 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700774
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700775 gJava_MyClassNatives_fooDD_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700776}
777
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700778int gJava_MyClassNatives_fooJJ_synchronized_calls[kJniKindCount] = {};
779jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv*, jobject, jlong x, jlong y) {
780 gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]++;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700781 return x | y;
782}
783
Andreas Gampe6e498692014-08-18 16:43:12 -0700784void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700785 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700786 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ_synchronized));
Elliott Hughes3e778f72012-05-21 15:29:52 -0700787
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700788 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700789 jlong a = 0x1000000020000000ULL;
790 jlong b = 0x00ff000000aa0000ULL;
791 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
792 EXPECT_EQ(a | b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700793 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700794
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700795 gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni] = 0;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700796}
797
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700798JNI_TEST_NORMAL_ONLY(CompileAndRun_fooJJ_synchronized)
Andreas Gampe6e498692014-08-18 16:43:12 -0700799
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700800int gJava_MyClassNatives_fooIOO_calls[kJniKindCount] = {};
801jobject Java_MyClassNatives_fooIOO(JNIEnv*, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700802 jobject z) {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700803 gJava_MyClassNatives_fooIOO_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700804 switch (x) {
805 case 1:
806 return y;
807 case 2:
808 return z;
809 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700810 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700811 }
812}
813
Andreas Gampe6e498692014-08-18 16:43:12 -0700814void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700815 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700816 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700817 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700818
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700819 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700820 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700821 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700822 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700823
Andreas Gampecf4035a2014-05-28 22:43:01 -0700824 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700825 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700826 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700827 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
828 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700829 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700830 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700831 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700832 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700833
Andreas Gampecf4035a2014-05-28 22:43:01 -0700834 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700835 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700836 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700837 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700838 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700839 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700840 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
841 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700842 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700843
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700844 gJava_MyClassNatives_fooIOO_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700845}
846
Igor Murashkinaf1e2992016-10-12 17:44:50 -0700847JNI_TEST(CompileAndRunIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700848
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700849int gJava_MyClassNatives_fooSII_calls[kJniKindCount] = {};
850jint Java_MyClassNatives_fooSII(JNIEnv* env ATTRIBUTE_UNUSED,
851 jclass klass ATTRIBUTE_UNUSED,
852 jint x,
853 jint y) {
854 gJava_MyClassNatives_fooSII_calls[gCurrentJni]++;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700855 return x + y;
856}
857
Andreas Gampe6e498692014-08-18 16:43:12 -0700858void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700859 SetUpForTest(true, "fooSII", "(II)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700860 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700861
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700862 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700863 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
864 EXPECT_EQ(50, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700865 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700866
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700867 gJava_MyClassNatives_fooSII_calls[gCurrentJni] = 0;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700868}
869
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700870JNI_TEST_CRITICAL(CompileAndRunStaticIntIntMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700871
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700872int gJava_MyClassNatives_fooSDD_calls[kJniKindCount] = {};
873jdouble Java_MyClassNatives_fooSDD(JNIEnv* env ATTRIBUTE_UNUSED,
874 jclass klass ATTRIBUTE_UNUSED,
875 jdouble x,
876 jdouble y) {
877 gJava_MyClassNatives_fooSDD_calls[gCurrentJni]++;
Ian Rogers7a99c112011-09-07 12:48:27 -0700878 return x - y; // non-commutative operator
879}
880
Andreas Gampe6e498692014-08-18 16:43:12 -0700881void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700882 SetUpForTest(true, "fooSDD", "(DD)D",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700883 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700884
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700885 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Ian Rogers7a99c112011-09-07 12:48:27 -0700886 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700887 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700888 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Ian Rogers7a99c112011-09-07 12:48:27 -0700889 jdouble a = 3.14159265358979323846;
890 jdouble b = 0.69314718055994530942;
891 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700892 EXPECT_DOUBLE_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700893 EXPECT_DOUBLE_EQ(2, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700894
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700895 gJava_MyClassNatives_fooSDD_calls[gCurrentJni] = 0;
Ian Rogers7a99c112011-09-07 12:48:27 -0700896}
897
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700898JNI_TEST_CRITICAL(CompileAndRunStaticDoubleDoubleMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700899
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100900// The x86 generic JNI code had a bug where it assumed a floating
901// point return value would be in xmm0. We use log, to somehow ensure
902// the compiler will use the floating point stack.
903
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700904jdouble Java_MyClassNatives_logD(JNIEnv*, jclass, jdouble x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100905 return log(x);
906}
907
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700908jdouble Java_MyClassNatives_logD_notNormal(JNIEnv*, jclass, jdouble x) {
909 EXPECT_DOUBLE_EQ(2.0, x);
910 return log(x);
911}
912
Andreas Gampe6e498692014-08-18 16:43:12 -0700913void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700914 void* jni_handler;
915 if (IsCurrentJniNormal()) {
916 // This test seems a bit special, don't use a JNI wrapper here.
917 jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logD);
918 } else {
919 jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logD_notNormal);
920 }
921 SetUpForTest(true, "logD", "(D)D", jni_handler);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100922
923 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700924 EXPECT_DOUBLE_EQ(log(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100925}
926
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700927JNI_TEST_CRITICAL(RunStaticLogDoubleMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700928
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700929jfloat Java_MyClassNatives_logF(JNIEnv*, jclass, jfloat x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100930 return logf(x);
931}
932
Andreas Gampe6e498692014-08-18 16:43:12 -0700933void JniCompilerTest::RunStaticLogFloatMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700934 void* jni_handler;
935 if (IsCurrentJniNormal()) {
936 // This test seems a bit special, don't use a JNI wrapper here.
937 jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logF);
938 } else {
939 jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logF);
940 }
941
942 SetUpForTest(true, "logF", "(F)F", jni_handler);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100943
944 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700945 EXPECT_FLOAT_EQ(logf(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100946}
947
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700948JNI_TEST_CRITICAL(RunStaticLogFloatMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700949
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700950jboolean Java_MyClassNatives_returnTrue(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100951 return JNI_TRUE;
952}
953
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700954jboolean Java_MyClassNatives_returnFalse(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100955 return JNI_FALSE;
956}
957
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700958jint Java_MyClassNatives_returnInt(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100959 return 42;
960}
961
Andreas Gampe6e498692014-08-18 16:43:12 -0700962void JniCompilerTest::RunStaticReturnTrueImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700963 SetUpForTest(true, "returnTrue", "()Z", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnTrue));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100964
965 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
966 EXPECT_TRUE(result);
967}
968
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700969JNI_TEST_CRITICAL(RunStaticReturnTrue)
Andreas Gampe6e498692014-08-18 16:43:12 -0700970
971void JniCompilerTest::RunStaticReturnFalseImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100972 SetUpForTest(true, "returnFalse", "()Z",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700973 CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnFalse));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100974
975 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
976 EXPECT_FALSE(result);
977}
978
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700979JNI_TEST_CRITICAL(RunStaticReturnFalse)
Andreas Gampe6e498692014-08-18 16:43:12 -0700980
981void JniCompilerTest::RunGenericStaticReturnIntImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700982 SetUpForTest(true, "returnInt", "()I", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnInt));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100983
984 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
985 EXPECT_EQ(42, result);
986}
987
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700988JNI_TEST_CRITICAL(RunGenericStaticReturnInt)
Andreas Gampe6e498692014-08-18 16:43:12 -0700989
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700990int gJava_MyClassNatives_returnDouble_calls[kJniKindCount] = {};
991jdouble Java_MyClassNatives_returnDouble(JNIEnv*, jclass) {
992 gJava_MyClassNatives_returnDouble_calls[gCurrentJni]++;
993 return 4.0;
994}
995
996void JniCompilerTest::RunGenericStaticReturnDoubleImpl() {
997 SetUpForTest(true, "returnDouble", "()D", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnDouble));
998
999 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_);
1000 EXPECT_DOUBLE_EQ(4.0, result);
1001 EXPECT_EQ(1, gJava_MyClassNatives_returnDouble_calls[gCurrentJni]);
1002
1003 gJava_MyClassNatives_returnDouble_calls[gCurrentJni] = 0;
1004}
1005
1006JNI_TEST_CRITICAL(RunGenericStaticReturnDouble)
1007
1008jlong Java_MyClassNatives_returnLong(JNIEnv*, jclass) {
1009 return 0xFEEDDEADFEEDL;
1010}
1011
1012void JniCompilerTest::RunGenericStaticReturnLongImpl() {
1013 SetUpForTest(true, "returnLong", "()J", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnLong));
1014
1015 jlong result = env_->CallStaticLongMethod(jklass_, jmethod_);
1016 EXPECT_EQ(0xFEEDDEADFEEDL, result);
1017}
1018
1019JNI_TEST_CRITICAL(RunGenericStaticReturnLong)
1020
1021int gJava_MyClassNatives_fooSIOO_calls[kJniKindCount] = {};
1022jobject Java_MyClassNatives_fooSIOO(JNIEnv*, jclass klass, jint x, jobject y, jobject z) {
1023 gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -07001024 switch (x) {
1025 case 1:
1026 return y;
1027 case 2:
1028 return z;
1029 default:
1030 return klass;
1031 }
1032}
1033
Andreas Gampe6e498692014-08-18 16:43:12 -07001034void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001035 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001036 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001037 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001038
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001039 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001040 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001041 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001042 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001043
Andreas Gampecf4035a2014-05-28 22:43:01 -07001044 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001045 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001046 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001047 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1048 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001049 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001050 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001051 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001052 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001053
Andreas Gampecf4035a2014-05-28 22:43:01 -07001054 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001055 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001056 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001057 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001058 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001059 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001060 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1061 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001062 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001063
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001064 gJava_MyClassNatives_fooSIOO_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001065}
1066
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001067JNI_TEST(CompileAndRunStaticIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -07001068
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001069int gJava_MyClassNatives_fooSSIOO_calls[kJniKindCount] = {};
1070jobject Java_MyClassNatives_fooSSIOO(JNIEnv*, jclass klass, jint x, jobject y, jobject z) {
1071 gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]++;
Ian Rogersdf20fe02011-07-20 20:34:16 -07001072 switch (x) {
1073 case 1:
1074 return y;
1075 case 2:
1076 return z;
1077 default:
1078 return klass;
1079 }
1080}
1081
Andreas Gampe6e498692014-08-18 16:43:12 -07001082void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001083 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001084 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001085 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -07001086
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001087 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001088 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001089 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001090 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001091
Andreas Gampecf4035a2014-05-28 22:43:01 -07001092 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001093 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001094 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001095 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1096 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001097 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001098 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001099 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001100 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001101
Andreas Gampecf4035a2014-05-28 22:43:01 -07001102 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001103 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001104 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001105 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001106 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001107 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001108 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1109 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001110 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001111
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001112 gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni] = 0;
Ian Rogersdf20fe02011-07-20 20:34:16 -07001113}
1114
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001115// TODO: Maybe. @FastNative support for returning Objects?
1116JNI_TEST_NORMAL_ONLY(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -07001117
Elliott Hughesb264f082012-04-06 17:10:10 -07001118void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -07001119 jclass c = env->FindClass("java/lang/RuntimeException");
1120 env->ThrowNew(c, "hello");
1121}
Ian Rogers45a76cb2011-07-21 22:00:15 -07001122
Andreas Gampe6e498692014-08-18 16:43:12 -07001123void JniCompilerTest::ExceptionHandlingImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001124 {
1125 ASSERT_FALSE(runtime_->IsStarted());
1126 ScopedObjectAccess soa(Thread::Current());
1127 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -07001128
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001129 // all compilation needs to happen before Runtime::Start
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001130 CompileForTestWithCurrentJni(class_loader_, false, "foo", "()V");
1131 CompileForTestWithCurrentJni(class_loader_, false, "throwException", "()V");
1132 CompileForTestWithCurrentJni(class_loader_, false, "foo", "()V");
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001133 }
1134 // Start runtime to avoid re-initialization in SetupForTest.
1135 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -07001136 bool started = runtime_->Start();
1137 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -07001138
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001139 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -07001140
Ian Rogers67375ac2011-09-14 00:55:44 -07001141 // Check a single call of a JNI method is ok
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001142 SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001143 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001144 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogers67375ac2011-09-14 00:55:44 -07001145 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -07001146
Ian Rogers67375ac2011-09-14 00:55:44 -07001147 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001148 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
1149 SetUpForTest(false, "throwException", "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001150 CURRENT_JNI_WRAPPER(Java_MyClassNatives_throwException));
Elliott Hughesb264f082012-04-06 17:10:10 -07001151 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -07001152 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001153 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001154 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1155 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
1156 env_->ExceptionClear();
1157 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -07001158
Ian Rogers67375ac2011-09-14 00:55:44 -07001159 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001160 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001161 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001162 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001163
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001164 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Ian Rogers45a76cb2011-07-21 22:00:15 -07001165}
1166
Andreas Gampe6e498692014-08-18 16:43:12 -07001167JNI_TEST(ExceptionHandling)
1168
Elliott Hughesb264f082012-04-06 17:10:10 -07001169jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001170 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -07001171 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001172 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -07001173
1174 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +01001175 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -07001176 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Mathieu Chartier0795f232016-09-27 18:43:30 -07001177 ObjPtr<mirror::ObjectArray<mirror::StackTraceElement>> trace_array =
1178 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001179 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001180 EXPECT_EQ(11, trace_array->GetLength());
1181
Ian Rogersaaa20802011-09-11 21:47:37 -07001182 // Check stack trace entries have expected values
Andreas Gampe277ccbd2014-11-03 21:36:10 -08001183 for (int32_t j = 0; j < trace_array->GetLength(); ++j) {
1184 EXPECT_EQ(-2, trace_array->Get(j)->GetLineNumber());
1185 mirror::StackTraceElement* ste = trace_array->Get(j);
Ian Rogersaaa20802011-09-11 21:47:37 -07001186 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -07001187 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001188 EXPECT_EQ(("fooI" + CurrentJniStringSuffix()), ste->GetMethodName()->ToModifiedUtf8());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001189 }
Ian Rogersaaa20802011-09-11 21:47:37 -07001190
1191 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001192 return 0;
1193 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -07001194 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -07001195 EXPECT_TRUE(jklass != nullptr);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001196 jmethodID jmethod = env->GetMethodID(jklass,
1197 ("fooI" + CurrentJniStringSuffix()).c_str(),
1198 "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -07001199 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001200
Ian Rogersaaa20802011-09-11 21:47:37 -07001201 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001202 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -07001203
1204 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001205 return i + result;
1206 }
1207}
1208
Andreas Gampe6e498692014-08-18 16:43:12 -07001209void JniCompilerTest::NativeStackTraceElementImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001210 SetUpForTest(false, "fooI", "(I)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001211 CURRENT_JNI_WRAPPER(Java_MyClassNatives_nativeUpCall));
1212
1213 // Usual # local references on stack check fails because nativeUpCall calls itself recursively,
1214 // each time the # of local references will therefore go up.
1215 ScopedDisableCheckNumStackReferences disable_num_stack_check;
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001216 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001217
Ian Rogersaaa20802011-09-11 21:47:37 -07001218 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001219}
1220
Andreas Gampe6e498692014-08-18 16:43:12 -07001221JNI_TEST(NativeStackTraceElement)
1222
Elliott Hughesb264f082012-04-06 17:10:10 -07001223jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -07001224 return env->NewGlobalRef(x);
1225}
1226
Andreas Gampe6e498692014-08-18 16:43:12 -07001227void JniCompilerTest::ReturnGlobalRefImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001228 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001229 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -07001230 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
1231 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
1232 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
1233}
1234
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001235JNI_TEST(ReturnGlobalRef)
Andreas Gampe6e498692014-08-18 16:43:12 -07001236
Ian Rogersdc51b792011-09-22 20:41:37 -07001237jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
1238 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001239 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -07001240 for (int i = 0; i < 10; i++) {
Mathieu Chartier0795f232016-09-27 18:43:30 -07001241 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -07001242 }
1243 return x+1;
1244}
1245
Andreas Gampe6e498692014-08-18 16:43:12 -07001246void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001247 SetUpForTest(false, "fooI", "(I)I", CURRENT_JNI_WRAPPER(local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -07001248 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -07001249 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -07001250 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
1251 EXPECT_TRUE(result == i + 1);
1252 }
1253}
1254
Andreas Gampe6e498692014-08-18 16:43:12 -07001255JNI_TEST(LocalReferenceTableClearingTest)
1256
Ian Rogersb9231c82011-09-05 22:13:19 -07001257void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
1258 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
1259 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -07001260 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -07001261 EXPECT_EQ(1234, src_pos);
1262 EXPECT_EQ(5678, dst_pos);
1263 EXPECT_EQ(9876, length);
1264}
1265
Andreas Gampe6e498692014-08-18 16:43:12 -07001266void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001267 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001268 CURRENT_JNI_WRAPPER(my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -07001269 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -07001270}
1271
Andreas Gampe6e498692014-08-18 16:43:12 -07001272JNI_TEST(JavaLangSystemArrayCopy)
1273
Ian Rogers67375ac2011-09-14 00:55:44 -07001274jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
1275 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
1276 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -07001277 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -07001278 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
1279 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
1280 return JNI_TRUE;
1281}
1282
Andreas Gampe6e498692014-08-18 16:43:12 -07001283void JniCompilerTest::CompareAndSwapIntImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001284 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001285 CURRENT_JNI_WRAPPER(my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -07001286 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
1287 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -07001288 EXPECT_EQ(result, JNI_TRUE);
1289}
1290
Andreas Gampe6e498692014-08-18 16:43:12 -07001291JNI_TEST(CompareAndSwapInt)
1292
Ian Rogersc7792842012-03-03 15:36:20 -08001293jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
1294 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
1295 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
1296 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
1297 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
1298 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
1299 return 42;
1300}
1301
Andreas Gampe6e498692014-08-18 16:43:12 -07001302void JniCompilerTest::GetTextImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001303 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001304 CURRENT_JNI_WRAPPER(my_gettext));
Ian Rogersc7792842012-03-03 15:36:20 -08001305 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -07001306 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -08001307 EXPECT_EQ(result, 42);
1308}
1309
Andreas Gampe6e498692014-08-18 16:43:12 -07001310JNI_TEST(GetText)
1311
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001312int gJava_MyClassNatives_GetSinkProperties_calls[kJniKindCount] = {};
1313jarray Java_MyClassNatives_GetSinkProperties(JNIEnv*, jobject thisObj, jstring s) {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001314 EXPECT_EQ(s, nullptr);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001315 gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]++;
1316
1317 Thread* self = Thread::Current();
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001318 ScopedObjectAccess soa(self);
Mathieu Chartier1cc62e42016-10-03 18:01:28 -07001319 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object>(thisObj).Ptr()));
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001320 return nullptr;
1321}
1322
Andreas Gampe6e498692014-08-18 16:43:12 -07001323void JniCompilerTest::GetSinkPropertiesNativeImpl() {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001324 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001325 CURRENT_JNI_WRAPPER(Java_MyClassNatives_GetSinkProperties));
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001326
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001327 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001328 jarray result = down_cast<jarray>(
1329 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
1330 EXPECT_EQ(nullptr, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001331 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001332
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001333 gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni] = 0;
Brian Carlstromfc7120c2012-08-27 13:43:25 -07001334}
1335
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001336// @FastNative doesn't support 'synchronized' keyword and
1337// never will -- locking functions aren't fast.
1338JNI_TEST_NORMAL_ONLY(GetSinkPropertiesNative)
Andreas Gampe6e498692014-08-18 16:43:12 -07001339
Elliott Hughesb264f082012-04-06 17:10:10 -07001340// This should return jclass, but we're imitating a bug pattern.
1341jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
1342 return env->NewStringUTF("not a class!");
1343}
1344
1345// This should return jclass, but we're imitating a bug pattern.
1346jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
1347 return env->NewStringUTF("not a class!");
1348}
1349
Andreas Gampe6e498692014-08-18 16:43:12 -07001350void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001351 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001352 CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldReturnClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001353
1354 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001355 // This native method is bad, and tries to return a jstring as a jclass.
1356 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001357 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1358 "of java.lang.String from java.lang.Class " +
1359 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1360 CurrentJniStringSuffix() + "()");
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001361
1362 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -07001363 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001364 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1365 "of java.lang.String from java.lang.Class " +
1366 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1367 CurrentJniStringSuffix() + "()");
Ian Rogers68d8b422014-07-17 11:09:10 -07001368 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001369 check_jni_abort_catcher.Check(std::string() + "calling non-static method " +
1370 "java.lang.Class " +
1371 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1372 CurrentJniStringSuffix() + "() with CallStaticObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001373}
1374
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001375JNI_TEST(UpcallReturnTypeChecking_Instance)
Andreas Gampe6e498692014-08-18 16:43:12 -07001376
1377void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001378 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001379 CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldReturnClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001380
1381 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001382 // This native method is bad, and tries to return a jstring as a jclass.
1383 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001384 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1385 "of java.lang.String from java.lang.Class " +
1386 "MyClassNatives.staticMethodThatShouldReturnClass" +
1387 CurrentJniStringSuffix() + "()");
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001388
1389 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -07001390 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001391 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1392 "of java.lang.String from java.lang.Class " +
1393 "MyClassNatives.staticMethodThatShouldReturnClass" +
1394 CurrentJniStringSuffix() + "()");
Ian Rogers68d8b422014-07-17 11:09:10 -07001395 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001396 check_jni_abort_catcher.Check(std::string() + "calling static method " +
1397 "java.lang.Class " +
1398 "MyClassNatives.staticMethodThatShouldReturnClass" +
1399 CurrentJniStringSuffix() + "() with CallObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001400}
1401
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001402JNI_TEST(UpcallReturnTypeChecking_Static)
Andreas Gampe6e498692014-08-18 16:43:12 -07001403
Elliott Hughesb264f082012-04-06 17:10:10 -07001404// This should take jclass, but we're imitating a bug pattern.
1405void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
1406}
1407
1408// This should take jclass, but we're imitating a bug pattern.
1409void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
1410}
1411
Andreas Gampe6e498692014-08-18 16:43:12 -07001412void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001413 // This will lead to error messages in the log.
1414 ScopedLogSeverity sls(LogSeverity::FATAL);
1415
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001416 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001417 CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldTakeClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001418
1419 CheckJniAbortCatcher check_jni_abort_catcher;
1420 // We deliberately pass a bad second argument here.
1421 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001422 check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1423 "MyClassNatives.instanceMethodThatShouldTakeClass" +
1424 CurrentJniStringSuffix() + "(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001425}
1426
Andreas Gampe6e498692014-08-18 16:43:12 -07001427JNI_TEST(UpcallArgumentTypeChecking_Instance)
1428
1429void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001430 // This will lead to error messages in the log.
1431 ScopedLogSeverity sls(LogSeverity::FATAL);
1432
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001433 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001434 CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldTakeClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001435
1436 CheckJniAbortCatcher check_jni_abort_catcher;
1437 // We deliberately pass a bad second argument here.
1438 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001439 check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1440 "MyClassNatives.staticMethodThatShouldTakeClass" +
1441 CurrentJniStringSuffix() + "(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001442}
1443
Andreas Gampe6e498692014-08-18 16:43:12 -07001444JNI_TEST(UpcallArgumentTypeChecking_Static)
1445
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001446jfloat Java_MyClassNatives_checkFloats(JNIEnv*, jobject, jfloat f1, jfloat f2) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001447 return f1 - f2; // non-commutative operator
1448}
1449
Andreas Gampe6e498692014-08-18 16:43:12 -07001450void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001451 SetUpForTest(false, "checkFloats", "(FF)F",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001452 CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkFloats));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001453
1454 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1455 99.0F, 10.0F);
Ian Rogers647b1a82014-10-10 11:02:11 -07001456 EXPECT_FLOAT_EQ(99.0F - 10.0F, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001457 jfloat a = 3.14159F;
1458 jfloat b = 0.69314F;
1459 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -07001460 EXPECT_FLOAT_EQ(a - b, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001461}
1462
Andreas Gampe6e498692014-08-18 16:43:12 -07001463JNI_TEST(CompileAndRunFloatFloatMethod)
1464
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001465void Java_MyClassNatives_checkParameterAlign(JNIEnv* env ATTRIBUTE_UNUSED,
1466 jobject thisObj ATTRIBUTE_UNUSED,
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001467 jint i1,
1468 jlong l1) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001469 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -07001470 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001471}
1472
Andreas Gampe6e498692014-08-18 16:43:12 -07001473void JniCompilerTest::CheckParameterAlignImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001474 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001475 CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkParameterAlign));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001476
Ian Rogers0f678472014-03-10 16:18:37 -07001477 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001478}
1479
Andreas Gampe6e498692014-08-18 16:43:12 -07001480JNI_TEST(CheckParameterAlign)
1481
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001482void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject,
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001483 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1484 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1485 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1486 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1487 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1488 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1489 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1490 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1491 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1492 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1493 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1494 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1495 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1496 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1497 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1498 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1499 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1500 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1501 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1502 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1503 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1504 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1505 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1506 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1507 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1508 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1509 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1510 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1511 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1512 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1513 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1514 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001515 // two tests possible
1516 if (o0 == nullptr) {
1517 // 1) everything is null
1518 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1519 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1520 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1521 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1522 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1523 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1524 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1525 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1526 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1527 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1528 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1529 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1530 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1531 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1532 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1533 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1534 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1535 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1536 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1537 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1538 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1539 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1540 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1541 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1542 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1543 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1544 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1545 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1546 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1547 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1548 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1549 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1550 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1551 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1552 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1553 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1554 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1555 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1556 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1557 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1558 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1559 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1560 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1561 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1562 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1563 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1564 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1565 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1566 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1567 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1568 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1569 } else {
1570 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1571 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1572 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1573 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1574 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1575 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1576 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1577 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1578 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1579 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1580 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1581 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1582 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1583 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1584 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1585 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1586 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1587 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1588 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1589 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1590 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1591 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1592 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1593 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1594 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1595 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1596 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1597 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1598 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1599 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1600 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1601 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1602 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1603 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1604 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1605 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1606 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1607 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1608 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1609 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1610 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1611 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1612 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1613 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1614 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1615 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1616 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1617 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1618 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1619 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1620 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1621 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1622 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1623 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1624 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1625 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1626 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1627 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1628 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1629 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1630 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1631 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1632 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1633 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1634 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1635 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1636 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1637 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1638 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1639 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1640 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1641 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1642 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1643 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1644 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1645 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1646 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1647 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1648 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1649 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1650 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1651 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1652 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1653 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1654 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1655 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1656 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1657 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1658 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1659 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1660 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1661 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1662 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1663 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1664 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1665 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1666 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1667 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1668 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1669 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1670 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1671 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1672 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1673 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1674 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1675 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1676 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1677 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1678 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1679 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1680 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1681 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1682 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1683 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1684 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1685 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1686 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1687 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1688 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1689 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1690 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1691 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1692 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1693 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1694 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1695 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1696 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1697 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1698 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1699 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1700 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1701 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1702 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1703 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1704 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1705 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1706 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1707 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1708 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1709 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1710 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1711 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1712 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1713 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1714 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1715 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1716 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1717 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1718 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1719 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1720 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1721 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1722 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1723 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1724 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1725 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1726 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1727 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1728 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1729 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1730 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1731 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1732 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1733 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1734 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1735 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1736 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1737 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1738 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1739 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1740 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1741 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1742 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1743 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1744 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1745 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1746 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1747 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1748 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1749 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1750 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1751 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1752 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1753 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1754 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1755 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1756 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1757 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1758 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1759 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1760 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1761 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1762 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1763 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1764 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1765 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1766 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1767 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1768 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1769 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1770 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1771 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1772 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1773 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1774 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1775 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1776 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1777 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1778 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1779 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1780 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1781 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1782 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1783 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1784 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1785 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1786 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1787 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1788 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1789 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1790 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1791 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1792 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1793 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1794 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1795 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1796 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1797 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1798 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1799 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1800 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1801 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1802 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1803 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1804 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1805 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1806 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1807 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1808 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1809 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1810 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1811 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1812 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1813 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1814 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1815 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1816 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1817 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1818 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1819 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1820 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1821 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1822 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1823 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1824 }
1825}
1826
1827const char* longSig =
1828 "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1829 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1830 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1831 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1832 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1833 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1834 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1835 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1836 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1837 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1838 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1839 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1840 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1841 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1842 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1843 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1844 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1845 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1846 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1847 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1848 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1849 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1850 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1851 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1852 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1853 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1854 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1855 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1856 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1857 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1858 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1859 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1860 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1861 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1862 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1863 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1864 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1865 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1866 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1867 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1868 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1869 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1870 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1871 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1872 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1873 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1874 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1875 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1876 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1877 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1878 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1879
Andreas Gampe6e498692014-08-18 16:43:12 -07001880void JniCompilerTest::MaxParamNumberImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001881 SetUpForTest(false, "maxParamNumber", longSig,
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001882 CURRENT_JNI_WRAPPER(Java_MyClassNatives_maxParamNumber));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001883
1884 jvalue args[254];
1885
1886 // First test: test with all arguments null.
1887 for (int i = 0; i < 254; ++i) {
1888 args[i].l = nullptr;
1889 }
1890
1891 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1892
1893 // Second test: test with int[] objects with increasing lengths
1894 for (int i = 0; i < 254; ++i) {
1895 jintArray tmp = env_->NewIntArray(i);
1896 args[i].l = tmp;
1897 EXPECT_NE(args[i].l, nullptr);
1898 }
1899
1900 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1901}
1902
Andreas Gampe6e498692014-08-18 16:43:12 -07001903JNI_TEST(MaxParamNumber)
1904
1905void JniCompilerTest::WithoutImplementationImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001906 // This will lead to error messages in the log.
1907 ScopedLogSeverity sls(LogSeverity::FATAL);
1908
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001909 SetUpForTest(false, "withoutImplementation", "()V", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampead615172014-04-04 16:20:13 -07001910
1911 env_->CallVoidMethod(jobj_, jmethod_);
1912
1913 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1914 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1915}
1916
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001917// TODO: Don't test @FastNative here since it goes through a stub lookup (unsupported) which would
1918// normally fail with an exception, but fails with an assert.
1919JNI_TEST_NORMAL_ONLY(WithoutImplementation)
Andreas Gampe6e498692014-08-18 16:43:12 -07001920
Andreas Gampe48ee3562015-04-10 19:57:29 -07001921void JniCompilerTest::WithoutImplementationRefReturnImpl() {
1922 // This will lead to error messages in the log.
1923 ScopedLogSeverity sls(LogSeverity::FATAL);
1924
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001925 SetUpForTest(false,
1926 "withoutImplementationRefReturn",
1927 "()Ljava/lang/Object;",
1928 NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampe48ee3562015-04-10 19:57:29 -07001929
1930 env_->CallObjectMethod(jobj_, jmethod_);
1931
1932 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1933 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1934}
1935
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001936// TODO: Should work for @FastNative too.
1937JNI_TEST_NORMAL_ONLY(WithoutImplementationRefReturn)
Andreas Gampe48ee3562015-04-10 19:57:29 -07001938
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001939void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv*, jclass, jint i1, jint i2, jint i3,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001940 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1941 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1942 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1943 jfloat f10) {
1944 EXPECT_EQ(i1, 1);
1945 EXPECT_EQ(i2, 2);
1946 EXPECT_EQ(i3, 3);
1947 EXPECT_EQ(i4, 4);
1948 EXPECT_EQ(i5, 5);
1949 EXPECT_EQ(i6, 6);
1950 EXPECT_EQ(i7, 7);
1951 EXPECT_EQ(i8, 8);
1952 EXPECT_EQ(i9, 9);
1953 EXPECT_EQ(i10, 10);
1954
Roland Levillainda4d79b2015-03-24 14:36:11 +00001955 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001956 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001957 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001958 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001959 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001960 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001961 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001962 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001963 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001964 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001965 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001966 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001967 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001968 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001969 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001970 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001971 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001972 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001973 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001974 EXPECT_EQ(i20, 20);
1975}
1976
Andreas Gampe6e498692014-08-18 16:43:12 -07001977void JniCompilerTest::StackArgsIntsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001978 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001979 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsIntsFirst));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001980
1981 jint i1 = 1;
1982 jint i2 = 2;
1983 jint i3 = 3;
1984 jint i4 = 4;
1985 jint i5 = 5;
1986 jint i6 = 6;
1987 jint i7 = 7;
1988 jint i8 = 8;
1989 jint i9 = 9;
1990 jint i10 = 10;
1991
Roland Levillainda4d79b2015-03-24 14:36:11 +00001992 jfloat f1 = bit_cast<jfloat, jint>(11);
1993 jfloat f2 = bit_cast<jfloat, jint>(12);
1994 jfloat f3 = bit_cast<jfloat, jint>(13);
1995 jfloat f4 = bit_cast<jfloat, jint>(14);
1996 jfloat f5 = bit_cast<jfloat, jint>(15);
1997 jfloat f6 = bit_cast<jfloat, jint>(16);
1998 jfloat f7 = bit_cast<jfloat, jint>(17);
1999 jfloat f8 = bit_cast<jfloat, jint>(18);
2000 jfloat f9 = bit_cast<jfloat, jint>(19);
2001 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002002
2003 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
2004 f3, f4, f5, f6, f7, f8, f9, f10);
2005}
2006
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002007JNI_TEST_CRITICAL(StackArgsIntsFirst)
Andreas Gampe6e498692014-08-18 16:43:12 -07002008
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07002009void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv*, jclass, jfloat f1, jfloat f2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002010 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
2011 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
2012 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
2013 jint i9, jint i10) {
2014 EXPECT_EQ(i1, 1);
2015 EXPECT_EQ(i2, 2);
2016 EXPECT_EQ(i3, 3);
2017 EXPECT_EQ(i4, 4);
2018 EXPECT_EQ(i5, 5);
2019 EXPECT_EQ(i6, 6);
2020 EXPECT_EQ(i7, 7);
2021 EXPECT_EQ(i8, 8);
2022 EXPECT_EQ(i9, 9);
2023 EXPECT_EQ(i10, 10);
2024
Roland Levillainda4d79b2015-03-24 14:36:11 +00002025 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002026 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002027 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002028 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002029 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002030 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002031 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002032 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002033 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002034 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002035 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002036 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002037 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002038 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002039 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002040 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002041 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002042 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002043 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002044 EXPECT_EQ(i20, 20);
2045}
2046
Andreas Gampe6e498692014-08-18 16:43:12 -07002047void JniCompilerTest::StackArgsFloatsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002048 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002049 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsFloatsFirst));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002050
2051 jint i1 = 1;
2052 jint i2 = 2;
2053 jint i3 = 3;
2054 jint i4 = 4;
2055 jint i5 = 5;
2056 jint i6 = 6;
2057 jint i7 = 7;
2058 jint i8 = 8;
2059 jint i9 = 9;
2060 jint i10 = 10;
2061
Roland Levillainda4d79b2015-03-24 14:36:11 +00002062 jfloat f1 = bit_cast<jfloat, jint>(11);
2063 jfloat f2 = bit_cast<jfloat, jint>(12);
2064 jfloat f3 = bit_cast<jfloat, jint>(13);
2065 jfloat f4 = bit_cast<jfloat, jint>(14);
2066 jfloat f5 = bit_cast<jfloat, jint>(15);
2067 jfloat f6 = bit_cast<jfloat, jint>(16);
2068 jfloat f7 = bit_cast<jfloat, jint>(17);
2069 jfloat f8 = bit_cast<jfloat, jint>(18);
2070 jfloat f9 = bit_cast<jfloat, jint>(19);
2071 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002072
2073 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
2074 i4, i5, i6, i7, i8, i9, i10);
2075}
2076
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002077JNI_TEST_CRITICAL(StackArgsFloatsFirst)
Andreas Gampe6e498692014-08-18 16:43:12 -07002078
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07002079void Java_MyClassNatives_stackArgsMixed(JNIEnv*, jclass, jint i1, jfloat f1, jint i2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002080 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
2081 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
2082 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
2083 EXPECT_EQ(i1, 1);
2084 EXPECT_EQ(i2, 2);
2085 EXPECT_EQ(i3, 3);
2086 EXPECT_EQ(i4, 4);
2087 EXPECT_EQ(i5, 5);
2088 EXPECT_EQ(i6, 6);
2089 EXPECT_EQ(i7, 7);
2090 EXPECT_EQ(i8, 8);
2091 EXPECT_EQ(i9, 9);
2092 EXPECT_EQ(i10, 10);
2093
Roland Levillainda4d79b2015-03-24 14:36:11 +00002094 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002095 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002096 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002097 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002098 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002099 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002100 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002101 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002102 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002103 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002104 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002105 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002106 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002107 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002108 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002109 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002110 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002111 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002112 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002113 EXPECT_EQ(i20, 20);
2114}
2115
Andreas Gampe6e498692014-08-18 16:43:12 -07002116void JniCompilerTest::StackArgsMixedImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002117 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002118 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsMixed));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002119
2120 jint i1 = 1;
2121 jint i2 = 2;
2122 jint i3 = 3;
2123 jint i4 = 4;
2124 jint i5 = 5;
2125 jint i6 = 6;
2126 jint i7 = 7;
2127 jint i8 = 8;
2128 jint i9 = 9;
2129 jint i10 = 10;
2130
Roland Levillainda4d79b2015-03-24 14:36:11 +00002131 jfloat f1 = bit_cast<jfloat, jint>(11);
2132 jfloat f2 = bit_cast<jfloat, jint>(12);
2133 jfloat f3 = bit_cast<jfloat, jint>(13);
2134 jfloat f4 = bit_cast<jfloat, jint>(14);
2135 jfloat f5 = bit_cast<jfloat, jint>(15);
2136 jfloat f6 = bit_cast<jfloat, jint>(16);
2137 jfloat f7 = bit_cast<jfloat, jint>(17);
2138 jfloat f8 = bit_cast<jfloat, jint>(18);
2139 jfloat f9 = bit_cast<jfloat, jint>(19);
2140 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002141
2142 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
2143 f7, i8, f8, i9, f9, i10, f10);
2144}
2145
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002146JNI_TEST_CRITICAL(StackArgsMixed)
Andreas Gampe6e498692014-08-18 16:43:12 -07002147
Lazar Trsicf652d602015-06-24 16:30:21 +02002148void Java_MyClassNatives_stackArgsSignExtendedMips64(JNIEnv*, jclass, jint i1, jint i2, jint i3,
2149 jint i4, jint i5, jint i6, jint i7, jint i8) {
2150 EXPECT_EQ(i1, 1);
2151 EXPECT_EQ(i2, 2);
2152 EXPECT_EQ(i3, 3);
2153 EXPECT_EQ(i4, 4);
2154 EXPECT_EQ(i5, 5);
2155 EXPECT_EQ(i6, 6);
2156 EXPECT_EQ(i7, 7);
2157 EXPECT_EQ(i8, -8);
2158
2159#if defined(__mips__) && defined(__LP64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
2160 // Mips64 ABI requires that arguments passed through stack be sign-extended 8B slots.
2161 // First 8 arguments are passed through registers, check i7 and i8.
2162 uint32_t stack1_high = *(&i7 + 1);
2163 uint32_t stack2_high = *(&i8 + 1);
2164
2165 EXPECT_EQ(stack1_high, static_cast<uint32_t>(0));
2166 EXPECT_EQ(stack2_high, static_cast<uint32_t>(0xffffffff));
2167#else
2168 LOG(INFO) << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on "
2169 << kRuntimeISA;
2170 // Force-print to std::cout so it's also outside the logcat.
2171 std::cout << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on "
2172 << kRuntimeISA << std::endl;
2173#endif
2174}
2175
2176void JniCompilerTest::StackArgsSignExtendedMips64Impl() {
2177 SetUpForTest(true, "stackArgsSignExtendedMips64", "(IIIIIIII)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002178 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsSignExtendedMips64));
Lazar Trsicf652d602015-06-24 16:30:21 +02002179 jint i1 = 1;
2180 jint i2 = 2;
2181 jint i3 = 3;
2182 jint i4 = 4;
2183 jint i5 = 5;
2184 jint i6 = 6;
2185 jint i7 = 7;
2186 jint i8 = -8;
2187
2188 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8);
2189}
2190
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002191JNI_TEST_CRITICAL(StackArgsSignExtendedMips64)
Lazar Trsicf652d602015-06-24 16:30:21 +02002192
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002193void Java_MyClassNatives_normalNative(JNIEnv*, jclass) {
2194 // Intentionally left empty.
2195}
2196
2197// Methods not annotated with anything are not considered "fast native"
2198// -- Check that the annotation lookup does not find it.
2199void JniCompilerTest::NormalNativeImpl() {
2200 SetUpForTest(/* direct */ true,
2201 "normalNative",
2202 "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002203 CURRENT_JNI_WRAPPER(Java_MyClassNatives_normalNative));
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002204
Andreas Gampe13b27842016-11-07 16:48:23 -08002205 ArtMethod* method = jni::DecodeArtMethod(jmethod_);
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002206 ASSERT_TRUE(method != nullptr);
2207
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002208 EXPECT_FALSE(method->IsAnnotatedWithCriticalNative());
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002209 EXPECT_FALSE(method->IsAnnotatedWithFastNative());
2210}
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002211
2212// TODO: just rename the java functions to the standard convention and remove duplicated tests
2213JNI_TEST_NORMAL_ONLY(NormalNative)
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002214
2215// Methods annotated with @FastNative are considered "fast native"
2216// -- Check that the annotation lookup succeeds.
2217void Java_MyClassNatives_fastNative(JNIEnv*, jclass) {
2218 // Intentionally left empty.
2219}
2220
2221void JniCompilerTest::FastNativeImpl() {
2222 SetUpForTest(/* direct */ true,
2223 "fastNative",
2224 "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002225 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fastNative));
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002226
Andreas Gampe13b27842016-11-07 16:48:23 -08002227 ArtMethod* method = jni::DecodeArtMethod(jmethod_);
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002228 ASSERT_TRUE(method != nullptr);
2229
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002230 EXPECT_FALSE(method->IsAnnotatedWithCriticalNative());
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002231 EXPECT_TRUE(method->IsAnnotatedWithFastNative());
2232}
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002233
2234// TODO: just rename the java functions to the standard convention and remove duplicated tests
2235JNI_TEST_NORMAL_ONLY(FastNative)
2236
2237int gJava_myClassNatives_criticalNative_calls[kJniKindCount] = {};
2238// Methods annotated with @CriticalNative are considered "critical native"
2239// -- Check that the annotation lookup succeeds.
2240void Java_MyClassNatives_criticalNative() {
2241 gJava_myClassNatives_criticalNative_calls[gCurrentJni]++;
2242}
2243
2244void JniCompilerTest::CriticalNativeImpl() {
2245 SetUpForTest(/* direct */ true,
2246 // Important: Don't change the "current jni" yet to avoid a method name suffix.
2247 "criticalNative",
2248 "()V",
2249 // TODO: Use CURRENT_JNI_WRAPPER instead which is more generic.
2250 reinterpret_cast<void*>(&Java_MyClassNatives_criticalNative));
2251
2252 // TODO: remove this manual updating of the current JNI. Merge with the other tests.
2253 UpdateCurrentJni(JniKind::kCritical);
2254 ASSERT_TRUE(IsCurrentJniCritical());
2255
Andreas Gampe13b27842016-11-07 16:48:23 -08002256 ArtMethod* method = jni::DecodeArtMethod(jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002257 ASSERT_TRUE(method != nullptr);
2258
2259 EXPECT_TRUE(method->IsAnnotatedWithCriticalNative());
2260 EXPECT_FALSE(method->IsAnnotatedWithFastNative());
2261
2262 EXPECT_EQ(0, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2263 env_->CallStaticVoidMethod(jklass_, jmethod_);
2264 EXPECT_EQ(1, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2265
2266 gJava_myClassNatives_criticalNative_calls[gCurrentJni] = 0;
2267}
2268
2269// TODO: just rename the java functions to the standard convention and remove duplicated tests
2270JNI_TEST_NORMAL_ONLY(CriticalNative)
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002271
Ian Rogersb033c752011-07-20 12:22:35 -07002272} // namespace art