blob: b34d9385c8f5c5a7a3d31bf63fcd8fc12bd95b37 [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"
Pavle Batuta837e72a2016-03-16 11:31:46 +010023#include "base/bit_utils.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070024#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080025#include "common_compiler_test.h"
Igor Murashkin367f3dd2016-09-01 17:00:24 -070026#include "compiler.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070027#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070028#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070029#include "indirect_reference_table.h"
Andreas Gampec15a2f42017-04-21 12:09:39 -070030#include "java_vm_ext.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070031#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070032#include "mem_map.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070033#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080034#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080035#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070036#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080037#include "mirror/stack_trace_element.h"
Dimitry Ivanov5edb0632016-04-29 11:14:25 -070038#include "nativeloader/native_loader.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070039#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070040#include "ScopedLocalRef.h"
Mathieu Chartier0795f232016-09-27 18:43:30 -070041#include "scoped_thread_state_change-inl.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070042#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070043
Elliott Hughesb264f082012-04-06 17:10:10 -070044extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080045 return count + 1;
46}
47
Elliott Hughesb264f082012-04-06 17:10:10 -070048extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080049 return count + 1;
50}
51
Ian Rogersb033c752011-07-20 12:22:35 -070052namespace art {
53
Igor Murashkin367f3dd2016-09-01 17:00:24 -070054enum class JniKind {
55 kNormal = Compiler::kNone, // Regular kind of un-annotated natives.
56 kFast = Compiler::kFastNative, // Native method annotated with @FastNative.
57 kCritical = Compiler::kCriticalNative, // Native method annotated with @CriticalNative.
58 kCount = Compiler::kCriticalNative + 1 // How many different types of JNIs we can have.
59};
60
61// Used to initialize array sizes that want to have different state per current jni.
62static constexpr size_t kJniKindCount = static_cast<size_t>(JniKind::kCount);
63// Do not use directly, use the helpers instead.
64uint32_t gCurrentJni = static_cast<uint32_t>(JniKind::kNormal);
65
66// Is the current native method under test @CriticalNative?
67static bool IsCurrentJniCritical() {
68 return gCurrentJni == static_cast<uint32_t>(JniKind::kCritical);
69}
70
71// Is the current native method a plain-old non-annotated native?
72static bool IsCurrentJniNormal() {
73 return gCurrentJni == static_cast<uint32_t>(JniKind::kNormal);
74}
75
76// Signifify that a different kind of JNI is about to be tested.
77static void UpdateCurrentJni(JniKind kind) {
78 gCurrentJni = static_cast<uint32_t>(kind);
79}
80
81// (Match the name suffixes of native methods in MyClassNatives.java)
82static std::string CurrentJniStringSuffix() {
83 switch (gCurrentJni) {
84 case static_cast<uint32_t>(JniKind::kNormal): {
85 return "";
86 }
87 case static_cast<uint32_t>(JniKind::kFast): {
88 return "_Fast";
89 }
90 case static_cast<uint32_t>(JniKind::kCritical): {
91 return "_Critical";
92 }
93 default:
94 LOG(FATAL) << "Invalid current JNI value: " << gCurrentJni;
95 UNREACHABLE();
96 }
97}
98
99// Dummy values passed to our JNI handlers when we enter @CriticalNative.
100// Normally @CriticalNative calling convention strips out the "JNIEnv*, jclass" parameters.
101// However to avoid duplicating every single test method we have a templated handler
102// that inserts dummy parameters (0,1) to make it compatible with a regular JNI handler.
103static JNIEnv* const kCriticalDummyJniEnv = reinterpret_cast<JNIEnv*>(0xDEADFEAD);
104static jclass const kCriticalDummyJniClass = reinterpret_cast<jclass>(0xBEAFBEEF);
105
106// Type trait. Returns true if "T" is the same type as one of the types in Args...
107//
108// Logically equal to OR(std::same_type<T, U> for all U in Args).
109template <typename T, typename ... Args>
110struct is_any_of;
111
112template <typename T, typename U, typename ... Args>
113struct is_any_of<T, U, Args ...> {
114 using value_type = bool;
115 static constexpr const bool value = std::is_same<T, U>::value || is_any_of<T, Args ...>::value;
116};
117
118template <typename T, typename U>
119struct is_any_of<T, U> {
120 using value_type = bool;
121 static constexpr const bool value = std::is_same<T, U>::value;
122};
123
124// Type traits for JNI types.
125template <typename T>
126struct jni_type_traits {
127 // True if type T ends up holding an object reference. False otherwise.
128 // (Non-JNI types will also be false).
129 static constexpr const bool is_ref =
130 is_any_of<T, jclass, jobject, jstring, jobjectArray, jintArray,
131 jcharArray, jfloatArray, jshortArray, jdoubleArray, jlongArray>::value;
132};
133
134template <typename ... Args>
135struct count_refs_helper {
136 using value_type = size_t;
137 static constexpr const size_t value = 0;
138};
139
140template <typename Arg, typename ... Args>
141struct count_refs_helper<Arg, Args ...> {
142 using value_type = size_t;
143 static constexpr size_t value =
144 (jni_type_traits<Arg>::is_ref ? 1 : 0) + count_refs_helper<Args ...>::value;
145};
146
147template <typename T, T fn>
148struct count_refs_fn_helper;
149
150template <typename R, typename ... Args, R fn(Args...)>
151struct count_refs_fn_helper<R(Args...), fn> : public count_refs_helper<Args...> {};
152
153// Given a function type 'T' figure out how many of the parameter types are a reference.
154// -- The implicit jclass and thisObject also count as 1 reference.
155//
156// Fields:
157// * value - the result counting # of refs
158// * value_type - the type of value (size_t)
159template <typename T, T fn>
160struct count_refs : public count_refs_fn_helper<T, fn> {};
161
162// Base case: No parameters = 0 refs.
163size_t count_nonnull_refs_helper() {
164 return 0;
165}
166
167// SFINAE for ref types. 1 if non-null, 0 otherwise.
168template <typename T>
169size_t count_nonnull_refs_single_helper(T arg,
170 typename std::enable_if<jni_type_traits<T>::is_ref>::type*
171 = nullptr) {
172 return ((arg == NULL) ? 0 : 1);
173}
174
175// SFINAE for non-ref-types. Always 0.
176template <typename T>
177size_t count_nonnull_refs_single_helper(T arg ATTRIBUTE_UNUSED,
178 typename std::enable_if<!jni_type_traits<T>::is_ref>::type*
179 = nullptr) {
180 return 0;
181}
182
183// Recursive case.
184template <typename T, typename ... Args>
185size_t count_nonnull_refs_helper(T arg, Args ... args) {
186 return count_nonnull_refs_single_helper(arg) + count_nonnull_refs_helper(args...);
187}
188
189// Given any list of parameters, check how many object refs there are and only count
190// them if their runtime value is non-null.
191//
192// For example given (jobject, jint, jclass) we can get (2) if both #0/#2 are non-null,
193// (1) if either #0/#2 are null but not both, and (0) if all parameters are null.
194// Primitive parameters (including JNIEnv*, if present) are ignored.
195template <typename ... Args>
196size_t count_nonnull_refs(Args ... args) {
197 return count_nonnull_refs_helper(args...);
198}
199
200template <typename T, T fn>
201struct remove_extra_parameters_helper;
202
203template <typename R, typename Arg1, typename Arg2, typename ... Args, R fn(Arg1, Arg2, Args...)>
204struct remove_extra_parameters_helper<R(Arg1, Arg2, Args...), fn> {
205 // Note: Do not use Args&& here to maintain C-style parameter types.
206 static R apply(Args... args) {
207 JNIEnv* env = kCriticalDummyJniEnv;
208 jclass kls = kCriticalDummyJniClass;
209 return fn(env, kls, args...);
210 }
211};
212
213// Given a function 'fn' create a function 'apply' which will omit the JNIEnv/jklass parameters
214//
215// i.e. if fn(JNIEnv*,jklass,a,b,c,d,e...) then apply(a,b,c,d,e,...)
216template <typename T, T fn>
217struct jni_remove_extra_parameters : public remove_extra_parameters_helper<T, fn> {};
218
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -0800219class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -0700220 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700221 void SetUp() OVERRIDE {
222 CommonCompilerTest::SetUp();
223 check_generic_jni_ = false;
224 }
225
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700226 void TearDown() OVERRIDE {
227 android::ResetNativeLoader();
228 CommonCompilerTest::TearDown();
229 }
230
Andreas Gampe6e498692014-08-18 16:43:12 -0700231 void SetCheckGenericJni(bool generic) {
232 check_generic_jni_ = generic;
233 }
234
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700235 private:
236 void CompileForTest(jobject class_loader,
237 bool direct,
238 const char* method_name,
239 const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700240 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700241 StackHandleScope<1> hs(soa.Self());
242 Handle<mirror::ClassLoader> loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -0700243 hs.NewHandle(soa.Decode<mirror::ClassLoader>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -0700244 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -0800245 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700246 const auto pointer_size = class_linker_->GetImagePointerSize();
247 ArtMethod* method = direct ? c->FindDirectMethod(method_name, method_sig, pointer_size) :
248 c->FindVirtualMethod(method_name, method_sig, pointer_size);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700249 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Andreas Gampe6e498692014-08-18 16:43:12 -0700250 if (check_generic_jni_) {
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700251 method->SetEntryPointFromQuickCompiledCode(class_linker_->GetRuntimeQuickGenericJniStub());
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100252 } else {
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700253 const void* code = method->GetEntryPointFromQuickCompiledCode();
254 if (code == nullptr || class_linker_->IsQuickGenericJniStub(code)) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100255 CompileMethod(method);
256 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
257 << method_name << " " << method_sig;
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100258 }
Brian Carlstrom25c33252011-09-18 15:58:35 -0700259 }
Brian Carlstrom25c33252011-09-18 15:58:35 -0700260 }
261
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700262 protected:
263 void CompileForTestWithCurrentJni(jobject class_loader,
264 bool direct,
265 const char* method_name_orig,
266 const char* method_sig) {
267 // Append the JNI kind to the method name, so that we automatically get the
268 // fast or critical versions of the same method.
269 std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
270 const char* method_name = method_name_str.c_str();
271
272 CompileForTest(class_loader, direct, method_name, method_sig);
273 }
274
275 void SetUpForTest(bool direct,
276 const char* method_name_orig,
277 const char* method_sig,
Andreas Gampe6e498692014-08-18 16:43:12 -0700278 void* native_fnptr) {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700279 // Append the JNI kind to the method name, so that we automatically get the
280 // fast or critical versions of the same method.
281 std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
282 const char* method_name = method_name_str.c_str();
283
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700284 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -0700285 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700286 {
287 ScopedObjectAccess soa(Thread::Current());
288 class_loader_ = LoadDex("MyClassNatives");
289 }
Andreas Gampe6e498692014-08-18 16:43:12 -0700290 CompileForTest(class_loader_, direct, method_name, method_sig);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700291 // Start runtime.
292 Thread::Current()->TransitionFromSuspendedToRunnable();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700293 android::InitializeNativeLoader();
Dimitry Ivanovc544f342016-05-09 16:26:13 -0700294 bool started = runtime_->Start();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700295 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700296 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700297 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700298 env_ = Thread::Current()->GetJniEnv();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700299 library_search_path_ = env_->NewStringUTF("");
Elliott Hughesb264f082012-04-06 17:10:10 -0700300 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700301 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700302
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700303 if (direct) {
304 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
305 } else {
306 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
307 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700308 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700309
Andreas Gampecf4035a2014-05-28 22:43:01 -0700310 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700311 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700312 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
313 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700314 } else {
315 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700316 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700317
318 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
319 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700320 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700321 }
322
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700323 public:
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700324 // Available as statics so our JNI handlers can access these.
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700325 static jclass jklass_;
326 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700327 static jobject class_loader_;
328
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700329 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700330 // We have to list the methods here so we can share them between default and generic JNI.
331 void CompileAndRunNoArgMethodImpl();
332 void CompileAndRunIntMethodThroughStubImpl();
333 void CompileAndRunStaticIntMethodThroughStubImpl();
334 void CompileAndRunIntMethodImpl();
335 void CompileAndRunIntIntMethodImpl();
336 void CompileAndRunLongLongMethodImpl();
337 void CompileAndRunDoubleDoubleMethodImpl();
338 void CompileAndRun_fooJJ_synchronizedImpl();
339 void CompileAndRunIntObjectObjectMethodImpl();
340 void CompileAndRunStaticIntIntMethodImpl();
341 void CompileAndRunStaticDoubleDoubleMethodImpl();
342 void RunStaticLogDoubleMethodImpl();
343 void RunStaticLogFloatMethodImpl();
344 void RunStaticReturnTrueImpl();
345 void RunStaticReturnFalseImpl();
346 void RunGenericStaticReturnIntImpl();
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700347 void RunGenericStaticReturnDoubleImpl();
348 void RunGenericStaticReturnLongImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700349 void CompileAndRunStaticIntObjectObjectMethodImpl();
350 void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl();
351 void ExceptionHandlingImpl();
352 void NativeStackTraceElementImpl();
353 void ReturnGlobalRefImpl();
354 void LocalReferenceTableClearingTestImpl();
355 void JavaLangSystemArrayCopyImpl();
356 void CompareAndSwapIntImpl();
357 void GetTextImpl();
358 void GetSinkPropertiesNativeImpl();
359 void UpcallReturnTypeChecking_InstanceImpl();
360 void UpcallReturnTypeChecking_StaticImpl();
361 void UpcallArgumentTypeChecking_InstanceImpl();
362 void UpcallArgumentTypeChecking_StaticImpl();
363 void CompileAndRunFloatFloatMethodImpl();
364 void CheckParameterAlignImpl();
365 void MaxParamNumberImpl();
366 void WithoutImplementationImpl();
Andreas Gampe48ee3562015-04-10 19:57:29 -0700367 void WithoutImplementationRefReturnImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700368 void StackArgsIntsFirstImpl();
369 void StackArgsFloatsFirstImpl();
370 void StackArgsMixedImpl();
Pavle Batuta837e72a2016-03-16 11:31:46 +0100371#if defined(__mips__) && defined(__LP64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
Lazar Trsicf652d602015-06-24 16:30:21 +0200372 void StackArgsSignExtendedMips64Impl();
Pavle Batuta837e72a2016-03-16 11:31:46 +0100373#endif
Andreas Gampe6e498692014-08-18 16:43:12 -0700374
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700375 void NormalNativeImpl();
376 void FastNativeImpl();
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700377 void CriticalNativeImpl();
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700378
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700379 JNIEnv* env_;
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700380 jstring library_search_path_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700381 jmethodID jmethod_;
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700382
383 private:
Andreas Gampe6e498692014-08-18 16:43:12 -0700384 bool check_generic_jni_;
Ian Rogersb033c752011-07-20 12:22:35 -0700385};
386
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700387jclass JniCompilerTest::jklass_;
388jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700389jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700390
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700391// Test the normal compiler and normal generic JNI only.
392// The following features are unsupported in @FastNative:
393// 1) JNI stubs (lookup via dlsym) when methods aren't explicitly registered
Igor Murashkinaf1e2992016-10-12 17:44:50 -0700394// 2) synchronized keyword
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700395// -- TODO: We can support (1) if we remove the mutator lock assert during stub lookup.
396# define JNI_TEST_NORMAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700397 TEST_F(JniCompilerTest, TestName ## NormalCompiler) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700398 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700399 SCOPED_TRACE("Normal JNI with compiler"); \
400 gCurrentJni = static_cast<uint32_t>(JniKind::kNormal); \
Andreas Gampe6e498692014-08-18 16:43:12 -0700401 TestName ## Impl(); \
402 } \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700403 TEST_F(JniCompilerTest, TestName ## NormalGeneric) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700404 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700405 SCOPED_TRACE("Normal JNI with generic"); \
406 gCurrentJni = static_cast<uint32_t>(JniKind::kNormal); \
Andreas Gampe6e498692014-08-18 16:43:12 -0700407 SetCheckGenericJni(true); \
408 TestName ## Impl(); \
409 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700410
Igor Murashkin06a04e02016-09-13 15:57:37 -0700411// Test (normal, @FastNative) x (compiler, generic).
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700412#define JNI_TEST(TestName) \
413 JNI_TEST_NORMAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700414 TEST_F(JniCompilerTest, TestName ## FastCompiler) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700415 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700416 SCOPED_TRACE("@FastNative JNI with compiler"); \
417 gCurrentJni = static_cast<uint32_t>(JniKind::kFast); \
418 TestName ## Impl(); \
419 } \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700420 \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700421 TEST_F(JniCompilerTest, TestName ## FastGeneric) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700422 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700423 SCOPED_TRACE("@FastNative JNI with generic"); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700424 gCurrentJni = static_cast<uint32_t>(JniKind::kFast); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700425 SetCheckGenericJni(true); \
426 TestName ## Impl(); \
427 }
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700428
Igor Murashkin06a04e02016-09-13 15:57:37 -0700429// Test (@CriticalNative) x (compiler, generic) only.
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700430#define JNI_TEST_CRITICAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700431 TEST_F(JniCompilerTest, TestName ## CriticalCompiler) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700432 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700433 SCOPED_TRACE("@CriticalNative JNI with compiler"); \
434 gCurrentJni = static_cast<uint32_t>(JniKind::kCritical); \
435 TestName ## Impl(); \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700436 } \
437 TEST_F(JniCompilerTest, TestName ## CriticalGeneric) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700438 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700439 SCOPED_TRACE("@CriticalNative JNI with generic"); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700440 gCurrentJni = static_cast<uint32_t>(JniKind::kCritical); \
Igor Murashkin294a9152016-09-28 13:23:19 -0700441 SetCheckGenericJni(true); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700442 TestName ## Impl(); \
443 }
Igor Murashkin06a04e02016-09-13 15:57:37 -0700444
445// Test everything: (normal, @FastNative, @CriticalNative) x (compiler, generic).
446#define JNI_TEST_CRITICAL(TestName) \
447 JNI_TEST(TestName) \
448 JNI_TEST_CRITICAL_ONLY(TestName) \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700449
450static void expectValidThreadState() {
451 // Normal JNI always transitions to "Native". Other JNIs stay in the "Runnable" state.
452 if (IsCurrentJniNormal()) {
453 EXPECT_EQ(kNative, Thread::Current()->GetState());
454 } else {
455 EXPECT_EQ(kRunnable, Thread::Current()->GetState());
456 }
457}
458
459#define EXPECT_THREAD_STATE_FOR_CURRENT_JNI() expectValidThreadState()
460
461static void expectValidMutatorLockHeld() {
462 if (IsCurrentJniNormal()) {
463 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
464 } else {
465 Locks::mutator_lock_->AssertSharedHeld(Thread::Current());
466 }
467}
468
469#define EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI() expectValidMutatorLockHeld()
470
471static void expectValidJniEnvAndObject(JNIEnv* env, jobject thisObj) {
472 if (!IsCurrentJniCritical()) {
473 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
474 ASSERT_TRUE(thisObj != nullptr);
475 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
476 } else {
477 LOG(FATAL) << "Objects are not supported for @CriticalNative, why is this being tested?";
478 UNREACHABLE();
479 }
480}
481
482// Validates the JNIEnv to be the same as the current thread's JNIEnv, and makes sure
483// that the object here is an instance of the class we registered the method with.
484//
485// Hard-fails if this somehow gets invoked for @CriticalNative since objects are unsupported.
486#define EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj) \
487 expectValidJniEnvAndObject(env, thisObj)
488
489static void expectValidJniEnvAndClass(JNIEnv* env, jclass kls) {
490 if (!IsCurrentJniCritical()) {
491 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
492 ASSERT_TRUE(kls != nullptr);
493 EXPECT_TRUE(env->IsSameObject(static_cast<jobject>(JniCompilerTest::jklass_),
494 static_cast<jobject>(kls)));
495 } else {
496 // This is pretty much vacuously true but catch any testing setup mistakes.
497 EXPECT_EQ(env, kCriticalDummyJniEnv);
498 EXPECT_EQ(kls, kCriticalDummyJniClass);
499 }
500}
501
502// Validates the JNIEnv is the same as the current thread's JNIenv, and makes sure
503// that the jclass we got in the JNI handler is the same one as the class the method was looked
504// up for.
505//
506// (Checks are skipped for @CriticalNative since the two values are dummy).
507#define EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls) expectValidJniEnvAndClass(env, kls)
508
509// Temporarily disable the EXPECT_NUM_STACK_REFERENCES check (for a single test).
510struct ScopedDisableCheckNumStackReferences {
511 ScopedDisableCheckNumStackReferences() {
Igor Murashkin06a04e02016-09-13 15:57:37 -0700512 CHECK(sCheckNumStackReferences); // No nested support.
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700513 sCheckNumStackReferences = false;
514 }
515
516 ~ScopedDisableCheckNumStackReferences() {
517 sCheckNumStackReferences = true;
518 }
519
520 static bool sCheckNumStackReferences;
521};
522
523bool ScopedDisableCheckNumStackReferences::sCheckNumStackReferences = true;
524
Igor Murashkina51d8b72016-10-05 14:33:30 -0700525// Check that the handle scope at the start of this block is the same as the handle scope at the end of the block.
526struct ScopedCheckHandleScope {
Igor Murashkin42298112016-10-06 10:51:11 -0700527 ScopedCheckHandleScope() : handle_scope_(Thread::Current()->GetTopHandleScope()) {
Igor Murashkina51d8b72016-10-05 14:33:30 -0700528 }
529
530 ~ScopedCheckHandleScope() {
531 EXPECT_EQ(handle_scope_, Thread::Current()->GetTopHandleScope())
532 << "Top-most handle scope must be the same after all the JNI "
533 << "invocations have finished (as before they were invoked).";
534 }
535
Mathieu Chartiere8a3c572016-10-11 16:52:17 -0700536 BaseHandleScope* const handle_scope_;
Igor Murashkina51d8b72016-10-05 14:33:30 -0700537};
538
Andreas Gampe0a855762016-10-26 13:43:14 -0700539// Number of references allocated in JNI ShadowFrames on the given thread.
540static size_t NumJniShadowFrameReferences(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_) {
541 return self->GetManagedStack()->NumJniShadowFrameReferences();
542}
543
544// Number of references in handle scope on the given thread.
545static size_t NumHandleReferences(Thread* self) {
546 size_t count = 0;
547 for (BaseHandleScope* cur = self->GetTopHandleScope(); cur != nullptr; cur = cur->GetLink()) {
548 count += cur->NumberOfReferences();
549 }
550 return count;
551}
552
553// Number of references allocated in handle scopes & JNI shadow frames on this thread.
554static size_t NumStackReferences(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_) {
555 return NumHandleReferences(self) + NumJniShadowFrameReferences(self);
556}
557
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700558static void expectNumStackReferences(size_t val1, size_t val2) {
559 // In rare cases when JNI functions call themselves recursively,
560 // disable this test because it will have a false negative.
561 if (!IsCurrentJniCritical() && ScopedDisableCheckNumStackReferences::sCheckNumStackReferences) {
562 /* @CriticalNative doesn't build a HandleScope, so this test is meaningless then. */
563 ScopedObjectAccess soa(Thread::Current());
564
Andreas Gampe0a855762016-10-26 13:43:14 -0700565 size_t actual_num = NumStackReferences(Thread::Current());
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700566 // XX: Not too sure what's going on.
567 // Sometimes null references get placed and sometimes they don't?
568 EXPECT_TRUE(val1 == actual_num || val2 == actual_num)
569 << "expected either " << val1 << " or " << val2
570 << " number of stack references, but got: " << actual_num;
571 }
572}
573
574#define EXPECT_NUM_STACK_REFERENCES(val1, val2) expectNumStackReferences(val1, val2)
575
576template <typename T, T fn>
577struct make_jni_test_decorator;
578
579// Decorator for "static" JNI callbacks.
580template <typename R, typename ... Args, R fn(JNIEnv*, jclass, Args...)>
581struct make_jni_test_decorator<R(JNIEnv*, jclass kls, Args...), fn> {
582 static R apply(JNIEnv* env, jclass kls, Args ... args) {
583 EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
584 EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
585 EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls);
586 // All incoming parameters + the jclass get put into the transition's StackHandleScope.
587 EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(kls, args...),
588 (count_refs_helper<jclass, Args...>::value));
589
590 return fn(env, kls, args...);
591 }
592};
593
594// Decorator for instance JNI callbacks.
595template <typename R, typename ... Args, R fn(JNIEnv*, jobject, Args...)>
596struct make_jni_test_decorator<R(JNIEnv*, jobject, Args...), fn> {
597 static R apply(JNIEnv* env, jobject thisObj, Args ... args) {
598 EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
599 EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
600 EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj);
601 // All incoming parameters + the implicit 'this' get put into the transition's StackHandleScope.
602 EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(thisObj, args...),
603 (count_refs_helper<jobject, Args...>::value));
604
605 return fn(env, thisObj, args...);
606 }
607};
608
609// Decorate the regular JNI callee with the extra gtest checks.
610// This way we can have common test logic for everything generic like checking if a lock is held,
611// checking handle scope state, etc.
612#define MAKE_JNI_TEST_DECORATOR(fn) make_jni_test_decorator<decltype(fn), (fn)>::apply
613
614// Convert function f(JNIEnv*,jclass,a,b,c,d...) into f2(a,b,c,d...)
615// -- This way we don't have to write out each implementation twice for @CriticalNative.
616#define JNI_CRITICAL_WRAPPER(func) jni_remove_extra_parameters<decltype(func), (func)>::apply
617// Get a function pointer whose calling convention either matches a regular native
618// or a critical native depending on which kind of jni is currently under test.
619// -- This also has the benefit of genering a compile time error if the 'func' doesn't properly
620// have JNIEnv and jclass parameters first.
621#define CURRENT_JNI_WRAPPER(func) \
622 (IsCurrentJniCritical() \
623 ? reinterpret_cast<void*>(&JNI_CRITICAL_WRAPPER(MAKE_JNI_TEST_DECORATOR(func))) \
624 : reinterpret_cast<void*>(&MAKE_JNI_TEST_DECORATOR(func)))
625
626// Do the opposite of the above. Do *not* wrap the function, instead just cast it to a void*.
627// Only for "TEST_JNI_NORMAL_ONLY" configs, and it inserts a test assert to ensure this is the case.
628#define NORMAL_JNI_ONLY_NOWRAP(func) \
629 ({ ASSERT_TRUE(IsCurrentJniNormal()); reinterpret_cast<void*>(&(func)); })
630// Same as above, but with nullptr. When we want to test the stub functionality.
631#define NORMAL_JNI_ONLY_NULLPTR \
632 ({ ASSERT_TRUE(IsCurrentJniNormal()); nullptr; })
633
634
635int gJava_MyClassNatives_foo_calls[kJniKindCount] = {};
636void Java_MyClassNatives_foo(JNIEnv*, jobject) {
637 gJava_MyClassNatives_foo_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700638}
639
Andreas Gampe6e498692014-08-18 16:43:12 -0700640void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700641 SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700642
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700643 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700644 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700645 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700646 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700647 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700648
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700649 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700650}
651
Andreas Gampe6e498692014-08-18 16:43:12 -0700652JNI_TEST(CompileAndRunNoArgMethod)
653
654void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700655 SetUpForTest(false, "bar", "(I)I", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700656 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700657
Shih-wei Liao31384c52011-09-06 15:27:45 -0700658 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800659 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700660 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700661 << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700662
663 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
664 EXPECT_EQ(25, result);
665}
666
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700667// TODO: Support @FastNative and @CriticalNative through stubs.
668JNI_TEST_NORMAL_ONLY(CompileAndRunIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700669
670void JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700671 SetUpForTest(true, "sbar", "(I)I", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700672 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800673
674 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800675 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700676 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700677 << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800678
679 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
680 EXPECT_EQ(43, result);
681}
682
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700683// TODO: Support @FastNative and @CriticalNative through stubs.
684JNI_TEST_NORMAL_ONLY(CompileAndRunStaticIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700685
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700686int gJava_MyClassNatives_fooI_calls[kJniKindCount] = {};
687jint Java_MyClassNatives_fooI(JNIEnv*, jobject, jint x) {
688 gJava_MyClassNatives_fooI_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700689 return x;
690}
691
Andreas Gampe6e498692014-08-18 16:43:12 -0700692void JniCompilerTest::CompileAndRunIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700693 SetUpForTest(false, "fooI", "(I)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700694 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700695
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700696 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700697 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
698 EXPECT_EQ(42, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700699 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700700 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
701 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700702 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700703
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700704 gJava_MyClassNatives_fooI_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700705}
706
Andreas Gampe6e498692014-08-18 16:43:12 -0700707JNI_TEST(CompileAndRunIntMethod)
708
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700709int gJava_MyClassNatives_fooII_calls[kJniKindCount] = {};
710jint Java_MyClassNatives_fooII(JNIEnv*, jobject, jint x, jint y) {
711 gJava_MyClassNatives_fooII_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700712 return x - y; // non-commutative operator
713}
714
Andreas Gampe6e498692014-08-18 16:43:12 -0700715void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700716 SetUpForTest(false, "fooII", "(II)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700717 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700718
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700719 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700720 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
721 EXPECT_EQ(99 - 10, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700722 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700723 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
724 0xCAFED00D);
725 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700726 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700727
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700728 gJava_MyClassNatives_fooII_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700729}
730
Andreas Gampe6e498692014-08-18 16:43:12 -0700731JNI_TEST(CompileAndRunIntIntMethod)
732
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700733int gJava_MyClassNatives_fooJJ_calls[kJniKindCount] = {};
734jlong Java_MyClassNatives_fooJJ(JNIEnv*, jobject, jlong x, jlong y) {
735 gJava_MyClassNatives_fooJJ_calls[gCurrentJni]++;
Ian Rogers9b269d22011-09-04 14:06:05 -0700736 return x - y; // non-commutative operator
737}
738
Andreas Gampe6e498692014-08-18 16:43:12 -0700739void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700740 SetUpForTest(false, "fooJJ", "(JJ)J",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700741 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700742
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700743 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Ian Rogers0f678472014-03-10 16:18:37 -0700744 jlong a = INT64_C(0x1234567890ABCDEF);
745 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700746 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
747 EXPECT_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700748 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Ian Rogers9b269d22011-09-04 14:06:05 -0700749 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
750 EXPECT_EQ(b - a, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700751 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700752
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700753 gJava_MyClassNatives_fooJJ_calls[gCurrentJni] = 0;
Ian Rogers9b269d22011-09-04 14:06:05 -0700754}
755
Andreas Gampe6e498692014-08-18 16:43:12 -0700756JNI_TEST(CompileAndRunLongLongMethod)
757
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700758int gJava_MyClassNatives_fooDD_calls[kJniKindCount] = {};
759jdouble Java_MyClassNatives_fooDD(JNIEnv*, jobject, jdouble x, jdouble y) {
760 gJava_MyClassNatives_fooDD_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700761 return x - y; // non-commutative operator
762}
763
Andreas Gampe6e498692014-08-18 16:43:12 -0700764void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700765 SetUpForTest(false, "fooDD", "(DD)D",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700766 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700767
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700768 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700769 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
770 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700771 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700772 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700773 jdouble a = 3.14159265358979323846;
774 jdouble b = 0.69314718055994530942;
775 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700776 EXPECT_DOUBLE_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700777 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700778
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700779 gJava_MyClassNatives_fooDD_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700780}
781
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700782int gJava_MyClassNatives_fooJJ_synchronized_calls[kJniKindCount] = {};
783jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv*, jobject, jlong x, jlong y) {
784 gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]++;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700785 return x | y;
786}
787
Andreas Gampe6e498692014-08-18 16:43:12 -0700788void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700789 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700790 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ_synchronized));
Elliott Hughes3e778f72012-05-21 15:29:52 -0700791
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700792 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700793 jlong a = 0x1000000020000000ULL;
794 jlong b = 0x00ff000000aa0000ULL;
795 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
796 EXPECT_EQ(a | b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700797 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700798
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700799 gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni] = 0;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700800}
801
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700802JNI_TEST_NORMAL_ONLY(CompileAndRun_fooJJ_synchronized)
Andreas Gampe6e498692014-08-18 16:43:12 -0700803
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700804int gJava_MyClassNatives_fooIOO_calls[kJniKindCount] = {};
805jobject Java_MyClassNatives_fooIOO(JNIEnv*, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700806 jobject z) {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700807 gJava_MyClassNatives_fooIOO_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700808 switch (x) {
809 case 1:
810 return y;
811 case 2:
812 return z;
813 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700814 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700815 }
816}
817
Andreas Gampe6e498692014-08-18 16:43:12 -0700818void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700819 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700820 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700821 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700822
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700823 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700824 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700825 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700826 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700827
Andreas Gampecf4035a2014-05-28 22:43:01 -0700828 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700829 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700830 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700831 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
832 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700833 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700834 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700835 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700836 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700837
Andreas Gampecf4035a2014-05-28 22:43:01 -0700838 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700839 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700840 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700841 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700842 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700843 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700844 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
845 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700846 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700847
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700848 gJava_MyClassNatives_fooIOO_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700849}
850
Igor Murashkinaf1e2992016-10-12 17:44:50 -0700851JNI_TEST(CompileAndRunIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700852
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700853int gJava_MyClassNatives_fooSII_calls[kJniKindCount] = {};
854jint Java_MyClassNatives_fooSII(JNIEnv* env ATTRIBUTE_UNUSED,
855 jclass klass ATTRIBUTE_UNUSED,
856 jint x,
857 jint y) {
858 gJava_MyClassNatives_fooSII_calls[gCurrentJni]++;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700859 return x + y;
860}
861
Andreas Gampe6e498692014-08-18 16:43:12 -0700862void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700863 SetUpForTest(true, "fooSII", "(II)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700864 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700865
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700866 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700867 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
868 EXPECT_EQ(50, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700869 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700870
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700871 gJava_MyClassNatives_fooSII_calls[gCurrentJni] = 0;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700872}
873
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700874JNI_TEST_CRITICAL(CompileAndRunStaticIntIntMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700875
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700876int gJava_MyClassNatives_fooSDD_calls[kJniKindCount] = {};
877jdouble Java_MyClassNatives_fooSDD(JNIEnv* env ATTRIBUTE_UNUSED,
878 jclass klass ATTRIBUTE_UNUSED,
879 jdouble x,
880 jdouble y) {
881 gJava_MyClassNatives_fooSDD_calls[gCurrentJni]++;
Ian Rogers7a99c112011-09-07 12:48:27 -0700882 return x - y; // non-commutative operator
883}
884
Andreas Gampe6e498692014-08-18 16:43:12 -0700885void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700886 SetUpForTest(true, "fooSDD", "(DD)D",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700887 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700888
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700889 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Ian Rogers7a99c112011-09-07 12:48:27 -0700890 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700891 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700892 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Ian Rogers7a99c112011-09-07 12:48:27 -0700893 jdouble a = 3.14159265358979323846;
894 jdouble b = 0.69314718055994530942;
895 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700896 EXPECT_DOUBLE_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700897 EXPECT_DOUBLE_EQ(2, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700898
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700899 gJava_MyClassNatives_fooSDD_calls[gCurrentJni] = 0;
Ian Rogers7a99c112011-09-07 12:48:27 -0700900}
901
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700902JNI_TEST_CRITICAL(CompileAndRunStaticDoubleDoubleMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700903
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100904// The x86 generic JNI code had a bug where it assumed a floating
905// point return value would be in xmm0. We use log, to somehow ensure
906// the compiler will use the floating point stack.
907
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700908jdouble Java_MyClassNatives_logD(JNIEnv*, jclass, jdouble x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100909 return log(x);
910}
911
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700912jdouble Java_MyClassNatives_logD_notNormal(JNIEnv*, jclass, jdouble x) {
913 EXPECT_DOUBLE_EQ(2.0, x);
914 return log(x);
915}
916
Andreas Gampe6e498692014-08-18 16:43:12 -0700917void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700918 void* jni_handler;
919 if (IsCurrentJniNormal()) {
920 // This test seems a bit special, don't use a JNI wrapper here.
921 jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logD);
922 } else {
923 jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logD_notNormal);
924 }
925 SetUpForTest(true, "logD", "(D)D", jni_handler);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100926
927 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700928 EXPECT_DOUBLE_EQ(log(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100929}
930
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700931JNI_TEST_CRITICAL(RunStaticLogDoubleMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700932
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700933jfloat Java_MyClassNatives_logF(JNIEnv*, jclass, jfloat x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100934 return logf(x);
935}
936
Andreas Gampe6e498692014-08-18 16:43:12 -0700937void JniCompilerTest::RunStaticLogFloatMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700938 void* jni_handler;
939 if (IsCurrentJniNormal()) {
940 // This test seems a bit special, don't use a JNI wrapper here.
941 jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logF);
942 } else {
943 jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logF);
944 }
945
946 SetUpForTest(true, "logF", "(F)F", jni_handler);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100947
948 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700949 EXPECT_FLOAT_EQ(logf(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100950}
951
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700952JNI_TEST_CRITICAL(RunStaticLogFloatMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700953
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700954jboolean Java_MyClassNatives_returnTrue(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100955 return JNI_TRUE;
956}
957
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700958jboolean Java_MyClassNatives_returnFalse(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100959 return JNI_FALSE;
960}
961
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700962jint Java_MyClassNatives_returnInt(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100963 return 42;
964}
965
Andreas Gampe6e498692014-08-18 16:43:12 -0700966void JniCompilerTest::RunStaticReturnTrueImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700967 SetUpForTest(true, "returnTrue", "()Z", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnTrue));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100968
969 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
970 EXPECT_TRUE(result);
971}
972
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700973JNI_TEST_CRITICAL(RunStaticReturnTrue)
Andreas Gampe6e498692014-08-18 16:43:12 -0700974
975void JniCompilerTest::RunStaticReturnFalseImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100976 SetUpForTest(true, "returnFalse", "()Z",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700977 CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnFalse));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100978
979 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
980 EXPECT_FALSE(result);
981}
982
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700983JNI_TEST_CRITICAL(RunStaticReturnFalse)
Andreas Gampe6e498692014-08-18 16:43:12 -0700984
985void JniCompilerTest::RunGenericStaticReturnIntImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700986 SetUpForTest(true, "returnInt", "()I", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnInt));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100987
988 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
989 EXPECT_EQ(42, result);
990}
991
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700992JNI_TEST_CRITICAL(RunGenericStaticReturnInt)
Andreas Gampe6e498692014-08-18 16:43:12 -0700993
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700994int gJava_MyClassNatives_returnDouble_calls[kJniKindCount] = {};
995jdouble Java_MyClassNatives_returnDouble(JNIEnv*, jclass) {
996 gJava_MyClassNatives_returnDouble_calls[gCurrentJni]++;
997 return 4.0;
998}
999
1000void JniCompilerTest::RunGenericStaticReturnDoubleImpl() {
1001 SetUpForTest(true, "returnDouble", "()D", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnDouble));
1002
1003 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_);
1004 EXPECT_DOUBLE_EQ(4.0, result);
1005 EXPECT_EQ(1, gJava_MyClassNatives_returnDouble_calls[gCurrentJni]);
1006
1007 gJava_MyClassNatives_returnDouble_calls[gCurrentJni] = 0;
1008}
1009
1010JNI_TEST_CRITICAL(RunGenericStaticReturnDouble)
1011
1012jlong Java_MyClassNatives_returnLong(JNIEnv*, jclass) {
1013 return 0xFEEDDEADFEEDL;
1014}
1015
1016void JniCompilerTest::RunGenericStaticReturnLongImpl() {
1017 SetUpForTest(true, "returnLong", "()J", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnLong));
1018
1019 jlong result = env_->CallStaticLongMethod(jklass_, jmethod_);
1020 EXPECT_EQ(0xFEEDDEADFEEDL, result);
1021}
1022
1023JNI_TEST_CRITICAL(RunGenericStaticReturnLong)
1024
1025int gJava_MyClassNatives_fooSIOO_calls[kJniKindCount] = {};
1026jobject Java_MyClassNatives_fooSIOO(JNIEnv*, jclass klass, jint x, jobject y, jobject z) {
1027 gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -07001028 switch (x) {
1029 case 1:
1030 return y;
1031 case 2:
1032 return z;
1033 default:
1034 return klass;
1035 }
1036}
1037
Andreas Gampe6e498692014-08-18 16:43:12 -07001038void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001039 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001040 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001041 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001042
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001043 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001044 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001045 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001046 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001047
Andreas Gampecf4035a2014-05-28 22:43:01 -07001048 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001049 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001050 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001051 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1052 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001053 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001054 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001055 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001056 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001057
Andreas Gampecf4035a2014-05-28 22:43:01 -07001058 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001059 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001060 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001061 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001062 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001063 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001064 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1065 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001066 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001067
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001068 gJava_MyClassNatives_fooSIOO_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001069}
1070
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001071JNI_TEST(CompileAndRunStaticIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -07001072
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001073int gJava_MyClassNatives_fooSSIOO_calls[kJniKindCount] = {};
1074jobject Java_MyClassNatives_fooSSIOO(JNIEnv*, jclass klass, jint x, jobject y, jobject z) {
1075 gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]++;
Ian Rogersdf20fe02011-07-20 20:34:16 -07001076 switch (x) {
1077 case 1:
1078 return y;
1079 case 2:
1080 return z;
1081 default:
1082 return klass;
1083 }
1084}
1085
Andreas Gampe6e498692014-08-18 16:43:12 -07001086void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001087 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001088 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001089 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -07001090
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001091 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001092 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001093 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001094 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001095
Andreas Gampecf4035a2014-05-28 22:43:01 -07001096 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001097 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001098 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001099 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1100 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001101 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001102 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001103 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001104 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001105
Andreas Gampecf4035a2014-05-28 22:43:01 -07001106 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001107 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001108 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001109 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001110 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001111 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001112 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1113 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001114 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001115
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001116 gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni] = 0;
Ian Rogersdf20fe02011-07-20 20:34:16 -07001117}
1118
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001119// TODO: Maybe. @FastNative support for returning Objects?
1120JNI_TEST_NORMAL_ONLY(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -07001121
Elliott Hughesb264f082012-04-06 17:10:10 -07001122void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -07001123 jclass c = env->FindClass("java/lang/RuntimeException");
1124 env->ThrowNew(c, "hello");
1125}
Ian Rogers45a76cb2011-07-21 22:00:15 -07001126
Andreas Gampe6e498692014-08-18 16:43:12 -07001127void JniCompilerTest::ExceptionHandlingImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001128 {
1129 ASSERT_FALSE(runtime_->IsStarted());
1130 ScopedObjectAccess soa(Thread::Current());
1131 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -07001132
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001133 // all compilation needs to happen before Runtime::Start
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001134 CompileForTestWithCurrentJni(class_loader_, false, "foo", "()V");
1135 CompileForTestWithCurrentJni(class_loader_, false, "throwException", "()V");
1136 CompileForTestWithCurrentJni(class_loader_, false, "foo", "()V");
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001137 }
1138 // Start runtime to avoid re-initialization in SetupForTest.
1139 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -07001140 bool started = runtime_->Start();
1141 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -07001142
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001143 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -07001144
Ian Rogers67375ac2011-09-14 00:55:44 -07001145 // Check a single call of a JNI method is ok
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001146 SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001147 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001148 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogers67375ac2011-09-14 00:55:44 -07001149 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -07001150
Ian Rogers67375ac2011-09-14 00:55:44 -07001151 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001152 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
1153 SetUpForTest(false, "throwException", "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001154 CURRENT_JNI_WRAPPER(Java_MyClassNatives_throwException));
Elliott Hughesb264f082012-04-06 17:10:10 -07001155 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -07001156 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001157 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001158 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1159 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
1160 env_->ExceptionClear();
1161 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -07001162
Ian Rogers67375ac2011-09-14 00:55:44 -07001163 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001164 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001165 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001166 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001167
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001168 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Ian Rogers45a76cb2011-07-21 22:00:15 -07001169}
1170
Andreas Gampe6e498692014-08-18 16:43:12 -07001171JNI_TEST(ExceptionHandling)
1172
Elliott Hughesb264f082012-04-06 17:10:10 -07001173jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001174 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -07001175 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001176 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -07001177
1178 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +01001179 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -07001180 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Mathieu Chartier0795f232016-09-27 18:43:30 -07001181 ObjPtr<mirror::ObjectArray<mirror::StackTraceElement>> trace_array =
1182 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001183 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001184 EXPECT_EQ(11, trace_array->GetLength());
1185
Ian Rogersaaa20802011-09-11 21:47:37 -07001186 // Check stack trace entries have expected values
Andreas Gampe277ccbd2014-11-03 21:36:10 -08001187 for (int32_t j = 0; j < trace_array->GetLength(); ++j) {
1188 EXPECT_EQ(-2, trace_array->Get(j)->GetLineNumber());
1189 mirror::StackTraceElement* ste = trace_array->Get(j);
Ian Rogersaaa20802011-09-11 21:47:37 -07001190 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -07001191 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001192 EXPECT_EQ(("fooI" + CurrentJniStringSuffix()), ste->GetMethodName()->ToModifiedUtf8());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001193 }
Ian Rogersaaa20802011-09-11 21:47:37 -07001194
1195 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001196 return 0;
1197 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -07001198 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -07001199 EXPECT_TRUE(jklass != nullptr);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001200 jmethodID jmethod = env->GetMethodID(jklass,
1201 ("fooI" + CurrentJniStringSuffix()).c_str(),
1202 "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -07001203 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001204
Ian Rogersaaa20802011-09-11 21:47:37 -07001205 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001206 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -07001207
1208 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001209 return i + result;
1210 }
1211}
1212
Andreas Gampe6e498692014-08-18 16:43:12 -07001213void JniCompilerTest::NativeStackTraceElementImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001214 SetUpForTest(false, "fooI", "(I)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001215 CURRENT_JNI_WRAPPER(Java_MyClassNatives_nativeUpCall));
1216
1217 // Usual # local references on stack check fails because nativeUpCall calls itself recursively,
1218 // each time the # of local references will therefore go up.
1219 ScopedDisableCheckNumStackReferences disable_num_stack_check;
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001220 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001221
Ian Rogersaaa20802011-09-11 21:47:37 -07001222 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001223}
1224
Andreas Gampe6e498692014-08-18 16:43:12 -07001225JNI_TEST(NativeStackTraceElement)
1226
Elliott Hughesb264f082012-04-06 17:10:10 -07001227jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -07001228 return env->NewGlobalRef(x);
1229}
1230
Andreas Gampe6e498692014-08-18 16:43:12 -07001231void JniCompilerTest::ReturnGlobalRefImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001232 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001233 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -07001234 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
1235 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
1236 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
1237}
1238
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001239JNI_TEST(ReturnGlobalRef)
Andreas Gampe6e498692014-08-18 16:43:12 -07001240
Ian Rogersdc51b792011-09-22 20:41:37 -07001241jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
1242 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001243 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -07001244 for (int i = 0; i < 10; i++) {
Mathieu Chartier0795f232016-09-27 18:43:30 -07001245 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -07001246 }
1247 return x+1;
1248}
1249
Andreas Gampe6e498692014-08-18 16:43:12 -07001250void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001251 SetUpForTest(false, "fooI", "(I)I", CURRENT_JNI_WRAPPER(local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -07001252 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -07001253 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -07001254 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
1255 EXPECT_TRUE(result == i + 1);
1256 }
1257}
1258
Andreas Gampe6e498692014-08-18 16:43:12 -07001259JNI_TEST(LocalReferenceTableClearingTest)
1260
Ian Rogersb9231c82011-09-05 22:13:19 -07001261void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
1262 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
1263 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -07001264 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -07001265 EXPECT_EQ(1234, src_pos);
1266 EXPECT_EQ(5678, dst_pos);
1267 EXPECT_EQ(9876, length);
1268}
1269
Andreas Gampe6e498692014-08-18 16:43:12 -07001270void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001271 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001272 CURRENT_JNI_WRAPPER(my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -07001273 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -07001274}
1275
Andreas Gampe6e498692014-08-18 16:43:12 -07001276JNI_TEST(JavaLangSystemArrayCopy)
1277
Ian Rogers67375ac2011-09-14 00:55:44 -07001278jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
1279 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
1280 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -07001281 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -07001282 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
1283 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
1284 return JNI_TRUE;
1285}
1286
Andreas Gampe6e498692014-08-18 16:43:12 -07001287void JniCompilerTest::CompareAndSwapIntImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001288 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001289 CURRENT_JNI_WRAPPER(my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -07001290 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
1291 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -07001292 EXPECT_EQ(result, JNI_TRUE);
1293}
1294
Andreas Gampe6e498692014-08-18 16:43:12 -07001295JNI_TEST(CompareAndSwapInt)
1296
Ian Rogersc7792842012-03-03 15:36:20 -08001297jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
1298 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
1299 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
1300 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
1301 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
1302 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
1303 return 42;
1304}
1305
Andreas Gampe6e498692014-08-18 16:43:12 -07001306void JniCompilerTest::GetTextImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001307 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001308 CURRENT_JNI_WRAPPER(my_gettext));
Ian Rogersc7792842012-03-03 15:36:20 -08001309 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -07001310 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -08001311 EXPECT_EQ(result, 42);
1312}
1313
Andreas Gampe6e498692014-08-18 16:43:12 -07001314JNI_TEST(GetText)
1315
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001316int gJava_MyClassNatives_GetSinkProperties_calls[kJniKindCount] = {};
1317jarray Java_MyClassNatives_GetSinkProperties(JNIEnv*, jobject thisObj, jstring s) {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001318 EXPECT_EQ(s, nullptr);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001319 gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]++;
1320
1321 Thread* self = Thread::Current();
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001322 ScopedObjectAccess soa(self);
Mathieu Chartier1cc62e42016-10-03 18:01:28 -07001323 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object>(thisObj).Ptr()));
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001324 return nullptr;
1325}
1326
Andreas Gampe6e498692014-08-18 16:43:12 -07001327void JniCompilerTest::GetSinkPropertiesNativeImpl() {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001328 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001329 CURRENT_JNI_WRAPPER(Java_MyClassNatives_GetSinkProperties));
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001330
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001331 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001332 jarray result = down_cast<jarray>(
1333 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
1334 EXPECT_EQ(nullptr, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001335 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001336
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001337 gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni] = 0;
Brian Carlstromfc7120c2012-08-27 13:43:25 -07001338}
1339
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001340// @FastNative doesn't support 'synchronized' keyword and
1341// never will -- locking functions aren't fast.
1342JNI_TEST_NORMAL_ONLY(GetSinkPropertiesNative)
Andreas Gampe6e498692014-08-18 16:43:12 -07001343
Elliott Hughesb264f082012-04-06 17:10:10 -07001344// This should return jclass, but we're imitating a bug pattern.
1345jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
1346 return env->NewStringUTF("not a class!");
1347}
1348
1349// This should return jclass, but we're imitating a bug pattern.
1350jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
1351 return env->NewStringUTF("not a class!");
1352}
1353
Andreas Gampe6e498692014-08-18 16:43:12 -07001354void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001355 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001356 CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldReturnClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001357
1358 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001359 // This native method is bad, and tries to return a jstring as a jclass.
1360 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001361 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1362 "of java.lang.String from java.lang.Class " +
1363 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1364 CurrentJniStringSuffix() + "()");
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001365
1366 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -07001367 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001368 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1369 "of java.lang.String from java.lang.Class " +
1370 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1371 CurrentJniStringSuffix() + "()");
Ian Rogers68d8b422014-07-17 11:09:10 -07001372 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001373 check_jni_abort_catcher.Check(std::string() + "calling non-static method " +
1374 "java.lang.Class " +
1375 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1376 CurrentJniStringSuffix() + "() with CallStaticObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001377}
1378
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001379JNI_TEST(UpcallReturnTypeChecking_Instance)
Andreas Gampe6e498692014-08-18 16:43:12 -07001380
1381void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001382 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001383 CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldReturnClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001384
1385 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001386 // This native method is bad, and tries to return a jstring as a jclass.
1387 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001388 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1389 "of java.lang.String from java.lang.Class " +
1390 "MyClassNatives.staticMethodThatShouldReturnClass" +
1391 CurrentJniStringSuffix() + "()");
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001392
1393 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -07001394 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001395 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1396 "of java.lang.String from java.lang.Class " +
1397 "MyClassNatives.staticMethodThatShouldReturnClass" +
1398 CurrentJniStringSuffix() + "()");
Ian Rogers68d8b422014-07-17 11:09:10 -07001399 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001400 check_jni_abort_catcher.Check(std::string() + "calling static method " +
1401 "java.lang.Class " +
1402 "MyClassNatives.staticMethodThatShouldReturnClass" +
1403 CurrentJniStringSuffix() + "() with CallObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001404}
1405
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001406JNI_TEST(UpcallReturnTypeChecking_Static)
Andreas Gampe6e498692014-08-18 16:43:12 -07001407
Elliott Hughesb264f082012-04-06 17:10:10 -07001408// This should take jclass, but we're imitating a bug pattern.
1409void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
1410}
1411
1412// This should take jclass, but we're imitating a bug pattern.
1413void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
1414}
1415
Andreas Gampe6e498692014-08-18 16:43:12 -07001416void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001417 // This will lead to error messages in the log.
1418 ScopedLogSeverity sls(LogSeverity::FATAL);
1419
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001420 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001421 CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldTakeClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001422
1423 CheckJniAbortCatcher check_jni_abort_catcher;
1424 // We deliberately pass a bad second argument here.
1425 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001426 check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1427 "MyClassNatives.instanceMethodThatShouldTakeClass" +
1428 CurrentJniStringSuffix() + "(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001429}
1430
Andreas Gampe6e498692014-08-18 16:43:12 -07001431JNI_TEST(UpcallArgumentTypeChecking_Instance)
1432
1433void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001434 // This will lead to error messages in the log.
1435 ScopedLogSeverity sls(LogSeverity::FATAL);
1436
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001437 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001438 CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldTakeClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001439
1440 CheckJniAbortCatcher check_jni_abort_catcher;
1441 // We deliberately pass a bad second argument here.
1442 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001443 check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1444 "MyClassNatives.staticMethodThatShouldTakeClass" +
1445 CurrentJniStringSuffix() + "(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001446}
1447
Andreas Gampe6e498692014-08-18 16:43:12 -07001448JNI_TEST(UpcallArgumentTypeChecking_Static)
1449
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001450jfloat Java_MyClassNatives_checkFloats(JNIEnv*, jobject, jfloat f1, jfloat f2) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001451 return f1 - f2; // non-commutative operator
1452}
1453
Andreas Gampe6e498692014-08-18 16:43:12 -07001454void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001455 SetUpForTest(false, "checkFloats", "(FF)F",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001456 CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkFloats));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001457
1458 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1459 99.0F, 10.0F);
Ian Rogers647b1a82014-10-10 11:02:11 -07001460 EXPECT_FLOAT_EQ(99.0F - 10.0F, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001461 jfloat a = 3.14159F;
1462 jfloat b = 0.69314F;
1463 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -07001464 EXPECT_FLOAT_EQ(a - b, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001465}
1466
Andreas Gampe6e498692014-08-18 16:43:12 -07001467JNI_TEST(CompileAndRunFloatFloatMethod)
1468
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001469void Java_MyClassNatives_checkParameterAlign(JNIEnv* env ATTRIBUTE_UNUSED,
1470 jobject thisObj ATTRIBUTE_UNUSED,
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001471 jint i1,
1472 jlong l1) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001473 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -07001474 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001475}
1476
Andreas Gampe6e498692014-08-18 16:43:12 -07001477void JniCompilerTest::CheckParameterAlignImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001478 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001479 CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkParameterAlign));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001480
Ian Rogers0f678472014-03-10 16:18:37 -07001481 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001482}
1483
Andreas Gampe6e498692014-08-18 16:43:12 -07001484JNI_TEST(CheckParameterAlign)
1485
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001486void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject,
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001487 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1488 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1489 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1490 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1491 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1492 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1493 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1494 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1495 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1496 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1497 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1498 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1499 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1500 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1501 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1502 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1503 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1504 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1505 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1506 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1507 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1508 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1509 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1510 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1511 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1512 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1513 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1514 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1515 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1516 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1517 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1518 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001519 // two tests possible
1520 if (o0 == nullptr) {
1521 // 1) everything is null
1522 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1523 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1524 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1525 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1526 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1527 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1528 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1529 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1530 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1531 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1532 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1533 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1534 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1535 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1536 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1537 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1538 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1539 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1540 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1541 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1542 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1543 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1544 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1545 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1546 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1547 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1548 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1549 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1550 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1551 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1552 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1553 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1554 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1555 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1556 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1557 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1558 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1559 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1560 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1561 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1562 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1563 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1564 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1565 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1566 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1567 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1568 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1569 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1570 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1571 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1572 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1573 } else {
1574 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1575 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1576 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1577 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1578 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1579 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1580 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1581 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1582 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1583 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1584 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1585 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1586 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1587 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1588 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1589 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1590 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1591 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1592 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1593 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1594 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1595 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1596 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1597 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1598 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1599 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1600 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1601 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1602 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1603 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1604 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1605 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1606 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1607 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1608 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1609 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1610 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1611 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1612 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1613 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1614 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1615 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1616 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1617 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1618 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1619 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1620 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1621 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1622 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1623 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1624 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1625 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1626 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1627 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1628 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1629 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1630 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1631 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1632 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1633 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1634 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1635 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1636 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1637 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1638 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1639 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1640 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1641 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1642 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1643 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1644 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1645 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1646 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1647 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1648 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1649 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1650 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1651 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1652 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1653 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1654 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1655 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1656 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1657 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1658 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1659 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1660 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1661 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1662 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1663 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1664 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1665 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1666 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1667 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1668 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1669 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1670 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1671 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1672 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1673 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1674 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1675 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1676 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1677 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1678 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1679 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1680 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1681 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1682 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1683 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1684 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1685 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1686 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1687 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1688 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1689 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1690 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1691 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1692 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1693 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1694 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1695 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1696 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1697 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1698 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1699 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1700 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1701 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1702 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1703 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1704 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1705 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1706 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1707 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1708 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1709 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1710 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1711 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1712 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1713 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1714 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1715 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1716 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1717 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1718 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1719 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1720 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1721 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1722 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1723 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1724 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1725 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1726 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1727 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1728 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1729 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1730 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1731 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1732 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1733 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1734 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1735 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1736 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1737 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1738 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1739 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1740 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1741 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1742 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1743 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1744 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1745 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1746 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1747 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1748 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1749 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1750 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1751 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1752 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1753 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1754 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1755 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1756 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1757 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1758 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1759 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1760 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1761 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1762 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1763 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1764 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1765 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1766 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1767 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1768 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1769 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1770 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1771 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1772 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1773 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1774 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1775 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1776 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1777 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1778 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1779 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1780 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1781 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1782 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1783 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1784 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1785 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1786 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1787 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1788 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1789 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1790 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1791 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1792 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1793 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1794 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1795 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1796 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1797 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1798 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1799 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1800 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1801 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1802 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1803 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1804 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1805 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1806 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1807 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1808 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1809 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1810 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1811 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1812 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1813 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1814 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1815 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1816 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1817 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1818 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1819 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1820 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1821 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1822 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1823 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1824 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1825 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1826 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1827 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1828 }
1829}
1830
1831const char* longSig =
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;Ljava/lang/Object;"
1879 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1880 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1881 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1882 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1883
Andreas Gampe6e498692014-08-18 16:43:12 -07001884void JniCompilerTest::MaxParamNumberImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001885 SetUpForTest(false, "maxParamNumber", longSig,
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001886 CURRENT_JNI_WRAPPER(Java_MyClassNatives_maxParamNumber));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001887
1888 jvalue args[254];
1889
1890 // First test: test with all arguments null.
1891 for (int i = 0; i < 254; ++i) {
1892 args[i].l = nullptr;
1893 }
1894
1895 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1896
1897 // Second test: test with int[] objects with increasing lengths
1898 for (int i = 0; i < 254; ++i) {
1899 jintArray tmp = env_->NewIntArray(i);
1900 args[i].l = tmp;
1901 EXPECT_NE(args[i].l, nullptr);
1902 }
1903
1904 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1905}
1906
Andreas Gampe6e498692014-08-18 16:43:12 -07001907JNI_TEST(MaxParamNumber)
1908
1909void JniCompilerTest::WithoutImplementationImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001910 // This will lead to error messages in the log.
1911 ScopedLogSeverity sls(LogSeverity::FATAL);
1912
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001913 SetUpForTest(false, "withoutImplementation", "()V", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampead615172014-04-04 16:20:13 -07001914
1915 env_->CallVoidMethod(jobj_, jmethod_);
1916
1917 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1918 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1919}
1920
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001921// TODO: Don't test @FastNative here since it goes through a stub lookup (unsupported) which would
1922// normally fail with an exception, but fails with an assert.
1923JNI_TEST_NORMAL_ONLY(WithoutImplementation)
Andreas Gampe6e498692014-08-18 16:43:12 -07001924
Andreas Gampe48ee3562015-04-10 19:57:29 -07001925void JniCompilerTest::WithoutImplementationRefReturnImpl() {
1926 // This will lead to error messages in the log.
1927 ScopedLogSeverity sls(LogSeverity::FATAL);
1928
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001929 SetUpForTest(false,
1930 "withoutImplementationRefReturn",
1931 "()Ljava/lang/Object;",
1932 NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampe48ee3562015-04-10 19:57:29 -07001933
1934 env_->CallObjectMethod(jobj_, jmethod_);
1935
1936 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1937 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1938}
1939
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001940// TODO: Should work for @FastNative too.
1941JNI_TEST_NORMAL_ONLY(WithoutImplementationRefReturn)
Andreas Gampe48ee3562015-04-10 19:57:29 -07001942
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001943void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv*, jclass, jint i1, jint i2, jint i3,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001944 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1945 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1946 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1947 jfloat f10) {
1948 EXPECT_EQ(i1, 1);
1949 EXPECT_EQ(i2, 2);
1950 EXPECT_EQ(i3, 3);
1951 EXPECT_EQ(i4, 4);
1952 EXPECT_EQ(i5, 5);
1953 EXPECT_EQ(i6, 6);
1954 EXPECT_EQ(i7, 7);
1955 EXPECT_EQ(i8, 8);
1956 EXPECT_EQ(i9, 9);
1957 EXPECT_EQ(i10, 10);
1958
Roland Levillainda4d79b2015-03-24 14:36:11 +00001959 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001960 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001961 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001962 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001963 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001964 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001965 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001966 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001967 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001968 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001969 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001970 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001971 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001972 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001973 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001974 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001975 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001976 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001977 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001978 EXPECT_EQ(i20, 20);
1979}
1980
Andreas Gampe6e498692014-08-18 16:43:12 -07001981void JniCompilerTest::StackArgsIntsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001982 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001983 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsIntsFirst));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001984
1985 jint i1 = 1;
1986 jint i2 = 2;
1987 jint i3 = 3;
1988 jint i4 = 4;
1989 jint i5 = 5;
1990 jint i6 = 6;
1991 jint i7 = 7;
1992 jint i8 = 8;
1993 jint i9 = 9;
1994 jint i10 = 10;
1995
Roland Levillainda4d79b2015-03-24 14:36:11 +00001996 jfloat f1 = bit_cast<jfloat, jint>(11);
1997 jfloat f2 = bit_cast<jfloat, jint>(12);
1998 jfloat f3 = bit_cast<jfloat, jint>(13);
1999 jfloat f4 = bit_cast<jfloat, jint>(14);
2000 jfloat f5 = bit_cast<jfloat, jint>(15);
2001 jfloat f6 = bit_cast<jfloat, jint>(16);
2002 jfloat f7 = bit_cast<jfloat, jint>(17);
2003 jfloat f8 = bit_cast<jfloat, jint>(18);
2004 jfloat f9 = bit_cast<jfloat, jint>(19);
2005 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002006
2007 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
2008 f3, f4, f5, f6, f7, f8, f9, f10);
2009}
2010
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002011JNI_TEST_CRITICAL(StackArgsIntsFirst)
Andreas Gampe6e498692014-08-18 16:43:12 -07002012
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07002013void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv*, jclass, jfloat f1, jfloat f2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002014 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
2015 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
2016 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
2017 jint i9, jint i10) {
2018 EXPECT_EQ(i1, 1);
2019 EXPECT_EQ(i2, 2);
2020 EXPECT_EQ(i3, 3);
2021 EXPECT_EQ(i4, 4);
2022 EXPECT_EQ(i5, 5);
2023 EXPECT_EQ(i6, 6);
2024 EXPECT_EQ(i7, 7);
2025 EXPECT_EQ(i8, 8);
2026 EXPECT_EQ(i9, 9);
2027 EXPECT_EQ(i10, 10);
2028
Roland Levillainda4d79b2015-03-24 14:36:11 +00002029 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002030 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002031 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002032 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002033 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002034 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002035 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002036 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002037 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002038 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002039 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002040 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002041 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002042 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002043 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002044 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002045 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002046 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002047 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002048 EXPECT_EQ(i20, 20);
2049}
2050
Andreas Gampe6e498692014-08-18 16:43:12 -07002051void JniCompilerTest::StackArgsFloatsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002052 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002053 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsFloatsFirst));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002054
2055 jint i1 = 1;
2056 jint i2 = 2;
2057 jint i3 = 3;
2058 jint i4 = 4;
2059 jint i5 = 5;
2060 jint i6 = 6;
2061 jint i7 = 7;
2062 jint i8 = 8;
2063 jint i9 = 9;
2064 jint i10 = 10;
2065
Roland Levillainda4d79b2015-03-24 14:36:11 +00002066 jfloat f1 = bit_cast<jfloat, jint>(11);
2067 jfloat f2 = bit_cast<jfloat, jint>(12);
2068 jfloat f3 = bit_cast<jfloat, jint>(13);
2069 jfloat f4 = bit_cast<jfloat, jint>(14);
2070 jfloat f5 = bit_cast<jfloat, jint>(15);
2071 jfloat f6 = bit_cast<jfloat, jint>(16);
2072 jfloat f7 = bit_cast<jfloat, jint>(17);
2073 jfloat f8 = bit_cast<jfloat, jint>(18);
2074 jfloat f9 = bit_cast<jfloat, jint>(19);
2075 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002076
2077 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
2078 i4, i5, i6, i7, i8, i9, i10);
2079}
2080
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002081JNI_TEST_CRITICAL(StackArgsFloatsFirst)
Andreas Gampe6e498692014-08-18 16:43:12 -07002082
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07002083void Java_MyClassNatives_stackArgsMixed(JNIEnv*, jclass, jint i1, jfloat f1, jint i2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002084 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
2085 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
2086 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
2087 EXPECT_EQ(i1, 1);
2088 EXPECT_EQ(i2, 2);
2089 EXPECT_EQ(i3, 3);
2090 EXPECT_EQ(i4, 4);
2091 EXPECT_EQ(i5, 5);
2092 EXPECT_EQ(i6, 6);
2093 EXPECT_EQ(i7, 7);
2094 EXPECT_EQ(i8, 8);
2095 EXPECT_EQ(i9, 9);
2096 EXPECT_EQ(i10, 10);
2097
Roland Levillainda4d79b2015-03-24 14:36:11 +00002098 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002099 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002100 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002101 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002102 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002103 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002104 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002105 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002106 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002107 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002108 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002109 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002110 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002111 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002112 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002113 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002114 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002115 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002116 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002117 EXPECT_EQ(i20, 20);
2118}
2119
Andreas Gampe6e498692014-08-18 16:43:12 -07002120void JniCompilerTest::StackArgsMixedImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002121 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002122 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsMixed));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002123
2124 jint i1 = 1;
2125 jint i2 = 2;
2126 jint i3 = 3;
2127 jint i4 = 4;
2128 jint i5 = 5;
2129 jint i6 = 6;
2130 jint i7 = 7;
2131 jint i8 = 8;
2132 jint i9 = 9;
2133 jint i10 = 10;
2134
Roland Levillainda4d79b2015-03-24 14:36:11 +00002135 jfloat f1 = bit_cast<jfloat, jint>(11);
2136 jfloat f2 = bit_cast<jfloat, jint>(12);
2137 jfloat f3 = bit_cast<jfloat, jint>(13);
2138 jfloat f4 = bit_cast<jfloat, jint>(14);
2139 jfloat f5 = bit_cast<jfloat, jint>(15);
2140 jfloat f6 = bit_cast<jfloat, jint>(16);
2141 jfloat f7 = bit_cast<jfloat, jint>(17);
2142 jfloat f8 = bit_cast<jfloat, jint>(18);
2143 jfloat f9 = bit_cast<jfloat, jint>(19);
2144 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002145
2146 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
2147 f7, i8, f8, i9, f9, i10, f10);
2148}
2149
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002150JNI_TEST_CRITICAL(StackArgsMixed)
Andreas Gampe6e498692014-08-18 16:43:12 -07002151
Lazar Trsicf652d602015-06-24 16:30:21 +02002152#if defined(__mips__) && defined(__LP64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
Pavle Batuta837e72a2016-03-16 11:31:46 +01002153// Function will fetch the last argument passed from caller that is now on top of the stack and
2154// return it as a 8B long. That way we can test if the caller has properly sign-extended the
2155// value when placing it on the stack.
2156__attribute__((naked))
2157jlong Java_MyClassNatives_getStackArgSignExtendedMips64(
2158 JNIEnv*, jclass, // Arguments passed from caller
2159 jint, jint, jint, jint, jint, jint, // through regs a0 to a7.
2160 jint) { // The last argument will be passed on the stack.
2161 __asm__(
2162 ".set noreorder\n\t" // Just return and store 8 bytes from the top of the stack
2163 "jr $ra\n\t" // in v0 (in branch delay slot). This should be the last
2164 "ld $v0, 0($sp)\n\t"); // argument. It is a 32-bit int, but it should be sign
2165 // extended and it occupies 64-bit location.
Lazar Trsicf652d602015-06-24 16:30:21 +02002166}
2167
2168void JniCompilerTest::StackArgsSignExtendedMips64Impl() {
Pavle Batuta837e72a2016-03-16 11:31:46 +01002169 uint64_t ret;
2170 SetUpForTest(true,
2171 "getStackArgSignExtendedMips64",
2172 "(IIIIIII)J",
2173 // Don't use wrapper because this is raw assembly function.
2174 reinterpret_cast<void*>(&Java_MyClassNatives_getStackArgSignExtendedMips64));
Lazar Trsicf652d602015-06-24 16:30:21 +02002175
Pavle Batuta837e72a2016-03-16 11:31:46 +01002176 // Mips64 ABI requires that arguments passed through stack be sign-extended 8B slots.
2177 // First 8 arguments are passed through registers.
2178 // Final argument's value is 7. When sign-extended, higher stack bits should be 0.
2179 ret = env_->CallStaticLongMethod(jklass_, jmethod_, 1, 2, 3, 4, 5, 6, 7);
2180 EXPECT_EQ(High32Bits(ret), static_cast<uint32_t>(0));
2181
2182 // Final argument's value is -8. When sign-extended, higher stack bits should be 0xffffffff.
2183 ret = env_->CallStaticLongMethod(jklass_, jmethod_, 1, 2, 3, 4, 5, 6, -8);
2184 EXPECT_EQ(High32Bits(ret), static_cast<uint32_t>(0xffffffff));
Lazar Trsicf652d602015-06-24 16:30:21 +02002185}
2186
Pavle Batuta837e72a2016-03-16 11:31:46 +01002187JNI_TEST(StackArgsSignExtendedMips64)
2188#endif
Lazar Trsicf652d602015-06-24 16:30:21 +02002189
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002190void Java_MyClassNatives_normalNative(JNIEnv*, jclass) {
2191 // Intentionally left empty.
2192}
2193
2194// Methods not annotated with anything are not considered "fast native"
2195// -- Check that the annotation lookup does not find it.
2196void JniCompilerTest::NormalNativeImpl() {
2197 SetUpForTest(/* direct */ true,
2198 "normalNative",
2199 "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002200 CURRENT_JNI_WRAPPER(Java_MyClassNatives_normalNative));
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002201
Andreas Gampe13b27842016-11-07 16:48:23 -08002202 ArtMethod* method = jni::DecodeArtMethod(jmethod_);
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002203 ASSERT_TRUE(method != nullptr);
2204
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002205 EXPECT_FALSE(method->IsAnnotatedWithCriticalNative());
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002206 EXPECT_FALSE(method->IsAnnotatedWithFastNative());
2207}
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002208
2209// TODO: just rename the java functions to the standard convention and remove duplicated tests
2210JNI_TEST_NORMAL_ONLY(NormalNative)
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002211
2212// Methods annotated with @FastNative are considered "fast native"
2213// -- Check that the annotation lookup succeeds.
2214void Java_MyClassNatives_fastNative(JNIEnv*, jclass) {
2215 // Intentionally left empty.
2216}
2217
2218void JniCompilerTest::FastNativeImpl() {
2219 SetUpForTest(/* direct */ true,
2220 "fastNative",
2221 "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002222 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fastNative));
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002223
Andreas Gampe13b27842016-11-07 16:48:23 -08002224 ArtMethod* method = jni::DecodeArtMethod(jmethod_);
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002225 ASSERT_TRUE(method != nullptr);
2226
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002227 EXPECT_FALSE(method->IsAnnotatedWithCriticalNative());
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002228 EXPECT_TRUE(method->IsAnnotatedWithFastNative());
2229}
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002230
2231// TODO: just rename the java functions to the standard convention and remove duplicated tests
2232JNI_TEST_NORMAL_ONLY(FastNative)
2233
2234int gJava_myClassNatives_criticalNative_calls[kJniKindCount] = {};
2235// Methods annotated with @CriticalNative are considered "critical native"
2236// -- Check that the annotation lookup succeeds.
2237void Java_MyClassNatives_criticalNative() {
2238 gJava_myClassNatives_criticalNative_calls[gCurrentJni]++;
2239}
2240
2241void JniCompilerTest::CriticalNativeImpl() {
2242 SetUpForTest(/* direct */ true,
2243 // Important: Don't change the "current jni" yet to avoid a method name suffix.
2244 "criticalNative",
2245 "()V",
2246 // TODO: Use CURRENT_JNI_WRAPPER instead which is more generic.
2247 reinterpret_cast<void*>(&Java_MyClassNatives_criticalNative));
2248
2249 // TODO: remove this manual updating of the current JNI. Merge with the other tests.
2250 UpdateCurrentJni(JniKind::kCritical);
2251 ASSERT_TRUE(IsCurrentJniCritical());
2252
Andreas Gampe13b27842016-11-07 16:48:23 -08002253 ArtMethod* method = jni::DecodeArtMethod(jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002254 ASSERT_TRUE(method != nullptr);
2255
2256 EXPECT_TRUE(method->IsAnnotatedWithCriticalNative());
2257 EXPECT_FALSE(method->IsAnnotatedWithFastNative());
2258
2259 EXPECT_EQ(0, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2260 env_->CallStaticVoidMethod(jklass_, jmethod_);
2261 EXPECT_EQ(1, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2262
2263 gJava_myClassNatives_criticalNative_calls[gCurrentJni] = 0;
2264}
2265
2266// TODO: just rename the java functions to the standard convention and remove duplicated tests
2267JNI_TEST_NORMAL_ONLY(CriticalNative)
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002268
Ian Rogersb033c752011-07-20 12:22:35 -07002269} // namespace art