blob: b692c6d9ad65afce1c2e6695eaeb208d701c8cc9 [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Ian Rogersb033c752011-07-20 12:22:35 -070016
Ian Rogers700a4022014-05-19 16:49:03 -070017#include <memory>
Igor Murashkin367f3dd2016-09-01 17:00:24 -070018#include <type_traits>
Ian Rogers700a4022014-05-19 16:49:03 -070019
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010020#include <math.h>
21
Mathieu Chartiere401d142015-04-22 13:56:20 -070022#include "art_method-inl.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070023#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080024#include "common_compiler_test.h"
Igor Murashkin367f3dd2016-09-01 17:00:24 -070025#include "compiler.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070026#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070027#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070028#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070029#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070030#include "mem_map.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070031#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080032#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080033#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070034#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080035#include "mirror/stack_trace_element.h"
Dimitry Ivanov5edb0632016-04-29 11:14:25 -070036#include "nativeloader/native_loader.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070037#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070038#include "ScopedLocalRef.h"
39#include "scoped_thread_state_change.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070040#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070041
Elliott Hughesb264f082012-04-06 17:10:10 -070042extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080043 return count + 1;
44}
45
Elliott Hughesb264f082012-04-06 17:10:10 -070046extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080047 return count + 1;
48}
49
Ian Rogersb033c752011-07-20 12:22:35 -070050namespace art {
51
Igor Murashkin367f3dd2016-09-01 17:00:24 -070052enum class JniKind {
53 kNormal = Compiler::kNone, // Regular kind of un-annotated natives.
54 kFast = Compiler::kFastNative, // Native method annotated with @FastNative.
55 kCritical = Compiler::kCriticalNative, // Native method annotated with @CriticalNative.
56 kCount = Compiler::kCriticalNative + 1 // How many different types of JNIs we can have.
57};
58
59// Used to initialize array sizes that want to have different state per current jni.
60static constexpr size_t kJniKindCount = static_cast<size_t>(JniKind::kCount);
61// Do not use directly, use the helpers instead.
62uint32_t gCurrentJni = static_cast<uint32_t>(JniKind::kNormal);
63
64// Is the current native method under test @CriticalNative?
65static bool IsCurrentJniCritical() {
66 return gCurrentJni == static_cast<uint32_t>(JniKind::kCritical);
67}
68
69// Is the current native method a plain-old non-annotated native?
70static bool IsCurrentJniNormal() {
71 return gCurrentJni == static_cast<uint32_t>(JniKind::kNormal);
72}
73
74// Signifify that a different kind of JNI is about to be tested.
75static void UpdateCurrentJni(JniKind kind) {
76 gCurrentJni = static_cast<uint32_t>(kind);
77}
78
79// (Match the name suffixes of native methods in MyClassNatives.java)
80static std::string CurrentJniStringSuffix() {
81 switch (gCurrentJni) {
82 case static_cast<uint32_t>(JniKind::kNormal): {
83 return "";
84 }
85 case static_cast<uint32_t>(JniKind::kFast): {
86 return "_Fast";
87 }
88 case static_cast<uint32_t>(JniKind::kCritical): {
89 return "_Critical";
90 }
91 default:
92 LOG(FATAL) << "Invalid current JNI value: " << gCurrentJni;
93 UNREACHABLE();
94 }
95}
96
97// Dummy values passed to our JNI handlers when we enter @CriticalNative.
98// Normally @CriticalNative calling convention strips out the "JNIEnv*, jclass" parameters.
99// However to avoid duplicating every single test method we have a templated handler
100// that inserts dummy parameters (0,1) to make it compatible with a regular JNI handler.
101static JNIEnv* const kCriticalDummyJniEnv = reinterpret_cast<JNIEnv*>(0xDEADFEAD);
102static jclass const kCriticalDummyJniClass = reinterpret_cast<jclass>(0xBEAFBEEF);
103
104// Type trait. Returns true if "T" is the same type as one of the types in Args...
105//
106// Logically equal to OR(std::same_type<T, U> for all U in Args).
107template <typename T, typename ... Args>
108struct is_any_of;
109
110template <typename T, typename U, typename ... Args>
111struct is_any_of<T, U, Args ...> {
112 using value_type = bool;
113 static constexpr const bool value = std::is_same<T, U>::value || is_any_of<T, Args ...>::value;
114};
115
116template <typename T, typename U>
117struct is_any_of<T, U> {
118 using value_type = bool;
119 static constexpr const bool value = std::is_same<T, U>::value;
120};
121
122// Type traits for JNI types.
123template <typename T>
124struct jni_type_traits {
125 // True if type T ends up holding an object reference. False otherwise.
126 // (Non-JNI types will also be false).
127 static constexpr const bool is_ref =
128 is_any_of<T, jclass, jobject, jstring, jobjectArray, jintArray,
129 jcharArray, jfloatArray, jshortArray, jdoubleArray, jlongArray>::value;
130};
131
132template <typename ... Args>
133struct count_refs_helper {
134 using value_type = size_t;
135 static constexpr const size_t value = 0;
136};
137
138template <typename Arg, typename ... Args>
139struct count_refs_helper<Arg, Args ...> {
140 using value_type = size_t;
141 static constexpr size_t value =
142 (jni_type_traits<Arg>::is_ref ? 1 : 0) + count_refs_helper<Args ...>::value;
143};
144
145template <typename T, T fn>
146struct count_refs_fn_helper;
147
148template <typename R, typename ... Args, R fn(Args...)>
149struct count_refs_fn_helper<R(Args...), fn> : public count_refs_helper<Args...> {};
150
151// Given a function type 'T' figure out how many of the parameter types are a reference.
152// -- The implicit jclass and thisObject also count as 1 reference.
153//
154// Fields:
155// * value - the result counting # of refs
156// * value_type - the type of value (size_t)
157template <typename T, T fn>
158struct count_refs : public count_refs_fn_helper<T, fn> {};
159
160// Base case: No parameters = 0 refs.
161size_t count_nonnull_refs_helper() {
162 return 0;
163}
164
165// SFINAE for ref types. 1 if non-null, 0 otherwise.
166template <typename T>
167size_t count_nonnull_refs_single_helper(T arg,
168 typename std::enable_if<jni_type_traits<T>::is_ref>::type*
169 = nullptr) {
170 return ((arg == NULL) ? 0 : 1);
171}
172
173// SFINAE for non-ref-types. Always 0.
174template <typename T>
175size_t count_nonnull_refs_single_helper(T arg ATTRIBUTE_UNUSED,
176 typename std::enable_if<!jni_type_traits<T>::is_ref>::type*
177 = nullptr) {
178 return 0;
179}
180
181// Recursive case.
182template <typename T, typename ... Args>
183size_t count_nonnull_refs_helper(T arg, Args ... args) {
184 return count_nonnull_refs_single_helper(arg) + count_nonnull_refs_helper(args...);
185}
186
187// Given any list of parameters, check how many object refs there are and only count
188// them if their runtime value is non-null.
189//
190// For example given (jobject, jint, jclass) we can get (2) if both #0/#2 are non-null,
191// (1) if either #0/#2 are null but not both, and (0) if all parameters are null.
192// Primitive parameters (including JNIEnv*, if present) are ignored.
193template <typename ... Args>
194size_t count_nonnull_refs(Args ... args) {
195 return count_nonnull_refs_helper(args...);
196}
197
198template <typename T, T fn>
199struct remove_extra_parameters_helper;
200
201template <typename R, typename Arg1, typename Arg2, typename ... Args, R fn(Arg1, Arg2, Args...)>
202struct remove_extra_parameters_helper<R(Arg1, Arg2, Args...), fn> {
203 // Note: Do not use Args&& here to maintain C-style parameter types.
204 static R apply(Args... args) {
205 JNIEnv* env = kCriticalDummyJniEnv;
206 jclass kls = kCriticalDummyJniClass;
207 return fn(env, kls, args...);
208 }
209};
210
211// Given a function 'fn' create a function 'apply' which will omit the JNIEnv/jklass parameters
212//
213// i.e. if fn(JNIEnv*,jklass,a,b,c,d,e...) then apply(a,b,c,d,e,...)
214template <typename T, T fn>
215struct jni_remove_extra_parameters : public remove_extra_parameters_helper<T, fn> {};
216
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -0800217class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -0700218 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700219 void SetUp() OVERRIDE {
220 CommonCompilerTest::SetUp();
221 check_generic_jni_ = false;
222 }
223
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700224 void TearDown() OVERRIDE {
225 android::ResetNativeLoader();
226 CommonCompilerTest::TearDown();
227 }
228
Andreas Gampe6e498692014-08-18 16:43:12 -0700229 void SetCheckGenericJni(bool generic) {
230 check_generic_jni_ = generic;
231 }
232
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700233 private:
234 void CompileForTest(jobject class_loader,
235 bool direct,
236 const char* method_name,
237 const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700238 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700239 StackHandleScope<1> hs(soa.Self());
240 Handle<mirror::ClassLoader> loader(
241 hs.NewHandle(soa.Decode<mirror::ClassLoader*>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -0700242 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -0800243 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700244 const auto pointer_size = class_linker_->GetImagePointerSize();
245 ArtMethod* method = direct ? c->FindDirectMethod(method_name, method_sig, pointer_size) :
246 c->FindVirtualMethod(method_name, method_sig, pointer_size);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700247 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Andreas Gampe6e498692014-08-18 16:43:12 -0700248 if (check_generic_jni_) {
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700249 method->SetEntryPointFromQuickCompiledCode(class_linker_->GetRuntimeQuickGenericJniStub());
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100250 } else {
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700251 const void* code = method->GetEntryPointFromQuickCompiledCode();
252 if (code == nullptr || class_linker_->IsQuickGenericJniStub(code)) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100253 CompileMethod(method);
254 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
255 << method_name << " " << method_sig;
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100256 }
Brian Carlstrom25c33252011-09-18 15:58:35 -0700257 }
Brian Carlstrom25c33252011-09-18 15:58:35 -0700258 }
259
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700260 protected:
261 void CompileForTestWithCurrentJni(jobject class_loader,
262 bool direct,
263 const char* method_name_orig,
264 const char* method_sig) {
265 // Append the JNI kind to the method name, so that we automatically get the
266 // fast or critical versions of the same method.
267 std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
268 const char* method_name = method_name_str.c_str();
269
270 CompileForTest(class_loader, direct, method_name, method_sig);
271 }
272
273 void SetUpForTest(bool direct,
274 const char* method_name_orig,
275 const char* method_sig,
Andreas Gampe6e498692014-08-18 16:43:12 -0700276 void* native_fnptr) {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700277 // Append the JNI kind to the method name, so that we automatically get the
278 // fast or critical versions of the same method.
279 std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
280 const char* method_name = method_name_str.c_str();
281
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700282 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -0700283 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700284 {
285 ScopedObjectAccess soa(Thread::Current());
286 class_loader_ = LoadDex("MyClassNatives");
287 }
Andreas Gampe6e498692014-08-18 16:43:12 -0700288 CompileForTest(class_loader_, direct, method_name, method_sig);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700289 // Start runtime.
290 Thread::Current()->TransitionFromSuspendedToRunnable();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700291 android::InitializeNativeLoader();
Dimitry Ivanovc544f342016-05-09 16:26:13 -0700292 bool started = runtime_->Start();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700293 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700294 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700295 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700296 env_ = Thread::Current()->GetJniEnv();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700297 library_search_path_ = env_->NewStringUTF("");
Elliott Hughesb264f082012-04-06 17:10:10 -0700298 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700299 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700300
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700301 if (direct) {
302 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
303 } else {
304 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
305 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700306 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700307
Andreas Gampecf4035a2014-05-28 22:43:01 -0700308 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700309 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700310 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
311 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700312 } else {
313 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700314 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700315
316 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
317 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700318 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700319 }
320
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700321 public:
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700322 // Available as statics so our JNI handlers can access these.
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700323 static jclass jklass_;
324 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700325 static jobject class_loader_;
326
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700327 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700328 // We have to list the methods here so we can share them between default and generic JNI.
329 void CompileAndRunNoArgMethodImpl();
330 void CompileAndRunIntMethodThroughStubImpl();
331 void CompileAndRunStaticIntMethodThroughStubImpl();
332 void CompileAndRunIntMethodImpl();
333 void CompileAndRunIntIntMethodImpl();
334 void CompileAndRunLongLongMethodImpl();
335 void CompileAndRunDoubleDoubleMethodImpl();
336 void CompileAndRun_fooJJ_synchronizedImpl();
337 void CompileAndRunIntObjectObjectMethodImpl();
338 void CompileAndRunStaticIntIntMethodImpl();
339 void CompileAndRunStaticDoubleDoubleMethodImpl();
340 void RunStaticLogDoubleMethodImpl();
341 void RunStaticLogFloatMethodImpl();
342 void RunStaticReturnTrueImpl();
343 void RunStaticReturnFalseImpl();
344 void RunGenericStaticReturnIntImpl();
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700345 void RunGenericStaticReturnDoubleImpl();
346 void RunGenericStaticReturnLongImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700347 void CompileAndRunStaticIntObjectObjectMethodImpl();
348 void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl();
349 void ExceptionHandlingImpl();
350 void NativeStackTraceElementImpl();
351 void ReturnGlobalRefImpl();
352 void LocalReferenceTableClearingTestImpl();
353 void JavaLangSystemArrayCopyImpl();
354 void CompareAndSwapIntImpl();
355 void GetTextImpl();
356 void GetSinkPropertiesNativeImpl();
357 void UpcallReturnTypeChecking_InstanceImpl();
358 void UpcallReturnTypeChecking_StaticImpl();
359 void UpcallArgumentTypeChecking_InstanceImpl();
360 void UpcallArgumentTypeChecking_StaticImpl();
361 void CompileAndRunFloatFloatMethodImpl();
362 void CheckParameterAlignImpl();
363 void MaxParamNumberImpl();
364 void WithoutImplementationImpl();
Andreas Gampe48ee3562015-04-10 19:57:29 -0700365 void WithoutImplementationRefReturnImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700366 void StackArgsIntsFirstImpl();
367 void StackArgsFloatsFirstImpl();
368 void StackArgsMixedImpl();
Lazar Trsicf652d602015-06-24 16:30:21 +0200369 void StackArgsSignExtendedMips64Impl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700370
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700371 void NormalNativeImpl();
372 void FastNativeImpl();
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700373 void CriticalNativeImpl();
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700374
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700375 JNIEnv* env_;
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700376 jstring library_search_path_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700377 jmethodID jmethod_;
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700378
379 private:
Andreas Gampe6e498692014-08-18 16:43:12 -0700380 bool check_generic_jni_;
Ian Rogersb033c752011-07-20 12:22:35 -0700381};
382
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700383jclass JniCompilerTest::jklass_;
384jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700385jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700386
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700387// Test the normal compiler and normal generic JNI only.
388// The following features are unsupported in @FastNative:
389// 1) JNI stubs (lookup via dlsym) when methods aren't explicitly registered
390// 2) Returning objects from the JNI function
391// 3) synchronized keyword
392// -- TODO: We can support (1) if we remove the mutator lock assert during stub lookup.
393# define JNI_TEST_NORMAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700394 TEST_F(JniCompilerTest, TestName ## NormalCompiler) { \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700395 SCOPED_TRACE("Normal JNI with compiler"); \
396 gCurrentJni = static_cast<uint32_t>(JniKind::kNormal); \
Andreas Gampe6e498692014-08-18 16:43:12 -0700397 TestName ## Impl(); \
398 } \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700399 TEST_F(JniCompilerTest, TestName ## NormalGeneric) { \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700400 SCOPED_TRACE("Normal JNI with generic"); \
401 gCurrentJni = static_cast<uint32_t>(JniKind::kNormal); \
Andreas Gampe6e498692014-08-18 16:43:12 -0700402 TEST_DISABLED_FOR_MIPS(); \
403 SetCheckGenericJni(true); \
404 TestName ## Impl(); \
405 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700406
Igor Murashkin06a04e02016-09-13 15:57:37 -0700407// Test (normal, @FastNative) x (compiler, generic).
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700408#define JNI_TEST(TestName) \
409 JNI_TEST_NORMAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700410 TEST_F(JniCompilerTest, TestName ## FastCompiler) { \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700411 SCOPED_TRACE("@FastNative JNI with compiler"); \
412 gCurrentJni = static_cast<uint32_t>(JniKind::kFast); \
413 TestName ## Impl(); \
414 } \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700415 \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700416 TEST_F(JniCompilerTest, TestName ## FastGeneric) { \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700417 SCOPED_TRACE("@FastNative JNI with generic"); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700418 gCurrentJni = static_cast<uint32_t>(JniKind::kFast); \
419 TEST_DISABLED_FOR_MIPS(); \
420 SetCheckGenericJni(true); \
421 TestName ## Impl(); \
422 }
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700423
Igor Murashkin06a04e02016-09-13 15:57:37 -0700424// Test (@CriticalNative) x (compiler, generic) only.
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700425#define JNI_TEST_CRITICAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700426 TEST_F(JniCompilerTest, TestName ## CriticalCompiler) { \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700427 SCOPED_TRACE("@CriticalNative JNI with compiler"); \
428 gCurrentJni = static_cast<uint32_t>(JniKind::kCritical); \
429 TestName ## Impl(); \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700430 } \
431 TEST_F(JniCompilerTest, TestName ## CriticalGeneric) { \
432 SCOPED_TRACE("@CriticalNative JNI with generic"); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700433 gCurrentJni = static_cast<uint32_t>(JniKind::kCritical); \
434 TestName ## Impl(); \
435 }
Igor Murashkin06a04e02016-09-13 15:57:37 -0700436
437// Test everything: (normal, @FastNative, @CriticalNative) x (compiler, generic).
438#define JNI_TEST_CRITICAL(TestName) \
439 JNI_TEST(TestName) \
440 JNI_TEST_CRITICAL_ONLY(TestName) \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700441
442static void expectValidThreadState() {
443 // Normal JNI always transitions to "Native". Other JNIs stay in the "Runnable" state.
444 if (IsCurrentJniNormal()) {
445 EXPECT_EQ(kNative, Thread::Current()->GetState());
446 } else {
447 EXPECT_EQ(kRunnable, Thread::Current()->GetState());
448 }
449}
450
451#define EXPECT_THREAD_STATE_FOR_CURRENT_JNI() expectValidThreadState()
452
453static void expectValidMutatorLockHeld() {
454 if (IsCurrentJniNormal()) {
455 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
456 } else {
457 Locks::mutator_lock_->AssertSharedHeld(Thread::Current());
458 }
459}
460
461#define EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI() expectValidMutatorLockHeld()
462
463static void expectValidJniEnvAndObject(JNIEnv* env, jobject thisObj) {
464 if (!IsCurrentJniCritical()) {
465 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
466 ASSERT_TRUE(thisObj != nullptr);
467 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
468 } else {
469 LOG(FATAL) << "Objects are not supported for @CriticalNative, why is this being tested?";
470 UNREACHABLE();
471 }
472}
473
474// Validates the JNIEnv to be the same as the current thread's JNIEnv, and makes sure
475// that the object here is an instance of the class we registered the method with.
476//
477// Hard-fails if this somehow gets invoked for @CriticalNative since objects are unsupported.
478#define EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj) \
479 expectValidJniEnvAndObject(env, thisObj)
480
481static void expectValidJniEnvAndClass(JNIEnv* env, jclass kls) {
482 if (!IsCurrentJniCritical()) {
483 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
484 ASSERT_TRUE(kls != nullptr);
485 EXPECT_TRUE(env->IsSameObject(static_cast<jobject>(JniCompilerTest::jklass_),
486 static_cast<jobject>(kls)));
487 } else {
488 // This is pretty much vacuously true but catch any testing setup mistakes.
489 EXPECT_EQ(env, kCriticalDummyJniEnv);
490 EXPECT_EQ(kls, kCriticalDummyJniClass);
491 }
492}
493
494// Validates the JNIEnv is the same as the current thread's JNIenv, and makes sure
495// that the jclass we got in the JNI handler is the same one as the class the method was looked
496// up for.
497//
498// (Checks are skipped for @CriticalNative since the two values are dummy).
499#define EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls) expectValidJniEnvAndClass(env, kls)
500
501// Temporarily disable the EXPECT_NUM_STACK_REFERENCES check (for a single test).
502struct ScopedDisableCheckNumStackReferences {
503 ScopedDisableCheckNumStackReferences() {
Igor Murashkin06a04e02016-09-13 15:57:37 -0700504 CHECK(sCheckNumStackReferences); // No nested support.
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700505 sCheckNumStackReferences = false;
506 }
507
508 ~ScopedDisableCheckNumStackReferences() {
509 sCheckNumStackReferences = true;
510 }
511
512 static bool sCheckNumStackReferences;
513};
514
515bool ScopedDisableCheckNumStackReferences::sCheckNumStackReferences = true;
516
517static void expectNumStackReferences(size_t val1, size_t val2) {
518 // In rare cases when JNI functions call themselves recursively,
519 // disable this test because it will have a false negative.
520 if (!IsCurrentJniCritical() && ScopedDisableCheckNumStackReferences::sCheckNumStackReferences) {
521 /* @CriticalNative doesn't build a HandleScope, so this test is meaningless then. */
522 ScopedObjectAccess soa(Thread::Current());
523
524 size_t actual_num = Thread::Current()->NumStackReferences();
525 // XX: Not too sure what's going on.
526 // Sometimes null references get placed and sometimes they don't?
527 EXPECT_TRUE(val1 == actual_num || val2 == actual_num)
528 << "expected either " << val1 << " or " << val2
529 << " number of stack references, but got: " << actual_num;
530 }
531}
532
533#define EXPECT_NUM_STACK_REFERENCES(val1, val2) expectNumStackReferences(val1, val2)
534
535template <typename T, T fn>
536struct make_jni_test_decorator;
537
538// Decorator for "static" JNI callbacks.
539template <typename R, typename ... Args, R fn(JNIEnv*, jclass, Args...)>
540struct make_jni_test_decorator<R(JNIEnv*, jclass kls, Args...), fn> {
541 static R apply(JNIEnv* env, jclass kls, Args ... args) {
542 EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
543 EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
544 EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls);
545 // All incoming parameters + the jclass get put into the transition's StackHandleScope.
546 EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(kls, args...),
547 (count_refs_helper<jclass, Args...>::value));
548
549 return fn(env, kls, args...);
550 }
551};
552
553// Decorator for instance JNI callbacks.
554template <typename R, typename ... Args, R fn(JNIEnv*, jobject, Args...)>
555struct make_jni_test_decorator<R(JNIEnv*, jobject, Args...), fn> {
556 static R apply(JNIEnv* env, jobject thisObj, Args ... args) {
557 EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
558 EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
559 EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj);
560 // All incoming parameters + the implicit 'this' get put into the transition's StackHandleScope.
561 EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(thisObj, args...),
562 (count_refs_helper<jobject, Args...>::value));
563
564 return fn(env, thisObj, args...);
565 }
566};
567
568// Decorate the regular JNI callee with the extra gtest checks.
569// This way we can have common test logic for everything generic like checking if a lock is held,
570// checking handle scope state, etc.
571#define MAKE_JNI_TEST_DECORATOR(fn) make_jni_test_decorator<decltype(fn), (fn)>::apply
572
573// Convert function f(JNIEnv*,jclass,a,b,c,d...) into f2(a,b,c,d...)
574// -- This way we don't have to write out each implementation twice for @CriticalNative.
575#define JNI_CRITICAL_WRAPPER(func) jni_remove_extra_parameters<decltype(func), (func)>::apply
576// Get a function pointer whose calling convention either matches a regular native
577// or a critical native depending on which kind of jni is currently under test.
578// -- This also has the benefit of genering a compile time error if the 'func' doesn't properly
579// have JNIEnv and jclass parameters first.
580#define CURRENT_JNI_WRAPPER(func) \
581 (IsCurrentJniCritical() \
582 ? reinterpret_cast<void*>(&JNI_CRITICAL_WRAPPER(MAKE_JNI_TEST_DECORATOR(func))) \
583 : reinterpret_cast<void*>(&MAKE_JNI_TEST_DECORATOR(func)))
584
585// Do the opposite of the above. Do *not* wrap the function, instead just cast it to a void*.
586// Only for "TEST_JNI_NORMAL_ONLY" configs, and it inserts a test assert to ensure this is the case.
587#define NORMAL_JNI_ONLY_NOWRAP(func) \
588 ({ ASSERT_TRUE(IsCurrentJniNormal()); reinterpret_cast<void*>(&(func)); })
589// Same as above, but with nullptr. When we want to test the stub functionality.
590#define NORMAL_JNI_ONLY_NULLPTR \
591 ({ ASSERT_TRUE(IsCurrentJniNormal()); nullptr; })
592
593
594int gJava_MyClassNatives_foo_calls[kJniKindCount] = {};
595void Java_MyClassNatives_foo(JNIEnv*, jobject) {
596 gJava_MyClassNatives_foo_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700597}
598
Andreas Gampe6e498692014-08-18 16:43:12 -0700599void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700600 SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700601
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700602 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700603 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700604 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700605 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700606 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700607
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700608 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700609}
610
Andreas Gampe6e498692014-08-18 16:43:12 -0700611JNI_TEST(CompileAndRunNoArgMethod)
612
613void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700614 SetUpForTest(false, "bar", "(I)I", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700615 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700616
Shih-wei Liao31384c52011-09-06 15:27:45 -0700617 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800618 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700619 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700620 << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700621
622 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
623 EXPECT_EQ(25, result);
624}
625
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700626// TODO: Support @FastNative and @CriticalNative through stubs.
627JNI_TEST_NORMAL_ONLY(CompileAndRunIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700628
629void JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700630 SetUpForTest(true, "sbar", "(I)I", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700631 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800632
633 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800634 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700635 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700636 << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800637
638 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
639 EXPECT_EQ(43, result);
640}
641
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700642// TODO: Support @FastNative and @CriticalNative through stubs.
643JNI_TEST_NORMAL_ONLY(CompileAndRunStaticIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700644
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700645int gJava_MyClassNatives_fooI_calls[kJniKindCount] = {};
646jint Java_MyClassNatives_fooI(JNIEnv*, jobject, jint x) {
647 gJava_MyClassNatives_fooI_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700648 return x;
649}
650
Andreas Gampe6e498692014-08-18 16:43:12 -0700651void JniCompilerTest::CompileAndRunIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700652 SetUpForTest(false, "fooI", "(I)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700653 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700654
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700655 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700656 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
657 EXPECT_EQ(42, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700658 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700659 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
660 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700661 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700662
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700663 gJava_MyClassNatives_fooI_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700664}
665
Andreas Gampe6e498692014-08-18 16:43:12 -0700666JNI_TEST(CompileAndRunIntMethod)
667
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700668int gJava_MyClassNatives_fooII_calls[kJniKindCount] = {};
669jint Java_MyClassNatives_fooII(JNIEnv*, jobject, jint x, jint y) {
670 gJava_MyClassNatives_fooII_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700671 return x - y; // non-commutative operator
672}
673
Andreas Gampe6e498692014-08-18 16:43:12 -0700674void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700675 SetUpForTest(false, "fooII", "(II)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700676 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700677
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700678 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700679 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
680 EXPECT_EQ(99 - 10, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700681 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700682 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
683 0xCAFED00D);
684 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700685 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700686
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700687 gJava_MyClassNatives_fooII_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700688}
689
Andreas Gampe6e498692014-08-18 16:43:12 -0700690JNI_TEST(CompileAndRunIntIntMethod)
691
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700692int gJava_MyClassNatives_fooJJ_calls[kJniKindCount] = {};
693jlong Java_MyClassNatives_fooJJ(JNIEnv*, jobject, jlong x, jlong y) {
694 gJava_MyClassNatives_fooJJ_calls[gCurrentJni]++;
Ian Rogers9b269d22011-09-04 14:06:05 -0700695 return x - y; // non-commutative operator
696}
697
Andreas Gampe6e498692014-08-18 16:43:12 -0700698void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700699 SetUpForTest(false, "fooJJ", "(JJ)J",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700700 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700701
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700702 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Ian Rogers0f678472014-03-10 16:18:37 -0700703 jlong a = INT64_C(0x1234567890ABCDEF);
704 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700705 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
706 EXPECT_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700707 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Ian Rogers9b269d22011-09-04 14:06:05 -0700708 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
709 EXPECT_EQ(b - a, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700710 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700711
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700712 gJava_MyClassNatives_fooJJ_calls[gCurrentJni] = 0;
Ian Rogers9b269d22011-09-04 14:06:05 -0700713}
714
Andreas Gampe6e498692014-08-18 16:43:12 -0700715JNI_TEST(CompileAndRunLongLongMethod)
716
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700717int gJava_MyClassNatives_fooDD_calls[kJniKindCount] = {};
718jdouble Java_MyClassNatives_fooDD(JNIEnv*, jobject, jdouble x, jdouble y) {
719 gJava_MyClassNatives_fooDD_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700720 return x - y; // non-commutative operator
721}
722
Andreas Gampe6e498692014-08-18 16:43:12 -0700723void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700724 SetUpForTest(false, "fooDD", "(DD)D",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700725 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700726
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700727 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700728 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
729 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700730 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700731 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700732 jdouble a = 3.14159265358979323846;
733 jdouble b = 0.69314718055994530942;
734 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700735 EXPECT_DOUBLE_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700736 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700737
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700738 gJava_MyClassNatives_fooDD_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700739}
740
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700741int gJava_MyClassNatives_fooJJ_synchronized_calls[kJniKindCount] = {};
742jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv*, jobject, jlong x, jlong y) {
743 gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]++;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700744 return x | y;
745}
746
Andreas Gampe6e498692014-08-18 16:43:12 -0700747void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700748 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700749 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ_synchronized));
Elliott Hughes3e778f72012-05-21 15:29:52 -0700750
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700751 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700752 jlong a = 0x1000000020000000ULL;
753 jlong b = 0x00ff000000aa0000ULL;
754 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
755 EXPECT_EQ(a | b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700756 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700757
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700758 gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni] = 0;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700759}
760
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700761JNI_TEST_NORMAL_ONLY(CompileAndRun_fooJJ_synchronized)
Andreas Gampe6e498692014-08-18 16:43:12 -0700762
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700763int gJava_MyClassNatives_fooIOO_calls[kJniKindCount] = {};
764jobject Java_MyClassNatives_fooIOO(JNIEnv*, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700765 jobject z) {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700766 gJava_MyClassNatives_fooIOO_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700767 switch (x) {
768 case 1:
769 return y;
770 case 2:
771 return z;
772 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700773 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700774 }
775}
776
Andreas Gampe6e498692014-08-18 16:43:12 -0700777void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700778 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700779 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700780 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700781
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700782 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700783 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700784 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700785 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700786
Andreas Gampecf4035a2014-05-28 22:43:01 -0700787 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700788 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700789 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700790 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
791 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700792 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700793 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700794 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700795 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700796
Andreas Gampecf4035a2014-05-28 22:43:01 -0700797 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700798 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700799 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700800 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700801 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700802 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700803 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
804 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700805 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700806
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700807 gJava_MyClassNatives_fooIOO_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700808}
809
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700810// TODO: Maybe. @FastNative support for returning Objects?
811JNI_TEST_NORMAL_ONLY(CompileAndRunIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700812
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700813int gJava_MyClassNatives_fooSII_calls[kJniKindCount] = {};
814jint Java_MyClassNatives_fooSII(JNIEnv* env ATTRIBUTE_UNUSED,
815 jclass klass ATTRIBUTE_UNUSED,
816 jint x,
817 jint y) {
818 gJava_MyClassNatives_fooSII_calls[gCurrentJni]++;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700819 return x + y;
820}
821
Andreas Gampe6e498692014-08-18 16:43:12 -0700822void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700823 SetUpForTest(true, "fooSII", "(II)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700824 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700825
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700826 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700827 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
828 EXPECT_EQ(50, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700829 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700830
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700831 gJava_MyClassNatives_fooSII_calls[gCurrentJni] = 0;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700832}
833
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700834JNI_TEST_CRITICAL(CompileAndRunStaticIntIntMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700835
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700836int gJava_MyClassNatives_fooSDD_calls[kJniKindCount] = {};
837jdouble Java_MyClassNatives_fooSDD(JNIEnv* env ATTRIBUTE_UNUSED,
838 jclass klass ATTRIBUTE_UNUSED,
839 jdouble x,
840 jdouble y) {
841 gJava_MyClassNatives_fooSDD_calls[gCurrentJni]++;
Ian Rogers7a99c112011-09-07 12:48:27 -0700842 return x - y; // non-commutative operator
843}
844
Andreas Gampe6e498692014-08-18 16:43:12 -0700845void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700846 SetUpForTest(true, "fooSDD", "(DD)D",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700847 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700848
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700849 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Ian Rogers7a99c112011-09-07 12:48:27 -0700850 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700851 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700852 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Ian Rogers7a99c112011-09-07 12:48:27 -0700853 jdouble a = 3.14159265358979323846;
854 jdouble b = 0.69314718055994530942;
855 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700856 EXPECT_DOUBLE_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700857 EXPECT_DOUBLE_EQ(2, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700858
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700859 gJava_MyClassNatives_fooSDD_calls[gCurrentJni] = 0;
Ian Rogers7a99c112011-09-07 12:48:27 -0700860}
861
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700862JNI_TEST_CRITICAL(CompileAndRunStaticDoubleDoubleMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700863
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100864// The x86 generic JNI code had a bug where it assumed a floating
865// point return value would be in xmm0. We use log, to somehow ensure
866// the compiler will use the floating point stack.
867
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700868jdouble Java_MyClassNatives_logD(JNIEnv*, jclass, jdouble x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100869 return log(x);
870}
871
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700872jdouble Java_MyClassNatives_logD_notNormal(JNIEnv*, jclass, jdouble x) {
873 EXPECT_DOUBLE_EQ(2.0, x);
874 return log(x);
875}
876
Andreas Gampe6e498692014-08-18 16:43:12 -0700877void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700878 void* jni_handler;
879 if (IsCurrentJniNormal()) {
880 // This test seems a bit special, don't use a JNI wrapper here.
881 jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logD);
882 } else {
883 jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logD_notNormal);
884 }
885 SetUpForTest(true, "logD", "(D)D", jni_handler);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100886
887 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700888 EXPECT_DOUBLE_EQ(log(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100889}
890
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700891JNI_TEST_CRITICAL(RunStaticLogDoubleMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700892
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700893jfloat Java_MyClassNatives_logF(JNIEnv*, jclass, jfloat x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100894 return logf(x);
895}
896
Andreas Gampe6e498692014-08-18 16:43:12 -0700897void JniCompilerTest::RunStaticLogFloatMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700898 void* jni_handler;
899 if (IsCurrentJniNormal()) {
900 // This test seems a bit special, don't use a JNI wrapper here.
901 jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logF);
902 } else {
903 jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logF);
904 }
905
906 SetUpForTest(true, "logF", "(F)F", jni_handler);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100907
908 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700909 EXPECT_FLOAT_EQ(logf(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100910}
911
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700912JNI_TEST_CRITICAL(RunStaticLogFloatMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700913
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700914jboolean Java_MyClassNatives_returnTrue(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100915 return JNI_TRUE;
916}
917
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700918jboolean Java_MyClassNatives_returnFalse(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100919 return JNI_FALSE;
920}
921
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700922jint Java_MyClassNatives_returnInt(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100923 return 42;
924}
925
Andreas Gampe6e498692014-08-18 16:43:12 -0700926void JniCompilerTest::RunStaticReturnTrueImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700927 SetUpForTest(true, "returnTrue", "()Z", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnTrue));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100928
929 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
930 EXPECT_TRUE(result);
931}
932
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700933JNI_TEST_CRITICAL(RunStaticReturnTrue)
Andreas Gampe6e498692014-08-18 16:43:12 -0700934
935void JniCompilerTest::RunStaticReturnFalseImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100936 SetUpForTest(true, "returnFalse", "()Z",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700937 CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnFalse));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100938
939 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
940 EXPECT_FALSE(result);
941}
942
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700943JNI_TEST_CRITICAL(RunStaticReturnFalse)
Andreas Gampe6e498692014-08-18 16:43:12 -0700944
945void JniCompilerTest::RunGenericStaticReturnIntImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700946 SetUpForTest(true, "returnInt", "()I", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnInt));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100947
948 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
949 EXPECT_EQ(42, result);
950}
951
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700952JNI_TEST_CRITICAL(RunGenericStaticReturnInt)
Andreas Gampe6e498692014-08-18 16:43:12 -0700953
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700954int gJava_MyClassNatives_returnDouble_calls[kJniKindCount] = {};
955jdouble Java_MyClassNatives_returnDouble(JNIEnv*, jclass) {
956 gJava_MyClassNatives_returnDouble_calls[gCurrentJni]++;
957 return 4.0;
958}
959
960void JniCompilerTest::RunGenericStaticReturnDoubleImpl() {
961 SetUpForTest(true, "returnDouble", "()D", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnDouble));
962
963 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_);
964 EXPECT_DOUBLE_EQ(4.0, result);
965 EXPECT_EQ(1, gJava_MyClassNatives_returnDouble_calls[gCurrentJni]);
966
967 gJava_MyClassNatives_returnDouble_calls[gCurrentJni] = 0;
968}
969
970JNI_TEST_CRITICAL(RunGenericStaticReturnDouble)
971
972jlong Java_MyClassNatives_returnLong(JNIEnv*, jclass) {
973 return 0xFEEDDEADFEEDL;
974}
975
976void JniCompilerTest::RunGenericStaticReturnLongImpl() {
977 SetUpForTest(true, "returnLong", "()J", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnLong));
978
979 jlong result = env_->CallStaticLongMethod(jklass_, jmethod_);
980 EXPECT_EQ(0xFEEDDEADFEEDL, result);
981}
982
983JNI_TEST_CRITICAL(RunGenericStaticReturnLong)
984
985int gJava_MyClassNatives_fooSIOO_calls[kJniKindCount] = {};
986jobject Java_MyClassNatives_fooSIOO(JNIEnv*, jclass klass, jint x, jobject y, jobject z) {
987 gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700988 switch (x) {
989 case 1:
990 return y;
991 case 2:
992 return z;
993 default:
994 return klass;
995 }
996}
997
Andreas Gampe6e498692014-08-18 16:43:12 -0700998void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700999 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001000 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001001 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001002
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001003 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001004 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001005 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001006 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001007
Andreas Gampecf4035a2014-05-28 22:43:01 -07001008 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001009 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001010 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001011 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1012 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001013 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001014 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001015 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001016 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001017
Andreas Gampecf4035a2014-05-28 22:43:01 -07001018 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001019 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001020 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001021 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001022 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001023 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001024 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1025 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001026 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001027
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001028 gJava_MyClassNatives_fooSIOO_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001029}
1030
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001031// TODO: Maybe. @FastNative support for returning Objects?
1032JNI_TEST_NORMAL_ONLY(CompileAndRunStaticIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -07001033
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001034int gJava_MyClassNatives_fooSSIOO_calls[kJniKindCount] = {};
1035jobject Java_MyClassNatives_fooSSIOO(JNIEnv*, jclass klass, jint x, jobject y, jobject z) {
1036 gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]++;
Ian Rogersdf20fe02011-07-20 20:34:16 -07001037 switch (x) {
1038 case 1:
1039 return y;
1040 case 2:
1041 return z;
1042 default:
1043 return klass;
1044 }
1045}
1046
Andreas Gampe6e498692014-08-18 16:43:12 -07001047void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001048 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001049 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001050 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -07001051
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001052 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001053 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001054 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001055 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001056
Andreas Gampecf4035a2014-05-28 22:43:01 -07001057 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001058 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001059 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001060 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1061 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001062 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001063 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001064 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001065 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001066
Andreas Gampecf4035a2014-05-28 22:43:01 -07001067 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001068 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001069 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001070 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001071 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001072 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001073 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1074 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001075 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001076
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001077 gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni] = 0;
Ian Rogersdf20fe02011-07-20 20:34:16 -07001078}
1079
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001080// TODO: Maybe. @FastNative support for returning Objects?
1081JNI_TEST_NORMAL_ONLY(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -07001082
Elliott Hughesb264f082012-04-06 17:10:10 -07001083void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -07001084 jclass c = env->FindClass("java/lang/RuntimeException");
1085 env->ThrowNew(c, "hello");
1086}
Ian Rogers45a76cb2011-07-21 22:00:15 -07001087
Andreas Gampe6e498692014-08-18 16:43:12 -07001088void JniCompilerTest::ExceptionHandlingImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001089 {
1090 ASSERT_FALSE(runtime_->IsStarted());
1091 ScopedObjectAccess soa(Thread::Current());
1092 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -07001093
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001094 // all compilation needs to happen before Runtime::Start
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001095 CompileForTestWithCurrentJni(class_loader_, false, "foo", "()V");
1096 CompileForTestWithCurrentJni(class_loader_, false, "throwException", "()V");
1097 CompileForTestWithCurrentJni(class_loader_, false, "foo", "()V");
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001098 }
1099 // Start runtime to avoid re-initialization in SetupForTest.
1100 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -07001101 bool started = runtime_->Start();
1102 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -07001103
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001104 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -07001105
Ian Rogers67375ac2011-09-14 00:55:44 -07001106 // Check a single call of a JNI method is ok
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001107 SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001108 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001109 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogers67375ac2011-09-14 00:55:44 -07001110 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -07001111
Ian Rogers67375ac2011-09-14 00:55:44 -07001112 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001113 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
1114 SetUpForTest(false, "throwException", "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001115 CURRENT_JNI_WRAPPER(Java_MyClassNatives_throwException));
Elliott Hughesb264f082012-04-06 17:10:10 -07001116 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -07001117 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001118 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001119 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1120 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
1121 env_->ExceptionClear();
1122 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -07001123
Ian Rogers67375ac2011-09-14 00:55:44 -07001124 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001125 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001126 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001127 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001128
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001129 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Ian Rogers45a76cb2011-07-21 22:00:15 -07001130}
1131
Andreas Gampe6e498692014-08-18 16:43:12 -07001132JNI_TEST(ExceptionHandling)
1133
Elliott Hughesb264f082012-04-06 17:10:10 -07001134jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001135 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -07001136 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001137 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -07001138
1139 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +01001140 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -07001141 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -08001142 mirror::ObjectArray<mirror::StackTraceElement>* trace_array =
1143 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>*>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001144 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001145 EXPECT_EQ(11, trace_array->GetLength());
1146
Ian Rogersaaa20802011-09-11 21:47:37 -07001147 // Check stack trace entries have expected values
Andreas Gampe277ccbd2014-11-03 21:36:10 -08001148 for (int32_t j = 0; j < trace_array->GetLength(); ++j) {
1149 EXPECT_EQ(-2, trace_array->Get(j)->GetLineNumber());
1150 mirror::StackTraceElement* ste = trace_array->Get(j);
Ian Rogersaaa20802011-09-11 21:47:37 -07001151 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -07001152 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001153 EXPECT_EQ(("fooI" + CurrentJniStringSuffix()), ste->GetMethodName()->ToModifiedUtf8());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001154 }
Ian Rogersaaa20802011-09-11 21:47:37 -07001155
1156 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001157 return 0;
1158 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -07001159 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -07001160 EXPECT_TRUE(jklass != nullptr);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001161 jmethodID jmethod = env->GetMethodID(jklass,
1162 ("fooI" + CurrentJniStringSuffix()).c_str(),
1163 "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -07001164 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001165
Ian Rogersaaa20802011-09-11 21:47:37 -07001166 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001167 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -07001168
1169 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001170 return i + result;
1171 }
1172}
1173
Andreas Gampe6e498692014-08-18 16:43:12 -07001174void JniCompilerTest::NativeStackTraceElementImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001175 SetUpForTest(false, "fooI", "(I)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001176 CURRENT_JNI_WRAPPER(Java_MyClassNatives_nativeUpCall));
1177
1178 // Usual # local references on stack check fails because nativeUpCall calls itself recursively,
1179 // each time the # of local references will therefore go up.
1180 ScopedDisableCheckNumStackReferences disable_num_stack_check;
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001181 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001182
Ian Rogersaaa20802011-09-11 21:47:37 -07001183 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001184}
1185
Andreas Gampe6e498692014-08-18 16:43:12 -07001186JNI_TEST(NativeStackTraceElement)
1187
Elliott Hughesb264f082012-04-06 17:10:10 -07001188jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -07001189 return env->NewGlobalRef(x);
1190}
1191
Andreas Gampe6e498692014-08-18 16:43:12 -07001192void JniCompilerTest::ReturnGlobalRefImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001193 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001194 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -07001195 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
1196 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
1197 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
1198}
1199
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001200// TODO: Maybe. @FastNative support for returning objects?
1201JNI_TEST_NORMAL_ONLY(ReturnGlobalRef)
Andreas Gampe6e498692014-08-18 16:43:12 -07001202
Ian Rogersdc51b792011-09-22 20:41:37 -07001203jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
1204 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001205 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -07001206 for (int i = 0; i < 10; i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -08001207 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object*>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -07001208 }
1209 return x+1;
1210}
1211
Andreas Gampe6e498692014-08-18 16:43:12 -07001212void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001213 SetUpForTest(false, "fooI", "(I)I", CURRENT_JNI_WRAPPER(local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -07001214 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -07001215 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -07001216 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
1217 EXPECT_TRUE(result == i + 1);
1218 }
1219}
1220
Andreas Gampe6e498692014-08-18 16:43:12 -07001221JNI_TEST(LocalReferenceTableClearingTest)
1222
Ian Rogersb9231c82011-09-05 22:13:19 -07001223void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
1224 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
1225 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -07001226 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -07001227 EXPECT_EQ(1234, src_pos);
1228 EXPECT_EQ(5678, dst_pos);
1229 EXPECT_EQ(9876, length);
1230}
1231
Andreas Gampe6e498692014-08-18 16:43:12 -07001232void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001233 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001234 CURRENT_JNI_WRAPPER(my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -07001235 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -07001236}
1237
Andreas Gampe6e498692014-08-18 16:43:12 -07001238JNI_TEST(JavaLangSystemArrayCopy)
1239
Ian Rogers67375ac2011-09-14 00:55:44 -07001240jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
1241 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
1242 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -07001243 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -07001244 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
1245 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
1246 return JNI_TRUE;
1247}
1248
Andreas Gampe6e498692014-08-18 16:43:12 -07001249void JniCompilerTest::CompareAndSwapIntImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001250 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001251 CURRENT_JNI_WRAPPER(my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -07001252 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
1253 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -07001254 EXPECT_EQ(result, JNI_TRUE);
1255}
1256
Andreas Gampe6e498692014-08-18 16:43:12 -07001257JNI_TEST(CompareAndSwapInt)
1258
Ian Rogersc7792842012-03-03 15:36:20 -08001259jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
1260 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
1261 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
1262 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
1263 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
1264 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
1265 return 42;
1266}
1267
Andreas Gampe6e498692014-08-18 16:43:12 -07001268void JniCompilerTest::GetTextImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001269 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001270 CURRENT_JNI_WRAPPER(my_gettext));
Ian Rogersc7792842012-03-03 15:36:20 -08001271 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -07001272 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -08001273 EXPECT_EQ(result, 42);
1274}
1275
Andreas Gampe6e498692014-08-18 16:43:12 -07001276JNI_TEST(GetText)
1277
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001278int gJava_MyClassNatives_GetSinkProperties_calls[kJniKindCount] = {};
1279jarray Java_MyClassNatives_GetSinkProperties(JNIEnv*, jobject thisObj, jstring s) {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001280 EXPECT_EQ(s, nullptr);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001281 gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]++;
1282
1283 Thread* self = Thread::Current();
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001284 ScopedObjectAccess soa(self);
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001285 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object*>(thisObj)));
1286 return nullptr;
1287}
1288
Andreas Gampe6e498692014-08-18 16:43:12 -07001289void JniCompilerTest::GetSinkPropertiesNativeImpl() {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001290 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001291 CURRENT_JNI_WRAPPER(Java_MyClassNatives_GetSinkProperties));
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001292
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001293 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001294 jarray result = down_cast<jarray>(
1295 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
1296 EXPECT_EQ(nullptr, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001297 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001298
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001299 gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni] = 0;
Brian Carlstromfc7120c2012-08-27 13:43:25 -07001300}
1301
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001302// @FastNative doesn't support 'synchronized' keyword and
1303// never will -- locking functions aren't fast.
1304JNI_TEST_NORMAL_ONLY(GetSinkPropertiesNative)
Andreas Gampe6e498692014-08-18 16:43:12 -07001305
Elliott Hughesb264f082012-04-06 17:10:10 -07001306// This should return jclass, but we're imitating a bug pattern.
1307jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
1308 return env->NewStringUTF("not a class!");
1309}
1310
1311// This should return jclass, but we're imitating a bug pattern.
1312jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
1313 return env->NewStringUTF("not a class!");
1314}
1315
Andreas Gampe6e498692014-08-18 16:43:12 -07001316void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001317 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001318 CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldReturnClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001319
1320 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001321 // This native method is bad, and tries to return a jstring as a jclass.
1322 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001323 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1324 "of java.lang.String from java.lang.Class " +
1325 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1326 CurrentJniStringSuffix() + "()");
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001327
1328 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -07001329 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001330 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1331 "of java.lang.String from java.lang.Class " +
1332 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1333 CurrentJniStringSuffix() + "()");
Ian Rogers68d8b422014-07-17 11:09:10 -07001334 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001335 check_jni_abort_catcher.Check(std::string() + "calling non-static method " +
1336 "java.lang.Class " +
1337 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1338 CurrentJniStringSuffix() + "() with CallStaticObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001339}
1340
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001341// TODO: Maybe support returning objects for @FastNative?
1342JNI_TEST_NORMAL_ONLY(UpcallReturnTypeChecking_Instance)
Andreas Gampe6e498692014-08-18 16:43:12 -07001343
1344void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001345 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001346 CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldReturnClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001347
1348 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001349 // This native method is bad, and tries to return a jstring as a jclass.
1350 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001351 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1352 "of java.lang.String from java.lang.Class " +
1353 "MyClassNatives.staticMethodThatShouldReturnClass" +
1354 CurrentJniStringSuffix() + "()");
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001355
1356 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -07001357 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001358 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1359 "of java.lang.String from java.lang.Class " +
1360 "MyClassNatives.staticMethodThatShouldReturnClass" +
1361 CurrentJniStringSuffix() + "()");
Ian Rogers68d8b422014-07-17 11:09:10 -07001362 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001363 check_jni_abort_catcher.Check(std::string() + "calling static method " +
1364 "java.lang.Class " +
1365 "MyClassNatives.staticMethodThatShouldReturnClass" +
1366 CurrentJniStringSuffix() + "() with CallObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001367}
1368
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001369// TODO: Maybe support returning objects for @FastNative?
1370JNI_TEST_NORMAL_ONLY(UpcallReturnTypeChecking_Static)
Andreas Gampe6e498692014-08-18 16:43:12 -07001371
Elliott Hughesb264f082012-04-06 17:10:10 -07001372// This should take jclass, but we're imitating a bug pattern.
1373void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
1374}
1375
1376// This should take jclass, but we're imitating a bug pattern.
1377void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
1378}
1379
Andreas Gampe6e498692014-08-18 16:43:12 -07001380void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001381 // This will lead to error messages in the log.
1382 ScopedLogSeverity sls(LogSeverity::FATAL);
1383
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001384 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001385 CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldTakeClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001386
1387 CheckJniAbortCatcher check_jni_abort_catcher;
1388 // We deliberately pass a bad second argument here.
1389 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001390 check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1391 "MyClassNatives.instanceMethodThatShouldTakeClass" +
1392 CurrentJniStringSuffix() + "(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001393}
1394
Andreas Gampe6e498692014-08-18 16:43:12 -07001395JNI_TEST(UpcallArgumentTypeChecking_Instance)
1396
1397void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001398 // This will lead to error messages in the log.
1399 ScopedLogSeverity sls(LogSeverity::FATAL);
1400
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001401 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001402 CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldTakeClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001403
1404 CheckJniAbortCatcher check_jni_abort_catcher;
1405 // We deliberately pass a bad second argument here.
1406 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001407 check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1408 "MyClassNatives.staticMethodThatShouldTakeClass" +
1409 CurrentJniStringSuffix() + "(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001410}
1411
Andreas Gampe6e498692014-08-18 16:43:12 -07001412JNI_TEST(UpcallArgumentTypeChecking_Static)
1413
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001414jfloat Java_MyClassNatives_checkFloats(JNIEnv*, jobject, jfloat f1, jfloat f2) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001415 return f1 - f2; // non-commutative operator
1416}
1417
Andreas Gampe6e498692014-08-18 16:43:12 -07001418void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001419 SetUpForTest(false, "checkFloats", "(FF)F",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001420 CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkFloats));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001421
1422 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1423 99.0F, 10.0F);
Ian Rogers647b1a82014-10-10 11:02:11 -07001424 EXPECT_FLOAT_EQ(99.0F - 10.0F, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001425 jfloat a = 3.14159F;
1426 jfloat b = 0.69314F;
1427 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -07001428 EXPECT_FLOAT_EQ(a - b, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001429}
1430
Andreas Gampe6e498692014-08-18 16:43:12 -07001431JNI_TEST(CompileAndRunFloatFloatMethod)
1432
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001433void Java_MyClassNatives_checkParameterAlign(JNIEnv* env ATTRIBUTE_UNUSED,
1434 jobject thisObj ATTRIBUTE_UNUSED,
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001435 jint i1,
1436 jlong l1) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001437 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -07001438 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001439}
1440
Andreas Gampe6e498692014-08-18 16:43:12 -07001441void JniCompilerTest::CheckParameterAlignImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001442 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001443 CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkParameterAlign));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001444
Ian Rogers0f678472014-03-10 16:18:37 -07001445 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001446}
1447
Andreas Gampe6e498692014-08-18 16:43:12 -07001448JNI_TEST(CheckParameterAlign)
1449
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001450void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject,
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001451 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1452 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1453 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1454 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1455 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1456 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1457 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1458 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1459 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1460 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1461 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1462 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1463 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1464 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1465 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1466 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1467 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1468 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1469 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1470 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1471 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1472 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1473 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1474 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1475 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1476 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1477 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1478 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1479 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1480 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1481 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1482 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001483 // two tests possible
1484 if (o0 == nullptr) {
1485 // 1) everything is null
1486 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1487 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1488 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1489 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1490 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1491 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1492 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1493 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1494 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1495 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1496 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1497 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1498 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1499 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1500 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1501 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1502 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1503 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1504 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1505 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1506 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1507 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1508 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1509 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1510 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1511 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1512 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1513 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1514 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1515 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1516 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1517 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1518 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1519 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1520 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1521 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1522 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1523 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1524 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1525 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1526 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1527 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1528 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1529 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1530 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1531 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1532 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1533 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1534 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1535 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1536 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1537 } else {
1538 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1539 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1540 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1541 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1542 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1543 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1544 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1545 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1546 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1547 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1548 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1549 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1550 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1551 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1552 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1553 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1554 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1555 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1556 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1557 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1558 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1559 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1560 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1561 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1562 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1563 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1564 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1565 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1566 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1567 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1568 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1569 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1570 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1571 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1572 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1573 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1574 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1575 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1576 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1577 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1578 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1579 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1580 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1581 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1582 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1583 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1584 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1585 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1586 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1587 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1588 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1589 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1590 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1591 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1592 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1593 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1594 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1595 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1596 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1597 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1598 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1599 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1600 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1601 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1602 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1603 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1604 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1605 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1606 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1607 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1608 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1609 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1610 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1611 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1612 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1613 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1614 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1615 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1616 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1617 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1618 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1619 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1620 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1621 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1622 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1623 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1624 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1625 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1626 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1627 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1628 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1629 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1630 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1631 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1632 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1633 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1634 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1635 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1636 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1637 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1638 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1639 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1640 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1641 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1642 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1643 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1644 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1645 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1646 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1647 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1648 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1649 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1650 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1651 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1652 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1653 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1654 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1655 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1656 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1657 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1658 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1659 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1660 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1661 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1662 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1663 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1664 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1665 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1666 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1667 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1668 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1669 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1670 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1671 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1672 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1673 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1674 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1675 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1676 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1677 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1678 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1679 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1680 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1681 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1682 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1683 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1684 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1685 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1686 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1687 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1688 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1689 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1690 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1691 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1692 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1693 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1694 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1695 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1696 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1697 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1698 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1699 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1700 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1701 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1702 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1703 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1704 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1705 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1706 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1707 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1708 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1709 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1710 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1711 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1712 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1713 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1714 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1715 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1716 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1717 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1718 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1719 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1720 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1721 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1722 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1723 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1724 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1725 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1726 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1727 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1728 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1729 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1730 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1731 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1732 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1733 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1734 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1735 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1736 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1737 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1738 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1739 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1740 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1741 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1742 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1743 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1744 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1745 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1746 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1747 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1748 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1749 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1750 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1751 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1752 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1753 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1754 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1755 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1756 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1757 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1758 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1759 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1760 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1761 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1762 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1763 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1764 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1765 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1766 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1767 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1768 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1769 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1770 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1771 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1772 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1773 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1774 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1775 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1776 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1777 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1778 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1779 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1780 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1781 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1782 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1783 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1784 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1785 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1786 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1787 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1788 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1789 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1790 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1791 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1792 }
1793}
1794
1795const char* longSig =
1796 "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1797 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1798 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1799 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1800 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1801 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1802 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1803 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1804 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1805 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1806 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1807 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1808 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1809 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1810 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1811 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1812 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1813 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1814 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1815 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1816 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1817 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1818 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1819 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1820 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1821 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1822 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1823 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1824 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1825 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1826 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1827 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1828 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1829 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1830 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1831 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1832 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1833 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1834 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1835 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1836 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1837 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1838 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1839 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1840 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1841 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1842 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1843 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1844 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1845 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1846 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1847
Andreas Gampe6e498692014-08-18 16:43:12 -07001848void JniCompilerTest::MaxParamNumberImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001849 SetUpForTest(false, "maxParamNumber", longSig,
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001850 CURRENT_JNI_WRAPPER(Java_MyClassNatives_maxParamNumber));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001851
1852 jvalue args[254];
1853
1854 // First test: test with all arguments null.
1855 for (int i = 0; i < 254; ++i) {
1856 args[i].l = nullptr;
1857 }
1858
1859 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1860
1861 // Second test: test with int[] objects with increasing lengths
1862 for (int i = 0; i < 254; ++i) {
1863 jintArray tmp = env_->NewIntArray(i);
1864 args[i].l = tmp;
1865 EXPECT_NE(args[i].l, nullptr);
1866 }
1867
1868 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1869}
1870
Andreas Gampe6e498692014-08-18 16:43:12 -07001871JNI_TEST(MaxParamNumber)
1872
1873void JniCompilerTest::WithoutImplementationImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001874 // This will lead to error messages in the log.
1875 ScopedLogSeverity sls(LogSeverity::FATAL);
1876
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001877 SetUpForTest(false, "withoutImplementation", "()V", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampead615172014-04-04 16:20:13 -07001878
1879 env_->CallVoidMethod(jobj_, jmethod_);
1880
1881 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1882 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1883}
1884
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001885// TODO: Don't test @FastNative here since it goes through a stub lookup (unsupported) which would
1886// normally fail with an exception, but fails with an assert.
1887JNI_TEST_NORMAL_ONLY(WithoutImplementation)
Andreas Gampe6e498692014-08-18 16:43:12 -07001888
Andreas Gampe48ee3562015-04-10 19:57:29 -07001889void JniCompilerTest::WithoutImplementationRefReturnImpl() {
1890 // This will lead to error messages in the log.
1891 ScopedLogSeverity sls(LogSeverity::FATAL);
1892
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001893 SetUpForTest(false,
1894 "withoutImplementationRefReturn",
1895 "()Ljava/lang/Object;",
1896 NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampe48ee3562015-04-10 19:57:29 -07001897
1898 env_->CallObjectMethod(jobj_, jmethod_);
1899
1900 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1901 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1902}
1903
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001904// TODO: Should work for @FastNative too.
1905JNI_TEST_NORMAL_ONLY(WithoutImplementationRefReturn)
Andreas Gampe48ee3562015-04-10 19:57:29 -07001906
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001907void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv*, jclass, jint i1, jint i2, jint i3,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001908 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1909 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1910 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1911 jfloat f10) {
1912 EXPECT_EQ(i1, 1);
1913 EXPECT_EQ(i2, 2);
1914 EXPECT_EQ(i3, 3);
1915 EXPECT_EQ(i4, 4);
1916 EXPECT_EQ(i5, 5);
1917 EXPECT_EQ(i6, 6);
1918 EXPECT_EQ(i7, 7);
1919 EXPECT_EQ(i8, 8);
1920 EXPECT_EQ(i9, 9);
1921 EXPECT_EQ(i10, 10);
1922
Roland Levillainda4d79b2015-03-24 14:36:11 +00001923 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001924 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001925 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001926 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001927 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001928 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001929 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001930 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001931 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001932 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001933 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001934 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001935 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001936 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001937 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001938 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001939 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001940 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001941 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001942 EXPECT_EQ(i20, 20);
1943}
1944
Andreas Gampe6e498692014-08-18 16:43:12 -07001945void JniCompilerTest::StackArgsIntsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001946 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001947 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsIntsFirst));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001948
1949 jint i1 = 1;
1950 jint i2 = 2;
1951 jint i3 = 3;
1952 jint i4 = 4;
1953 jint i5 = 5;
1954 jint i6 = 6;
1955 jint i7 = 7;
1956 jint i8 = 8;
1957 jint i9 = 9;
1958 jint i10 = 10;
1959
Roland Levillainda4d79b2015-03-24 14:36:11 +00001960 jfloat f1 = bit_cast<jfloat, jint>(11);
1961 jfloat f2 = bit_cast<jfloat, jint>(12);
1962 jfloat f3 = bit_cast<jfloat, jint>(13);
1963 jfloat f4 = bit_cast<jfloat, jint>(14);
1964 jfloat f5 = bit_cast<jfloat, jint>(15);
1965 jfloat f6 = bit_cast<jfloat, jint>(16);
1966 jfloat f7 = bit_cast<jfloat, jint>(17);
1967 jfloat f8 = bit_cast<jfloat, jint>(18);
1968 jfloat f9 = bit_cast<jfloat, jint>(19);
1969 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001970
1971 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1972 f3, f4, f5, f6, f7, f8, f9, f10);
1973}
1974
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001975JNI_TEST_CRITICAL(StackArgsIntsFirst)
Andreas Gampe6e498692014-08-18 16:43:12 -07001976
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001977void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv*, jclass, jfloat f1, jfloat f2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001978 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1979 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1980 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1981 jint i9, jint i10) {
1982 EXPECT_EQ(i1, 1);
1983 EXPECT_EQ(i2, 2);
1984 EXPECT_EQ(i3, 3);
1985 EXPECT_EQ(i4, 4);
1986 EXPECT_EQ(i5, 5);
1987 EXPECT_EQ(i6, 6);
1988 EXPECT_EQ(i7, 7);
1989 EXPECT_EQ(i8, 8);
1990 EXPECT_EQ(i9, 9);
1991 EXPECT_EQ(i10, 10);
1992
Roland Levillainda4d79b2015-03-24 14:36:11 +00001993 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001994 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001995 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001996 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001997 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001998 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001999 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002000 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002001 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002002 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002003 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002004 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002005 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002006 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002007 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002008 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002009 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002010 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002011 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002012 EXPECT_EQ(i20, 20);
2013}
2014
Andreas Gampe6e498692014-08-18 16:43:12 -07002015void JniCompilerTest::StackArgsFloatsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002016 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002017 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsFloatsFirst));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002018
2019 jint i1 = 1;
2020 jint i2 = 2;
2021 jint i3 = 3;
2022 jint i4 = 4;
2023 jint i5 = 5;
2024 jint i6 = 6;
2025 jint i7 = 7;
2026 jint i8 = 8;
2027 jint i9 = 9;
2028 jint i10 = 10;
2029
Roland Levillainda4d79b2015-03-24 14:36:11 +00002030 jfloat f1 = bit_cast<jfloat, jint>(11);
2031 jfloat f2 = bit_cast<jfloat, jint>(12);
2032 jfloat f3 = bit_cast<jfloat, jint>(13);
2033 jfloat f4 = bit_cast<jfloat, jint>(14);
2034 jfloat f5 = bit_cast<jfloat, jint>(15);
2035 jfloat f6 = bit_cast<jfloat, jint>(16);
2036 jfloat f7 = bit_cast<jfloat, jint>(17);
2037 jfloat f8 = bit_cast<jfloat, jint>(18);
2038 jfloat f9 = bit_cast<jfloat, jint>(19);
2039 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002040
2041 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
2042 i4, i5, i6, i7, i8, i9, i10);
2043}
2044
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002045JNI_TEST_CRITICAL(StackArgsFloatsFirst)
Andreas Gampe6e498692014-08-18 16:43:12 -07002046
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07002047void Java_MyClassNatives_stackArgsMixed(JNIEnv*, jclass, jint i1, jfloat f1, jint i2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002048 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
2049 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
2050 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
2051 EXPECT_EQ(i1, 1);
2052 EXPECT_EQ(i2, 2);
2053 EXPECT_EQ(i3, 3);
2054 EXPECT_EQ(i4, 4);
2055 EXPECT_EQ(i5, 5);
2056 EXPECT_EQ(i6, 6);
2057 EXPECT_EQ(i7, 7);
2058 EXPECT_EQ(i8, 8);
2059 EXPECT_EQ(i9, 9);
2060 EXPECT_EQ(i10, 10);
2061
Roland Levillainda4d79b2015-03-24 14:36:11 +00002062 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002063 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002064 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002065 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002066 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002067 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002068 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002069 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002070 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002071 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002072 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002073 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002074 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002075 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002076 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002077 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002078 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002079 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002080 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002081 EXPECT_EQ(i20, 20);
2082}
2083
Andreas Gampe6e498692014-08-18 16:43:12 -07002084void JniCompilerTest::StackArgsMixedImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002085 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002086 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsMixed));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002087
2088 jint i1 = 1;
2089 jint i2 = 2;
2090 jint i3 = 3;
2091 jint i4 = 4;
2092 jint i5 = 5;
2093 jint i6 = 6;
2094 jint i7 = 7;
2095 jint i8 = 8;
2096 jint i9 = 9;
2097 jint i10 = 10;
2098
Roland Levillainda4d79b2015-03-24 14:36:11 +00002099 jfloat f1 = bit_cast<jfloat, jint>(11);
2100 jfloat f2 = bit_cast<jfloat, jint>(12);
2101 jfloat f3 = bit_cast<jfloat, jint>(13);
2102 jfloat f4 = bit_cast<jfloat, jint>(14);
2103 jfloat f5 = bit_cast<jfloat, jint>(15);
2104 jfloat f6 = bit_cast<jfloat, jint>(16);
2105 jfloat f7 = bit_cast<jfloat, jint>(17);
2106 jfloat f8 = bit_cast<jfloat, jint>(18);
2107 jfloat f9 = bit_cast<jfloat, jint>(19);
2108 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002109
2110 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
2111 f7, i8, f8, i9, f9, i10, f10);
2112}
2113
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002114JNI_TEST_CRITICAL(StackArgsMixed)
Andreas Gampe6e498692014-08-18 16:43:12 -07002115
Lazar Trsicf652d602015-06-24 16:30:21 +02002116void Java_MyClassNatives_stackArgsSignExtendedMips64(JNIEnv*, jclass, jint i1, jint i2, jint i3,
2117 jint i4, jint i5, jint i6, jint i7, jint i8) {
2118 EXPECT_EQ(i1, 1);
2119 EXPECT_EQ(i2, 2);
2120 EXPECT_EQ(i3, 3);
2121 EXPECT_EQ(i4, 4);
2122 EXPECT_EQ(i5, 5);
2123 EXPECT_EQ(i6, 6);
2124 EXPECT_EQ(i7, 7);
2125 EXPECT_EQ(i8, -8);
2126
2127#if defined(__mips__) && defined(__LP64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
2128 // Mips64 ABI requires that arguments passed through stack be sign-extended 8B slots.
2129 // First 8 arguments are passed through registers, check i7 and i8.
2130 uint32_t stack1_high = *(&i7 + 1);
2131 uint32_t stack2_high = *(&i8 + 1);
2132
2133 EXPECT_EQ(stack1_high, static_cast<uint32_t>(0));
2134 EXPECT_EQ(stack2_high, static_cast<uint32_t>(0xffffffff));
2135#else
2136 LOG(INFO) << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on "
2137 << kRuntimeISA;
2138 // Force-print to std::cout so it's also outside the logcat.
2139 std::cout << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on "
2140 << kRuntimeISA << std::endl;
2141#endif
2142}
2143
2144void JniCompilerTest::StackArgsSignExtendedMips64Impl() {
2145 SetUpForTest(true, "stackArgsSignExtendedMips64", "(IIIIIIII)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002146 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsSignExtendedMips64));
Lazar Trsicf652d602015-06-24 16:30:21 +02002147 jint i1 = 1;
2148 jint i2 = 2;
2149 jint i3 = 3;
2150 jint i4 = 4;
2151 jint i5 = 5;
2152 jint i6 = 6;
2153 jint i7 = 7;
2154 jint i8 = -8;
2155
2156 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8);
2157}
2158
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002159JNI_TEST_CRITICAL(StackArgsSignExtendedMips64)
Lazar Trsicf652d602015-06-24 16:30:21 +02002160
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002161void Java_MyClassNatives_normalNative(JNIEnv*, jclass) {
2162 // Intentionally left empty.
2163}
2164
2165// Methods not annotated with anything are not considered "fast native"
2166// -- Check that the annotation lookup does not find it.
2167void JniCompilerTest::NormalNativeImpl() {
2168 SetUpForTest(/* direct */ true,
2169 "normalNative",
2170 "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002171 CURRENT_JNI_WRAPPER(Java_MyClassNatives_normalNative));
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002172
2173 ScopedObjectAccess soa(Thread::Current());
2174 ArtMethod* method = soa.DecodeMethod(jmethod_);
2175 ASSERT_TRUE(method != nullptr);
2176
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002177 EXPECT_FALSE(method->IsAnnotatedWithCriticalNative());
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002178 EXPECT_FALSE(method->IsAnnotatedWithFastNative());
2179}
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002180
2181// TODO: just rename the java functions to the standard convention and remove duplicated tests
2182JNI_TEST_NORMAL_ONLY(NormalNative)
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002183
2184// Methods annotated with @FastNative are considered "fast native"
2185// -- Check that the annotation lookup succeeds.
2186void Java_MyClassNatives_fastNative(JNIEnv*, jclass) {
2187 // Intentionally left empty.
2188}
2189
2190void JniCompilerTest::FastNativeImpl() {
2191 SetUpForTest(/* direct */ true,
2192 "fastNative",
2193 "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002194 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fastNative));
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002195
2196 ScopedObjectAccess soa(Thread::Current());
2197 ArtMethod* method = soa.DecodeMethod(jmethod_);
2198 ASSERT_TRUE(method != nullptr);
2199
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002200 EXPECT_FALSE(method->IsAnnotatedWithCriticalNative());
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002201 EXPECT_TRUE(method->IsAnnotatedWithFastNative());
2202}
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002203
2204// TODO: just rename the java functions to the standard convention and remove duplicated tests
2205JNI_TEST_NORMAL_ONLY(FastNative)
2206
2207int gJava_myClassNatives_criticalNative_calls[kJniKindCount] = {};
2208// Methods annotated with @CriticalNative are considered "critical native"
2209// -- Check that the annotation lookup succeeds.
2210void Java_MyClassNatives_criticalNative() {
2211 gJava_myClassNatives_criticalNative_calls[gCurrentJni]++;
2212}
2213
2214void JniCompilerTest::CriticalNativeImpl() {
2215 SetUpForTest(/* direct */ true,
2216 // Important: Don't change the "current jni" yet to avoid a method name suffix.
2217 "criticalNative",
2218 "()V",
2219 // TODO: Use CURRENT_JNI_WRAPPER instead which is more generic.
2220 reinterpret_cast<void*>(&Java_MyClassNatives_criticalNative));
2221
2222 // TODO: remove this manual updating of the current JNI. Merge with the other tests.
2223 UpdateCurrentJni(JniKind::kCritical);
2224 ASSERT_TRUE(IsCurrentJniCritical());
2225
2226 ScopedObjectAccess soa(Thread::Current());
2227 ArtMethod* method = soa.DecodeMethod(jmethod_);
2228 ASSERT_TRUE(method != nullptr);
2229
2230 EXPECT_TRUE(method->IsAnnotatedWithCriticalNative());
2231 EXPECT_FALSE(method->IsAnnotatedWithFastNative());
2232
2233 EXPECT_EQ(0, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2234 env_->CallStaticVoidMethod(jklass_, jmethod_);
2235 EXPECT_EQ(1, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2236
2237 gJava_myClassNatives_criticalNative_calls[gCurrentJni] = 0;
2238}
2239
2240// TODO: just rename the java functions to the standard convention and remove duplicated tests
2241JNI_TEST_NORMAL_ONLY(CriticalNative)
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002242
Ian Rogersb033c752011-07-20 12:22:35 -07002243} // namespace art