blob: 19d55a3845be88122aad14d7045817e161d13082 [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Ian Rogersb033c752011-07-20 12:22:35 -070016
Ian Rogers700a4022014-05-19 16:49:03 -070017#include <memory>
Igor Murashkin367f3dd2016-09-01 17:00:24 -070018#include <type_traits>
Ian Rogers700a4022014-05-19 16:49:03 -070019
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010020#include <math.h>
21
Mathieu Chartiere401d142015-04-22 13:56:20 -070022#include "art_method-inl.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070023#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080024#include "common_compiler_test.h"
Igor Murashkin367f3dd2016-09-01 17:00:24 -070025#include "compiler.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070026#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070027#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070028#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070029#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070030#include "mem_map.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070031#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080032#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080033#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070034#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080035#include "mirror/stack_trace_element.h"
Dimitry Ivanov5edb0632016-04-29 11:14:25 -070036#include "nativeloader/native_loader.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070037#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070038#include "ScopedLocalRef.h"
Mathieu Chartier0795f232016-09-27 18:43:30 -070039#include "scoped_thread_state_change-inl.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070040#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070041
Elliott Hughesb264f082012-04-06 17:10:10 -070042extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080043 return count + 1;
44}
45
Elliott Hughesb264f082012-04-06 17:10:10 -070046extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080047 return count + 1;
48}
49
Ian Rogersb033c752011-07-20 12:22:35 -070050namespace art {
51
Igor Murashkin367f3dd2016-09-01 17:00:24 -070052enum class JniKind {
53 kNormal = Compiler::kNone, // Regular kind of un-annotated natives.
54 kFast = Compiler::kFastNative, // Native method annotated with @FastNative.
55 kCritical = Compiler::kCriticalNative, // Native method annotated with @CriticalNative.
56 kCount = Compiler::kCriticalNative + 1 // How many different types of JNIs we can have.
57};
58
59// Used to initialize array sizes that want to have different state per current jni.
60static constexpr size_t kJniKindCount = static_cast<size_t>(JniKind::kCount);
61// Do not use directly, use the helpers instead.
62uint32_t gCurrentJni = static_cast<uint32_t>(JniKind::kNormal);
63
64// Is the current native method under test @CriticalNative?
65static bool IsCurrentJniCritical() {
66 return gCurrentJni == static_cast<uint32_t>(JniKind::kCritical);
67}
68
69// Is the current native method a plain-old non-annotated native?
70static bool IsCurrentJniNormal() {
71 return gCurrentJni == static_cast<uint32_t>(JniKind::kNormal);
72}
73
74// Signifify that a different kind of JNI is about to be tested.
75static void UpdateCurrentJni(JniKind kind) {
76 gCurrentJni = static_cast<uint32_t>(kind);
77}
78
79// (Match the name suffixes of native methods in MyClassNatives.java)
80static std::string CurrentJniStringSuffix() {
81 switch (gCurrentJni) {
82 case static_cast<uint32_t>(JniKind::kNormal): {
83 return "";
84 }
85 case static_cast<uint32_t>(JniKind::kFast): {
86 return "_Fast";
87 }
88 case static_cast<uint32_t>(JniKind::kCritical): {
89 return "_Critical";
90 }
91 default:
92 LOG(FATAL) << "Invalid current JNI value: " << gCurrentJni;
93 UNREACHABLE();
94 }
95}
96
97// Dummy values passed to our JNI handlers when we enter @CriticalNative.
98// Normally @CriticalNative calling convention strips out the "JNIEnv*, jclass" parameters.
99// However to avoid duplicating every single test method we have a templated handler
100// that inserts dummy parameters (0,1) to make it compatible with a regular JNI handler.
101static JNIEnv* const kCriticalDummyJniEnv = reinterpret_cast<JNIEnv*>(0xDEADFEAD);
102static jclass const kCriticalDummyJniClass = reinterpret_cast<jclass>(0xBEAFBEEF);
103
104// Type trait. Returns true if "T" is the same type as one of the types in Args...
105//
106// Logically equal to OR(std::same_type<T, U> for all U in Args).
107template <typename T, typename ... Args>
108struct is_any_of;
109
110template <typename T, typename U, typename ... Args>
111struct is_any_of<T, U, Args ...> {
112 using value_type = bool;
113 static constexpr const bool value = std::is_same<T, U>::value || is_any_of<T, Args ...>::value;
114};
115
116template <typename T, typename U>
117struct is_any_of<T, U> {
118 using value_type = bool;
119 static constexpr const bool value = std::is_same<T, U>::value;
120};
121
122// Type traits for JNI types.
123template <typename T>
124struct jni_type_traits {
125 // True if type T ends up holding an object reference. False otherwise.
126 // (Non-JNI types will also be false).
127 static constexpr const bool is_ref =
128 is_any_of<T, jclass, jobject, jstring, jobjectArray, jintArray,
129 jcharArray, jfloatArray, jshortArray, jdoubleArray, jlongArray>::value;
130};
131
132template <typename ... Args>
133struct count_refs_helper {
134 using value_type = size_t;
135 static constexpr const size_t value = 0;
136};
137
138template <typename Arg, typename ... Args>
139struct count_refs_helper<Arg, Args ...> {
140 using value_type = size_t;
141 static constexpr size_t value =
142 (jni_type_traits<Arg>::is_ref ? 1 : 0) + count_refs_helper<Args ...>::value;
143};
144
145template <typename T, T fn>
146struct count_refs_fn_helper;
147
148template <typename R, typename ... Args, R fn(Args...)>
149struct count_refs_fn_helper<R(Args...), fn> : public count_refs_helper<Args...> {};
150
151// Given a function type 'T' figure out how many of the parameter types are a reference.
152// -- The implicit jclass and thisObject also count as 1 reference.
153//
154// Fields:
155// * value - the result counting # of refs
156// * value_type - the type of value (size_t)
157template <typename T, T fn>
158struct count_refs : public count_refs_fn_helper<T, fn> {};
159
160// Base case: No parameters = 0 refs.
161size_t count_nonnull_refs_helper() {
162 return 0;
163}
164
165// SFINAE for ref types. 1 if non-null, 0 otherwise.
166template <typename T>
167size_t count_nonnull_refs_single_helper(T arg,
168 typename std::enable_if<jni_type_traits<T>::is_ref>::type*
169 = nullptr) {
170 return ((arg == NULL) ? 0 : 1);
171}
172
173// SFINAE for non-ref-types. Always 0.
174template <typename T>
175size_t count_nonnull_refs_single_helper(T arg ATTRIBUTE_UNUSED,
176 typename std::enable_if<!jni_type_traits<T>::is_ref>::type*
177 = nullptr) {
178 return 0;
179}
180
181// Recursive case.
182template <typename T, typename ... Args>
183size_t count_nonnull_refs_helper(T arg, Args ... args) {
184 return count_nonnull_refs_single_helper(arg) + count_nonnull_refs_helper(args...);
185}
186
187// Given any list of parameters, check how many object refs there are and only count
188// them if their runtime value is non-null.
189//
190// For example given (jobject, jint, jclass) we can get (2) if both #0/#2 are non-null,
191// (1) if either #0/#2 are null but not both, and (0) if all parameters are null.
192// Primitive parameters (including JNIEnv*, if present) are ignored.
193template <typename ... Args>
194size_t count_nonnull_refs(Args ... args) {
195 return count_nonnull_refs_helper(args...);
196}
197
198template <typename T, T fn>
199struct remove_extra_parameters_helper;
200
201template <typename R, typename Arg1, typename Arg2, typename ... Args, R fn(Arg1, Arg2, Args...)>
202struct remove_extra_parameters_helper<R(Arg1, Arg2, Args...), fn> {
203 // Note: Do not use Args&& here to maintain C-style parameter types.
204 static R apply(Args... args) {
205 JNIEnv* env = kCriticalDummyJniEnv;
206 jclass kls = kCriticalDummyJniClass;
207 return fn(env, kls, args...);
208 }
209};
210
211// Given a function 'fn' create a function 'apply' which will omit the JNIEnv/jklass parameters
212//
213// i.e. if fn(JNIEnv*,jklass,a,b,c,d,e...) then apply(a,b,c,d,e,...)
214template <typename T, T fn>
215struct jni_remove_extra_parameters : public remove_extra_parameters_helper<T, fn> {};
216
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -0800217class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -0700218 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700219 void SetUp() OVERRIDE {
220 CommonCompilerTest::SetUp();
221 check_generic_jni_ = false;
222 }
223
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700224 void TearDown() OVERRIDE {
225 android::ResetNativeLoader();
226 CommonCompilerTest::TearDown();
227 }
228
Andreas Gampe6e498692014-08-18 16:43:12 -0700229 void SetCheckGenericJni(bool generic) {
230 check_generic_jni_ = generic;
231 }
232
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700233 private:
234 void CompileForTest(jobject class_loader,
235 bool direct,
236 const char* method_name,
237 const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700238 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700239 StackHandleScope<1> hs(soa.Self());
240 Handle<mirror::ClassLoader> loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -0700241 hs.NewHandle(soa.Decode<mirror::ClassLoader>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -0700242 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -0800243 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700244 const auto pointer_size = class_linker_->GetImagePointerSize();
245 ArtMethod* method = direct ? c->FindDirectMethod(method_name, method_sig, pointer_size) :
246 c->FindVirtualMethod(method_name, method_sig, pointer_size);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700247 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Andreas Gampe6e498692014-08-18 16:43:12 -0700248 if (check_generic_jni_) {
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700249 method->SetEntryPointFromQuickCompiledCode(class_linker_->GetRuntimeQuickGenericJniStub());
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100250 } else {
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700251 const void* code = method->GetEntryPointFromQuickCompiledCode();
252 if (code == nullptr || class_linker_->IsQuickGenericJniStub(code)) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100253 CompileMethod(method);
254 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
255 << method_name << " " << method_sig;
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100256 }
Brian Carlstrom25c33252011-09-18 15:58:35 -0700257 }
Brian Carlstrom25c33252011-09-18 15:58:35 -0700258 }
259
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700260 protected:
261 void CompileForTestWithCurrentJni(jobject class_loader,
262 bool direct,
263 const char* method_name_orig,
264 const char* method_sig) {
265 // Append the JNI kind to the method name, so that we automatically get the
266 // fast or critical versions of the same method.
267 std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
268 const char* method_name = method_name_str.c_str();
269
270 CompileForTest(class_loader, direct, method_name, method_sig);
271 }
272
273 void SetUpForTest(bool direct,
274 const char* method_name_orig,
275 const char* method_sig,
Andreas Gampe6e498692014-08-18 16:43:12 -0700276 void* native_fnptr) {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700277 // Append the JNI kind to the method name, so that we automatically get the
278 // fast or critical versions of the same method.
279 std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
280 const char* method_name = method_name_str.c_str();
281
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700282 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -0700283 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700284 {
285 ScopedObjectAccess soa(Thread::Current());
286 class_loader_ = LoadDex("MyClassNatives");
287 }
Andreas Gampe6e498692014-08-18 16:43:12 -0700288 CompileForTest(class_loader_, direct, method_name, method_sig);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700289 // Start runtime.
290 Thread::Current()->TransitionFromSuspendedToRunnable();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700291 android::InitializeNativeLoader();
Dimitry Ivanovc544f342016-05-09 16:26:13 -0700292 bool started = runtime_->Start();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700293 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700294 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700295 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700296 env_ = Thread::Current()->GetJniEnv();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700297 library_search_path_ = env_->NewStringUTF("");
Elliott Hughesb264f082012-04-06 17:10:10 -0700298 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700299 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700300
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700301 if (direct) {
302 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
303 } else {
304 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
305 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700306 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700307
Andreas Gampecf4035a2014-05-28 22:43:01 -0700308 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700309 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700310 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
311 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700312 } else {
313 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700314 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700315
316 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
317 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700318 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700319 }
320
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700321 public:
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700322 // Available as statics so our JNI handlers can access these.
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700323 static jclass jklass_;
324 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700325 static jobject class_loader_;
326
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700327 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700328 // We have to list the methods here so we can share them between default and generic JNI.
329 void CompileAndRunNoArgMethodImpl();
330 void CompileAndRunIntMethodThroughStubImpl();
331 void CompileAndRunStaticIntMethodThroughStubImpl();
332 void CompileAndRunIntMethodImpl();
333 void CompileAndRunIntIntMethodImpl();
334 void CompileAndRunLongLongMethodImpl();
335 void CompileAndRunDoubleDoubleMethodImpl();
336 void CompileAndRun_fooJJ_synchronizedImpl();
337 void CompileAndRunIntObjectObjectMethodImpl();
338 void CompileAndRunStaticIntIntMethodImpl();
339 void CompileAndRunStaticDoubleDoubleMethodImpl();
340 void RunStaticLogDoubleMethodImpl();
341 void RunStaticLogFloatMethodImpl();
342 void RunStaticReturnTrueImpl();
343 void RunStaticReturnFalseImpl();
344 void RunGenericStaticReturnIntImpl();
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700345 void RunGenericStaticReturnDoubleImpl();
346 void RunGenericStaticReturnLongImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700347 void CompileAndRunStaticIntObjectObjectMethodImpl();
348 void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl();
349 void ExceptionHandlingImpl();
350 void NativeStackTraceElementImpl();
351 void ReturnGlobalRefImpl();
352 void LocalReferenceTableClearingTestImpl();
353 void JavaLangSystemArrayCopyImpl();
354 void CompareAndSwapIntImpl();
355 void GetTextImpl();
356 void GetSinkPropertiesNativeImpl();
357 void UpcallReturnTypeChecking_InstanceImpl();
358 void UpcallReturnTypeChecking_StaticImpl();
359 void UpcallArgumentTypeChecking_InstanceImpl();
360 void UpcallArgumentTypeChecking_StaticImpl();
361 void CompileAndRunFloatFloatMethodImpl();
362 void CheckParameterAlignImpl();
363 void MaxParamNumberImpl();
364 void WithoutImplementationImpl();
Andreas Gampe48ee3562015-04-10 19:57:29 -0700365 void WithoutImplementationRefReturnImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700366 void StackArgsIntsFirstImpl();
367 void StackArgsFloatsFirstImpl();
368 void StackArgsMixedImpl();
Lazar Trsicf652d602015-06-24 16:30:21 +0200369 void StackArgsSignExtendedMips64Impl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700370
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700371 void NormalNativeImpl();
372 void FastNativeImpl();
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700373 void CriticalNativeImpl();
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700374
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700375 JNIEnv* env_;
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700376 jstring library_search_path_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700377 jmethodID jmethod_;
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700378
379 private:
Andreas Gampe6e498692014-08-18 16:43:12 -0700380 bool check_generic_jni_;
Ian Rogersb033c752011-07-20 12:22:35 -0700381};
382
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700383jclass JniCompilerTest::jklass_;
384jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700385jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700386
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700387// Test the normal compiler and normal generic JNI only.
388// The following features are unsupported in @FastNative:
389// 1) JNI stubs (lookup via dlsym) when methods aren't explicitly registered
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); \
Igor Murashkin294a9152016-09-28 13:23:19 -0700434 SetCheckGenericJni(true); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700435 TestName ## Impl(); \
436 }
Igor Murashkin06a04e02016-09-13 15:57:37 -0700437
438// Test everything: (normal, @FastNative, @CriticalNative) x (compiler, generic).
439#define JNI_TEST_CRITICAL(TestName) \
440 JNI_TEST(TestName) \
441 JNI_TEST_CRITICAL_ONLY(TestName) \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700442
443static void expectValidThreadState() {
444 // Normal JNI always transitions to "Native". Other JNIs stay in the "Runnable" state.
445 if (IsCurrentJniNormal()) {
446 EXPECT_EQ(kNative, Thread::Current()->GetState());
447 } else {
448 EXPECT_EQ(kRunnable, Thread::Current()->GetState());
449 }
450}
451
452#define EXPECT_THREAD_STATE_FOR_CURRENT_JNI() expectValidThreadState()
453
454static void expectValidMutatorLockHeld() {
455 if (IsCurrentJniNormal()) {
456 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
457 } else {
458 Locks::mutator_lock_->AssertSharedHeld(Thread::Current());
459 }
460}
461
462#define EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI() expectValidMutatorLockHeld()
463
464static void expectValidJniEnvAndObject(JNIEnv* env, jobject thisObj) {
465 if (!IsCurrentJniCritical()) {
466 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
467 ASSERT_TRUE(thisObj != nullptr);
468 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
469 } else {
470 LOG(FATAL) << "Objects are not supported for @CriticalNative, why is this being tested?";
471 UNREACHABLE();
472 }
473}
474
475// Validates the JNIEnv to be the same as the current thread's JNIEnv, and makes sure
476// that the object here is an instance of the class we registered the method with.
477//
478// Hard-fails if this somehow gets invoked for @CriticalNative since objects are unsupported.
479#define EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj) \
480 expectValidJniEnvAndObject(env, thisObj)
481
482static void expectValidJniEnvAndClass(JNIEnv* env, jclass kls) {
483 if (!IsCurrentJniCritical()) {
484 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
485 ASSERT_TRUE(kls != nullptr);
486 EXPECT_TRUE(env->IsSameObject(static_cast<jobject>(JniCompilerTest::jklass_),
487 static_cast<jobject>(kls)));
488 } else {
489 // This is pretty much vacuously true but catch any testing setup mistakes.
490 EXPECT_EQ(env, kCriticalDummyJniEnv);
491 EXPECT_EQ(kls, kCriticalDummyJniClass);
492 }
493}
494
495// Validates the JNIEnv is the same as the current thread's JNIenv, and makes sure
496// that the jclass we got in the JNI handler is the same one as the class the method was looked
497// up for.
498//
499// (Checks are skipped for @CriticalNative since the two values are dummy).
500#define EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls) expectValidJniEnvAndClass(env, kls)
501
502// Temporarily disable the EXPECT_NUM_STACK_REFERENCES check (for a single test).
503struct ScopedDisableCheckNumStackReferences {
504 ScopedDisableCheckNumStackReferences() {
Igor Murashkin06a04e02016-09-13 15:57:37 -0700505 CHECK(sCheckNumStackReferences); // No nested support.
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700506 sCheckNumStackReferences = false;
507 }
508
509 ~ScopedDisableCheckNumStackReferences() {
510 sCheckNumStackReferences = true;
511 }
512
513 static bool sCheckNumStackReferences;
514};
515
516bool ScopedDisableCheckNumStackReferences::sCheckNumStackReferences = true;
517
518static void expectNumStackReferences(size_t val1, size_t val2) {
519 // In rare cases when JNI functions call themselves recursively,
520 // disable this test because it will have a false negative.
521 if (!IsCurrentJniCritical() && ScopedDisableCheckNumStackReferences::sCheckNumStackReferences) {
522 /* @CriticalNative doesn't build a HandleScope, so this test is meaningless then. */
523 ScopedObjectAccess soa(Thread::Current());
524
525 size_t actual_num = Thread::Current()->NumStackReferences();
526 // XX: Not too sure what's going on.
527 // Sometimes null references get placed and sometimes they don't?
528 EXPECT_TRUE(val1 == actual_num || val2 == actual_num)
529 << "expected either " << val1 << " or " << val2
530 << " number of stack references, but got: " << actual_num;
531 }
532}
533
534#define EXPECT_NUM_STACK_REFERENCES(val1, val2) expectNumStackReferences(val1, val2)
535
536template <typename T, T fn>
537struct make_jni_test_decorator;
538
539// Decorator for "static" JNI callbacks.
540template <typename R, typename ... Args, R fn(JNIEnv*, jclass, Args...)>
541struct make_jni_test_decorator<R(JNIEnv*, jclass kls, Args...), fn> {
542 static R apply(JNIEnv* env, jclass kls, Args ... args) {
543 EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
544 EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
545 EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls);
546 // All incoming parameters + the jclass get put into the transition's StackHandleScope.
547 EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(kls, args...),
548 (count_refs_helper<jclass, Args...>::value));
549
550 return fn(env, kls, args...);
551 }
552};
553
554// Decorator for instance JNI callbacks.
555template <typename R, typename ... Args, R fn(JNIEnv*, jobject, Args...)>
556struct make_jni_test_decorator<R(JNIEnv*, jobject, Args...), fn> {
557 static R apply(JNIEnv* env, jobject thisObj, Args ... args) {
558 EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
559 EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
560 EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj);
561 // All incoming parameters + the implicit 'this' get put into the transition's StackHandleScope.
562 EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(thisObj, args...),
563 (count_refs_helper<jobject, Args...>::value));
564
565 return fn(env, thisObj, args...);
566 }
567};
568
569// Decorate the regular JNI callee with the extra gtest checks.
570// This way we can have common test logic for everything generic like checking if a lock is held,
571// checking handle scope state, etc.
572#define MAKE_JNI_TEST_DECORATOR(fn) make_jni_test_decorator<decltype(fn), (fn)>::apply
573
574// Convert function f(JNIEnv*,jclass,a,b,c,d...) into f2(a,b,c,d...)
575// -- This way we don't have to write out each implementation twice for @CriticalNative.
576#define JNI_CRITICAL_WRAPPER(func) jni_remove_extra_parameters<decltype(func), (func)>::apply
577// Get a function pointer whose calling convention either matches a regular native
578// or a critical native depending on which kind of jni is currently under test.
579// -- This also has the benefit of genering a compile time error if the 'func' doesn't properly
580// have JNIEnv and jclass parameters first.
581#define CURRENT_JNI_WRAPPER(func) \
582 (IsCurrentJniCritical() \
583 ? reinterpret_cast<void*>(&JNI_CRITICAL_WRAPPER(MAKE_JNI_TEST_DECORATOR(func))) \
584 : reinterpret_cast<void*>(&MAKE_JNI_TEST_DECORATOR(func)))
585
586// Do the opposite of the above. Do *not* wrap the function, instead just cast it to a void*.
587// Only for "TEST_JNI_NORMAL_ONLY" configs, and it inserts a test assert to ensure this is the case.
588#define NORMAL_JNI_ONLY_NOWRAP(func) \
589 ({ ASSERT_TRUE(IsCurrentJniNormal()); reinterpret_cast<void*>(&(func)); })
590// Same as above, but with nullptr. When we want to test the stub functionality.
591#define NORMAL_JNI_ONLY_NULLPTR \
592 ({ ASSERT_TRUE(IsCurrentJniNormal()); nullptr; })
593
594
595int gJava_MyClassNatives_foo_calls[kJniKindCount] = {};
596void Java_MyClassNatives_foo(JNIEnv*, jobject) {
597 gJava_MyClassNatives_foo_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700598}
599
Andreas Gampe6e498692014-08-18 16:43:12 -0700600void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700601 SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700602
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700603 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700604 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700605 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700606 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700607 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700608
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700609 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700610}
611
Andreas Gampe6e498692014-08-18 16:43:12 -0700612JNI_TEST(CompileAndRunNoArgMethod)
613
614void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700615 SetUpForTest(false, "bar", "(I)I", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700616 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700617
Shih-wei Liao31384c52011-09-06 15:27:45 -0700618 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800619 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700620 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700621 << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700622
623 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
624 EXPECT_EQ(25, result);
625}
626
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700627// TODO: Support @FastNative and @CriticalNative through stubs.
628JNI_TEST_NORMAL_ONLY(CompileAndRunIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700629
630void JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700631 SetUpForTest(true, "sbar", "(I)I", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700632 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800633
634 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800635 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700636 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700637 << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800638
639 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
640 EXPECT_EQ(43, result);
641}
642
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700643// TODO: Support @FastNative and @CriticalNative through stubs.
644JNI_TEST_NORMAL_ONLY(CompileAndRunStaticIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700645
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700646int gJava_MyClassNatives_fooI_calls[kJniKindCount] = {};
647jint Java_MyClassNatives_fooI(JNIEnv*, jobject, jint x) {
648 gJava_MyClassNatives_fooI_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700649 return x;
650}
651
Andreas Gampe6e498692014-08-18 16:43:12 -0700652void JniCompilerTest::CompileAndRunIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700653 SetUpForTest(false, "fooI", "(I)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700654 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700655
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700656 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700657 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
658 EXPECT_EQ(42, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700659 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700660 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
661 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700662 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700663
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700664 gJava_MyClassNatives_fooI_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700665}
666
Andreas Gampe6e498692014-08-18 16:43:12 -0700667JNI_TEST(CompileAndRunIntMethod)
668
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700669int gJava_MyClassNatives_fooII_calls[kJniKindCount] = {};
670jint Java_MyClassNatives_fooII(JNIEnv*, jobject, jint x, jint y) {
671 gJava_MyClassNatives_fooII_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700672 return x - y; // non-commutative operator
673}
674
Andreas Gampe6e498692014-08-18 16:43:12 -0700675void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700676 SetUpForTest(false, "fooII", "(II)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700677 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700678
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700679 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700680 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
681 EXPECT_EQ(99 - 10, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700682 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700683 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
684 0xCAFED00D);
685 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700686 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700687
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700688 gJava_MyClassNatives_fooII_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700689}
690
Andreas Gampe6e498692014-08-18 16:43:12 -0700691JNI_TEST(CompileAndRunIntIntMethod)
692
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700693int gJava_MyClassNatives_fooJJ_calls[kJniKindCount] = {};
694jlong Java_MyClassNatives_fooJJ(JNIEnv*, jobject, jlong x, jlong y) {
695 gJava_MyClassNatives_fooJJ_calls[gCurrentJni]++;
Ian Rogers9b269d22011-09-04 14:06:05 -0700696 return x - y; // non-commutative operator
697}
698
Andreas Gampe6e498692014-08-18 16:43:12 -0700699void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700700 SetUpForTest(false, "fooJJ", "(JJ)J",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700701 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700702
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700703 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Ian Rogers0f678472014-03-10 16:18:37 -0700704 jlong a = INT64_C(0x1234567890ABCDEF);
705 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700706 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
707 EXPECT_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700708 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Ian Rogers9b269d22011-09-04 14:06:05 -0700709 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
710 EXPECT_EQ(b - a, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700711 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700712
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700713 gJava_MyClassNatives_fooJJ_calls[gCurrentJni] = 0;
Ian Rogers9b269d22011-09-04 14:06:05 -0700714}
715
Andreas Gampe6e498692014-08-18 16:43:12 -0700716JNI_TEST(CompileAndRunLongLongMethod)
717
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700718int gJava_MyClassNatives_fooDD_calls[kJniKindCount] = {};
719jdouble Java_MyClassNatives_fooDD(JNIEnv*, jobject, jdouble x, jdouble y) {
720 gJava_MyClassNatives_fooDD_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700721 return x - y; // non-commutative operator
722}
723
Andreas Gampe6e498692014-08-18 16:43:12 -0700724void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700725 SetUpForTest(false, "fooDD", "(DD)D",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700726 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700727
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700728 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700729 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
730 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700731 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700732 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700733 jdouble a = 3.14159265358979323846;
734 jdouble b = 0.69314718055994530942;
735 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700736 EXPECT_DOUBLE_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700737 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700738
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700739 gJava_MyClassNatives_fooDD_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700740}
741
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700742int gJava_MyClassNatives_fooJJ_synchronized_calls[kJniKindCount] = {};
743jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv*, jobject, jlong x, jlong y) {
744 gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]++;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700745 return x | y;
746}
747
Andreas Gampe6e498692014-08-18 16:43:12 -0700748void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700749 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700750 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ_synchronized));
Elliott Hughes3e778f72012-05-21 15:29:52 -0700751
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700752 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700753 jlong a = 0x1000000020000000ULL;
754 jlong b = 0x00ff000000aa0000ULL;
755 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
756 EXPECT_EQ(a | b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700757 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700758
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700759 gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni] = 0;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700760}
761
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700762JNI_TEST_NORMAL_ONLY(CompileAndRun_fooJJ_synchronized)
Andreas Gampe6e498692014-08-18 16:43:12 -0700763
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700764int gJava_MyClassNatives_fooIOO_calls[kJniKindCount] = {};
765jobject Java_MyClassNatives_fooIOO(JNIEnv*, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700766 jobject z) {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700767 gJava_MyClassNatives_fooIOO_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700768 switch (x) {
769 case 1:
770 return y;
771 case 2:
772 return z;
773 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700774 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700775 }
776}
777
Andreas Gampe6e498692014-08-18 16:43:12 -0700778void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700779 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700780 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700781 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700782
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700783 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700784 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700785 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700786 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700787
Andreas Gampecf4035a2014-05-28 22:43:01 -0700788 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700789 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700790 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700791 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
792 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700793 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700794 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700795 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700796 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700797
Andreas Gampecf4035a2014-05-28 22:43:01 -0700798 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700799 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700800 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700801 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700802 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700803 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700804 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
805 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700806 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700807
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700808 gJava_MyClassNatives_fooIOO_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700809}
810
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700811// TODO: Maybe. @FastNative support for returning Objects?
812JNI_TEST_NORMAL_ONLY(CompileAndRunIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700813
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700814int gJava_MyClassNatives_fooSII_calls[kJniKindCount] = {};
815jint Java_MyClassNatives_fooSII(JNIEnv* env ATTRIBUTE_UNUSED,
816 jclass klass ATTRIBUTE_UNUSED,
817 jint x,
818 jint y) {
819 gJava_MyClassNatives_fooSII_calls[gCurrentJni]++;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700820 return x + y;
821}
822
Andreas Gampe6e498692014-08-18 16:43:12 -0700823void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700824 SetUpForTest(true, "fooSII", "(II)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700825 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700826
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700827 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700828 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
829 EXPECT_EQ(50, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700830 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700831
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700832 gJava_MyClassNatives_fooSII_calls[gCurrentJni] = 0;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700833}
834
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700835JNI_TEST_CRITICAL(CompileAndRunStaticIntIntMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700836
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700837int gJava_MyClassNatives_fooSDD_calls[kJniKindCount] = {};
838jdouble Java_MyClassNatives_fooSDD(JNIEnv* env ATTRIBUTE_UNUSED,
839 jclass klass ATTRIBUTE_UNUSED,
840 jdouble x,
841 jdouble y) {
842 gJava_MyClassNatives_fooSDD_calls[gCurrentJni]++;
Ian Rogers7a99c112011-09-07 12:48:27 -0700843 return x - y; // non-commutative operator
844}
845
Andreas Gampe6e498692014-08-18 16:43:12 -0700846void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700847 SetUpForTest(true, "fooSDD", "(DD)D",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700848 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700849
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700850 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Ian Rogers7a99c112011-09-07 12:48:27 -0700851 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700852 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700853 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Ian Rogers7a99c112011-09-07 12:48:27 -0700854 jdouble a = 3.14159265358979323846;
855 jdouble b = 0.69314718055994530942;
856 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700857 EXPECT_DOUBLE_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700858 EXPECT_DOUBLE_EQ(2, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700859
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700860 gJava_MyClassNatives_fooSDD_calls[gCurrentJni] = 0;
Ian Rogers7a99c112011-09-07 12:48:27 -0700861}
862
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700863JNI_TEST_CRITICAL(CompileAndRunStaticDoubleDoubleMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700864
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100865// The x86 generic JNI code had a bug where it assumed a floating
866// point return value would be in xmm0. We use log, to somehow ensure
867// the compiler will use the floating point stack.
868
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700869jdouble Java_MyClassNatives_logD(JNIEnv*, jclass, jdouble x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100870 return log(x);
871}
872
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700873jdouble Java_MyClassNatives_logD_notNormal(JNIEnv*, jclass, jdouble x) {
874 EXPECT_DOUBLE_EQ(2.0, x);
875 return log(x);
876}
877
Andreas Gampe6e498692014-08-18 16:43:12 -0700878void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700879 void* jni_handler;
880 if (IsCurrentJniNormal()) {
881 // This test seems a bit special, don't use a JNI wrapper here.
882 jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logD);
883 } else {
884 jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logD_notNormal);
885 }
886 SetUpForTest(true, "logD", "(D)D", jni_handler);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100887
888 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700889 EXPECT_DOUBLE_EQ(log(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100890}
891
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700892JNI_TEST_CRITICAL(RunStaticLogDoubleMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700893
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700894jfloat Java_MyClassNatives_logF(JNIEnv*, jclass, jfloat x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100895 return logf(x);
896}
897
Andreas Gampe6e498692014-08-18 16:43:12 -0700898void JniCompilerTest::RunStaticLogFloatMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700899 void* jni_handler;
900 if (IsCurrentJniNormal()) {
901 // This test seems a bit special, don't use a JNI wrapper here.
902 jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logF);
903 } else {
904 jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logF);
905 }
906
907 SetUpForTest(true, "logF", "(F)F", jni_handler);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100908
909 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700910 EXPECT_FLOAT_EQ(logf(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100911}
912
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700913JNI_TEST_CRITICAL(RunStaticLogFloatMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700914
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700915jboolean Java_MyClassNatives_returnTrue(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100916 return JNI_TRUE;
917}
918
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700919jboolean Java_MyClassNatives_returnFalse(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100920 return JNI_FALSE;
921}
922
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700923jint Java_MyClassNatives_returnInt(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100924 return 42;
925}
926
Andreas Gampe6e498692014-08-18 16:43:12 -0700927void JniCompilerTest::RunStaticReturnTrueImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700928 SetUpForTest(true, "returnTrue", "()Z", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnTrue));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100929
930 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
931 EXPECT_TRUE(result);
932}
933
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700934JNI_TEST_CRITICAL(RunStaticReturnTrue)
Andreas Gampe6e498692014-08-18 16:43:12 -0700935
936void JniCompilerTest::RunStaticReturnFalseImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100937 SetUpForTest(true, "returnFalse", "()Z",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700938 CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnFalse));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100939
940 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
941 EXPECT_FALSE(result);
942}
943
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700944JNI_TEST_CRITICAL(RunStaticReturnFalse)
Andreas Gampe6e498692014-08-18 16:43:12 -0700945
946void JniCompilerTest::RunGenericStaticReturnIntImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700947 SetUpForTest(true, "returnInt", "()I", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnInt));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100948
949 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
950 EXPECT_EQ(42, result);
951}
952
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700953JNI_TEST_CRITICAL(RunGenericStaticReturnInt)
Andreas Gampe6e498692014-08-18 16:43:12 -0700954
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700955int gJava_MyClassNatives_returnDouble_calls[kJniKindCount] = {};
956jdouble Java_MyClassNatives_returnDouble(JNIEnv*, jclass) {
957 gJava_MyClassNatives_returnDouble_calls[gCurrentJni]++;
958 return 4.0;
959}
960
961void JniCompilerTest::RunGenericStaticReturnDoubleImpl() {
962 SetUpForTest(true, "returnDouble", "()D", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnDouble));
963
964 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_);
965 EXPECT_DOUBLE_EQ(4.0, result);
966 EXPECT_EQ(1, gJava_MyClassNatives_returnDouble_calls[gCurrentJni]);
967
968 gJava_MyClassNatives_returnDouble_calls[gCurrentJni] = 0;
969}
970
971JNI_TEST_CRITICAL(RunGenericStaticReturnDouble)
972
973jlong Java_MyClassNatives_returnLong(JNIEnv*, jclass) {
974 return 0xFEEDDEADFEEDL;
975}
976
977void JniCompilerTest::RunGenericStaticReturnLongImpl() {
978 SetUpForTest(true, "returnLong", "()J", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnLong));
979
980 jlong result = env_->CallStaticLongMethod(jklass_, jmethod_);
981 EXPECT_EQ(0xFEEDDEADFEEDL, result);
982}
983
984JNI_TEST_CRITICAL(RunGenericStaticReturnLong)
985
986int gJava_MyClassNatives_fooSIOO_calls[kJniKindCount] = {};
987jobject Java_MyClassNatives_fooSIOO(JNIEnv*, jclass klass, jint x, jobject y, jobject z) {
988 gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700989 switch (x) {
990 case 1:
991 return y;
992 case 2:
993 return z;
994 default:
995 return klass;
996 }
997}
998
Andreas Gampe6e498692014-08-18 16:43:12 -0700999void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001000 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001001 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001002 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001003
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001004 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001005 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001006 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001007 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001008
Andreas Gampecf4035a2014-05-28 22:43:01 -07001009 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001010 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001011 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001012 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1013 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001014 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001015 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001016 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001017 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001018
Andreas Gampecf4035a2014-05-28 22:43:01 -07001019 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001020 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001021 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001022 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001023 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001024 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001025 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1026 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001027 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001028
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001029 gJava_MyClassNatives_fooSIOO_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001030}
1031
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001032// TODO: Maybe. @FastNative support for returning Objects?
1033JNI_TEST_NORMAL_ONLY(CompileAndRunStaticIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -07001034
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001035int gJava_MyClassNatives_fooSSIOO_calls[kJniKindCount] = {};
1036jobject Java_MyClassNatives_fooSSIOO(JNIEnv*, jclass klass, jint x, jobject y, jobject z) {
1037 gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]++;
Ian Rogersdf20fe02011-07-20 20:34:16 -07001038 switch (x) {
1039 case 1:
1040 return y;
1041 case 2:
1042 return z;
1043 default:
1044 return klass;
1045 }
1046}
1047
Andreas Gampe6e498692014-08-18 16:43:12 -07001048void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001049 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001050 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001051 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -07001052
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001053 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001054 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001055 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001056 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001057
Andreas Gampecf4035a2014-05-28 22:43:01 -07001058 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001059 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001060 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001061 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1062 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001063 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001064 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001065 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001066 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001067
Andreas Gampecf4035a2014-05-28 22:43:01 -07001068 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001069 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001070 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001071 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001072 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001073 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001074 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1075 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001076 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001077
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001078 gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni] = 0;
Ian Rogersdf20fe02011-07-20 20:34:16 -07001079}
1080
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001081// TODO: Maybe. @FastNative support for returning Objects?
1082JNI_TEST_NORMAL_ONLY(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -07001083
Elliott Hughesb264f082012-04-06 17:10:10 -07001084void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -07001085 jclass c = env->FindClass("java/lang/RuntimeException");
1086 env->ThrowNew(c, "hello");
1087}
Ian Rogers45a76cb2011-07-21 22:00:15 -07001088
Andreas Gampe6e498692014-08-18 16:43:12 -07001089void JniCompilerTest::ExceptionHandlingImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001090 {
1091 ASSERT_FALSE(runtime_->IsStarted());
1092 ScopedObjectAccess soa(Thread::Current());
1093 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -07001094
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001095 // all compilation needs to happen before Runtime::Start
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001096 CompileForTestWithCurrentJni(class_loader_, false, "foo", "()V");
1097 CompileForTestWithCurrentJni(class_loader_, false, "throwException", "()V");
1098 CompileForTestWithCurrentJni(class_loader_, false, "foo", "()V");
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001099 }
1100 // Start runtime to avoid re-initialization in SetupForTest.
1101 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -07001102 bool started = runtime_->Start();
1103 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -07001104
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001105 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -07001106
Ian Rogers67375ac2011-09-14 00:55:44 -07001107 // Check a single call of a JNI method is ok
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001108 SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001109 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001110 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogers67375ac2011-09-14 00:55:44 -07001111 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -07001112
Ian Rogers67375ac2011-09-14 00:55:44 -07001113 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001114 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
1115 SetUpForTest(false, "throwException", "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001116 CURRENT_JNI_WRAPPER(Java_MyClassNatives_throwException));
Elliott Hughesb264f082012-04-06 17:10:10 -07001117 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -07001118 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001119 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001120 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1121 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
1122 env_->ExceptionClear();
1123 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -07001124
Ian Rogers67375ac2011-09-14 00:55:44 -07001125 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001126 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001127 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001128 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001129
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001130 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Ian Rogers45a76cb2011-07-21 22:00:15 -07001131}
1132
Andreas Gampe6e498692014-08-18 16:43:12 -07001133JNI_TEST(ExceptionHandling)
1134
Elliott Hughesb264f082012-04-06 17:10:10 -07001135jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001136 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -07001137 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001138 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -07001139
1140 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +01001141 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -07001142 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Mathieu Chartier0795f232016-09-27 18:43:30 -07001143 ObjPtr<mirror::ObjectArray<mirror::StackTraceElement>> trace_array =
1144 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001145 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001146 EXPECT_EQ(11, trace_array->GetLength());
1147
Ian Rogersaaa20802011-09-11 21:47:37 -07001148 // Check stack trace entries have expected values
Andreas Gampe277ccbd2014-11-03 21:36:10 -08001149 for (int32_t j = 0; j < trace_array->GetLength(); ++j) {
1150 EXPECT_EQ(-2, trace_array->Get(j)->GetLineNumber());
1151 mirror::StackTraceElement* ste = trace_array->Get(j);
Ian Rogersaaa20802011-09-11 21:47:37 -07001152 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -07001153 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001154 EXPECT_EQ(("fooI" + CurrentJniStringSuffix()), ste->GetMethodName()->ToModifiedUtf8());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001155 }
Ian Rogersaaa20802011-09-11 21:47:37 -07001156
1157 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001158 return 0;
1159 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -07001160 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -07001161 EXPECT_TRUE(jklass != nullptr);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001162 jmethodID jmethod = env->GetMethodID(jklass,
1163 ("fooI" + CurrentJniStringSuffix()).c_str(),
1164 "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -07001165 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001166
Ian Rogersaaa20802011-09-11 21:47:37 -07001167 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001168 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -07001169
1170 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001171 return i + result;
1172 }
1173}
1174
Andreas Gampe6e498692014-08-18 16:43:12 -07001175void JniCompilerTest::NativeStackTraceElementImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001176 SetUpForTest(false, "fooI", "(I)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001177 CURRENT_JNI_WRAPPER(Java_MyClassNatives_nativeUpCall));
1178
1179 // Usual # local references on stack check fails because nativeUpCall calls itself recursively,
1180 // each time the # of local references will therefore go up.
1181 ScopedDisableCheckNumStackReferences disable_num_stack_check;
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001182 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001183
Ian Rogersaaa20802011-09-11 21:47:37 -07001184 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001185}
1186
Andreas Gampe6e498692014-08-18 16:43:12 -07001187JNI_TEST(NativeStackTraceElement)
1188
Elliott Hughesb264f082012-04-06 17:10:10 -07001189jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -07001190 return env->NewGlobalRef(x);
1191}
1192
Andreas Gampe6e498692014-08-18 16:43:12 -07001193void JniCompilerTest::ReturnGlobalRefImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001194 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001195 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -07001196 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
1197 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
1198 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
1199}
1200
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001201// TODO: Maybe. @FastNative support for returning objects?
1202JNI_TEST_NORMAL_ONLY(ReturnGlobalRef)
Andreas Gampe6e498692014-08-18 16:43:12 -07001203
Ian Rogersdc51b792011-09-22 20:41:37 -07001204jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
1205 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001206 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -07001207 for (int i = 0; i < 10; i++) {
Mathieu Chartier0795f232016-09-27 18:43:30 -07001208 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -07001209 }
1210 return x+1;
1211}
1212
Andreas Gampe6e498692014-08-18 16:43:12 -07001213void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001214 SetUpForTest(false, "fooI", "(I)I", CURRENT_JNI_WRAPPER(local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -07001215 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -07001216 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -07001217 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
1218 EXPECT_TRUE(result == i + 1);
1219 }
1220}
1221
Andreas Gampe6e498692014-08-18 16:43:12 -07001222JNI_TEST(LocalReferenceTableClearingTest)
1223
Ian Rogersb9231c82011-09-05 22:13:19 -07001224void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
1225 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
1226 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -07001227 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -07001228 EXPECT_EQ(1234, src_pos);
1229 EXPECT_EQ(5678, dst_pos);
1230 EXPECT_EQ(9876, length);
1231}
1232
Andreas Gampe6e498692014-08-18 16:43:12 -07001233void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001234 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001235 CURRENT_JNI_WRAPPER(my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -07001236 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -07001237}
1238
Andreas Gampe6e498692014-08-18 16:43:12 -07001239JNI_TEST(JavaLangSystemArrayCopy)
1240
Ian Rogers67375ac2011-09-14 00:55:44 -07001241jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
1242 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
1243 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -07001244 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -07001245 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
1246 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
1247 return JNI_TRUE;
1248}
1249
Andreas Gampe6e498692014-08-18 16:43:12 -07001250void JniCompilerTest::CompareAndSwapIntImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001251 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001252 CURRENT_JNI_WRAPPER(my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -07001253 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
1254 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -07001255 EXPECT_EQ(result, JNI_TRUE);
1256}
1257
Andreas Gampe6e498692014-08-18 16:43:12 -07001258JNI_TEST(CompareAndSwapInt)
1259
Ian Rogersc7792842012-03-03 15:36:20 -08001260jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
1261 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
1262 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
1263 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
1264 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
1265 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
1266 return 42;
1267}
1268
Andreas Gampe6e498692014-08-18 16:43:12 -07001269void JniCompilerTest::GetTextImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001270 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001271 CURRENT_JNI_WRAPPER(my_gettext));
Ian Rogersc7792842012-03-03 15:36:20 -08001272 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -07001273 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -08001274 EXPECT_EQ(result, 42);
1275}
1276
Andreas Gampe6e498692014-08-18 16:43:12 -07001277JNI_TEST(GetText)
1278
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001279int gJava_MyClassNatives_GetSinkProperties_calls[kJniKindCount] = {};
1280jarray Java_MyClassNatives_GetSinkProperties(JNIEnv*, jobject thisObj, jstring s) {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001281 EXPECT_EQ(s, nullptr);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001282 gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]++;
1283
1284 Thread* self = Thread::Current();
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001285 ScopedObjectAccess soa(self);
Mathieu Chartier0795f232016-09-27 18:43:30 -07001286 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object>(thisObj).Decode()));
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001287 return nullptr;
1288}
1289
Andreas Gampe6e498692014-08-18 16:43:12 -07001290void JniCompilerTest::GetSinkPropertiesNativeImpl() {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001291 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001292 CURRENT_JNI_WRAPPER(Java_MyClassNatives_GetSinkProperties));
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001293
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001294 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001295 jarray result = down_cast<jarray>(
1296 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
1297 EXPECT_EQ(nullptr, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001298 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001299
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001300 gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni] = 0;
Brian Carlstromfc7120c2012-08-27 13:43:25 -07001301}
1302
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001303// @FastNative doesn't support 'synchronized' keyword and
1304// never will -- locking functions aren't fast.
1305JNI_TEST_NORMAL_ONLY(GetSinkPropertiesNative)
Andreas Gampe6e498692014-08-18 16:43:12 -07001306
Elliott Hughesb264f082012-04-06 17:10:10 -07001307// This should return jclass, but we're imitating a bug pattern.
1308jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
1309 return env->NewStringUTF("not a class!");
1310}
1311
1312// This should return jclass, but we're imitating a bug pattern.
1313jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
1314 return env->NewStringUTF("not a class!");
1315}
1316
Andreas Gampe6e498692014-08-18 16:43:12 -07001317void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001318 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001319 CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldReturnClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001320
1321 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001322 // This native method is bad, and tries to return a jstring as a jclass.
1323 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001324 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1325 "of java.lang.String from java.lang.Class " +
1326 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1327 CurrentJniStringSuffix() + "()");
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001328
1329 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -07001330 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001331 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1332 "of java.lang.String from java.lang.Class " +
1333 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1334 CurrentJniStringSuffix() + "()");
Ian Rogers68d8b422014-07-17 11:09:10 -07001335 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001336 check_jni_abort_catcher.Check(std::string() + "calling non-static method " +
1337 "java.lang.Class " +
1338 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1339 CurrentJniStringSuffix() + "() with CallStaticObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001340}
1341
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001342// TODO: Maybe support returning objects for @FastNative?
1343JNI_TEST_NORMAL_ONLY(UpcallReturnTypeChecking_Instance)
Andreas Gampe6e498692014-08-18 16:43:12 -07001344
1345void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001346 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001347 CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldReturnClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001348
1349 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001350 // This native method is bad, and tries to return a jstring as a jclass.
1351 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001352 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1353 "of java.lang.String from java.lang.Class " +
1354 "MyClassNatives.staticMethodThatShouldReturnClass" +
1355 CurrentJniStringSuffix() + "()");
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001356
1357 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -07001358 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001359 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1360 "of java.lang.String from java.lang.Class " +
1361 "MyClassNatives.staticMethodThatShouldReturnClass" +
1362 CurrentJniStringSuffix() + "()");
Ian Rogers68d8b422014-07-17 11:09:10 -07001363 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001364 check_jni_abort_catcher.Check(std::string() + "calling static method " +
1365 "java.lang.Class " +
1366 "MyClassNatives.staticMethodThatShouldReturnClass" +
1367 CurrentJniStringSuffix() + "() with CallObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001368}
1369
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001370// TODO: Maybe support returning objects for @FastNative?
1371JNI_TEST_NORMAL_ONLY(UpcallReturnTypeChecking_Static)
Andreas Gampe6e498692014-08-18 16:43:12 -07001372
Elliott Hughesb264f082012-04-06 17:10:10 -07001373// This should take jclass, but we're imitating a bug pattern.
1374void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
1375}
1376
1377// This should take jclass, but we're imitating a bug pattern.
1378void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
1379}
1380
Andreas Gampe6e498692014-08-18 16:43:12 -07001381void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001382 // This will lead to error messages in the log.
1383 ScopedLogSeverity sls(LogSeverity::FATAL);
1384
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001385 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001386 CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldTakeClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001387
1388 CheckJniAbortCatcher check_jni_abort_catcher;
1389 // We deliberately pass a bad second argument here.
1390 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001391 check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1392 "MyClassNatives.instanceMethodThatShouldTakeClass" +
1393 CurrentJniStringSuffix() + "(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001394}
1395
Andreas Gampe6e498692014-08-18 16:43:12 -07001396JNI_TEST(UpcallArgumentTypeChecking_Instance)
1397
1398void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001399 // This will lead to error messages in the log.
1400 ScopedLogSeverity sls(LogSeverity::FATAL);
1401
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001402 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001403 CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldTakeClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001404
1405 CheckJniAbortCatcher check_jni_abort_catcher;
1406 // We deliberately pass a bad second argument here.
1407 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001408 check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1409 "MyClassNatives.staticMethodThatShouldTakeClass" +
1410 CurrentJniStringSuffix() + "(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001411}
1412
Andreas Gampe6e498692014-08-18 16:43:12 -07001413JNI_TEST(UpcallArgumentTypeChecking_Static)
1414
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001415jfloat Java_MyClassNatives_checkFloats(JNIEnv*, jobject, jfloat f1, jfloat f2) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001416 return f1 - f2; // non-commutative operator
1417}
1418
Andreas Gampe6e498692014-08-18 16:43:12 -07001419void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001420 SetUpForTest(false, "checkFloats", "(FF)F",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001421 CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkFloats));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001422
1423 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1424 99.0F, 10.0F);
Ian Rogers647b1a82014-10-10 11:02:11 -07001425 EXPECT_FLOAT_EQ(99.0F - 10.0F, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001426 jfloat a = 3.14159F;
1427 jfloat b = 0.69314F;
1428 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -07001429 EXPECT_FLOAT_EQ(a - b, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001430}
1431
Andreas Gampe6e498692014-08-18 16:43:12 -07001432JNI_TEST(CompileAndRunFloatFloatMethod)
1433
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001434void Java_MyClassNatives_checkParameterAlign(JNIEnv* env ATTRIBUTE_UNUSED,
1435 jobject thisObj ATTRIBUTE_UNUSED,
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001436 jint i1,
1437 jlong l1) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001438 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -07001439 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001440}
1441
Andreas Gampe6e498692014-08-18 16:43:12 -07001442void JniCompilerTest::CheckParameterAlignImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001443 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001444 CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkParameterAlign));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001445
Ian Rogers0f678472014-03-10 16:18:37 -07001446 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001447}
1448
Andreas Gampe6e498692014-08-18 16:43:12 -07001449JNI_TEST(CheckParameterAlign)
1450
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001451void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject,
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001452 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1453 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1454 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1455 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1456 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1457 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1458 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1459 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1460 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1461 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1462 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1463 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1464 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1465 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1466 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1467 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1468 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1469 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1470 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1471 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1472 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1473 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1474 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1475 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1476 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1477 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1478 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1479 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1480 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1481 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1482 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1483 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001484 // two tests possible
1485 if (o0 == nullptr) {
1486 // 1) everything is null
1487 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1488 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1489 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1490 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1491 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1492 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1493 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1494 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1495 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1496 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1497 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1498 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1499 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1500 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1501 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1502 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1503 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1504 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1505 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1506 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1507 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1508 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1509 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1510 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1511 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1512 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1513 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1514 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1515 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1516 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1517 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1518 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1519 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1520 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1521 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1522 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1523 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1524 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1525 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1526 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1527 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1528 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1529 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1530 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1531 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1532 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1533 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1534 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1535 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1536 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1537 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1538 } else {
1539 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1540 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1541 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1542 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1543 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1544 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1545 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1546 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1547 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1548 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1549 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1550 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1551 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1552 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1553 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1554 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1555 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1556 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1557 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1558 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1559 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1560 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1561 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1562 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1563 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1564 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1565 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1566 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1567 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1568 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1569 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1570 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1571 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1572 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1573 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1574 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1575 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1576 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1577 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1578 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1579 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1580 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1581 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1582 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1583 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1584 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1585 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1586 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1587 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1588 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1589 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1590 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1591 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1592 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1593 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1594 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1595 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1596 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1597 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1598 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1599 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1600 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1601 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1602 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1603 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1604 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1605 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1606 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1607 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1608 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1609 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1610 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1611 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1612 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1613 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1614 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1615 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1616 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1617 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1618 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1619 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1620 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1621 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1622 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1623 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1624 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1625 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1626 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1627 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1628 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1629 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1630 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1631 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1632 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1633 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1634 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1635 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1636 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1637 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1638 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1639 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1640 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1641 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1642 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1643 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1644 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1645 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1646 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1647 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1648 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1649 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1650 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1651 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1652 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1653 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1654 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1655 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1656 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1657 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1658 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1659 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1660 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1661 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1662 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1663 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1664 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1665 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1666 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1667 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1668 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1669 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1670 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1671 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1672 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1673 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1674 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1675 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1676 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1677 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1678 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1679 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1680 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1681 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1682 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1683 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1684 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1685 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1686 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1687 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1688 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1689 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1690 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1691 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1692 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1693 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1694 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1695 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1696 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1697 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1698 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1699 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1700 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1701 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1702 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1703 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1704 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1705 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1706 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1707 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1708 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1709 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1710 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1711 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1712 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1713 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1714 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1715 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1716 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1717 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1718 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1719 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1720 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1721 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1722 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1723 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1724 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1725 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1726 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1727 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1728 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1729 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1730 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1731 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1732 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1733 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1734 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1735 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1736 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1737 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1738 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1739 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1740 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1741 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1742 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1743 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1744 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1745 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1746 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1747 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1748 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1749 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1750 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1751 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1752 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1753 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1754 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1755 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1756 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1757 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1758 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1759 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1760 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1761 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1762 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1763 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1764 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1765 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1766 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1767 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1768 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1769 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1770 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1771 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1772 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1773 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1774 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1775 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1776 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1777 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1778 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1779 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1780 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1781 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1782 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1783 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1784 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1785 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1786 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1787 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1788 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1789 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1790 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1791 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1792 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1793 }
1794}
1795
1796const char* longSig =
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;Ljava/lang/Object;"
1847 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1848
Andreas Gampe6e498692014-08-18 16:43:12 -07001849void JniCompilerTest::MaxParamNumberImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001850 SetUpForTest(false, "maxParamNumber", longSig,
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001851 CURRENT_JNI_WRAPPER(Java_MyClassNatives_maxParamNumber));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001852
1853 jvalue args[254];
1854
1855 // First test: test with all arguments null.
1856 for (int i = 0; i < 254; ++i) {
1857 args[i].l = nullptr;
1858 }
1859
1860 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1861
1862 // Second test: test with int[] objects with increasing lengths
1863 for (int i = 0; i < 254; ++i) {
1864 jintArray tmp = env_->NewIntArray(i);
1865 args[i].l = tmp;
1866 EXPECT_NE(args[i].l, nullptr);
1867 }
1868
1869 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1870}
1871
Andreas Gampe6e498692014-08-18 16:43:12 -07001872JNI_TEST(MaxParamNumber)
1873
1874void JniCompilerTest::WithoutImplementationImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001875 // This will lead to error messages in the log.
1876 ScopedLogSeverity sls(LogSeverity::FATAL);
1877
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001878 SetUpForTest(false, "withoutImplementation", "()V", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampead615172014-04-04 16:20:13 -07001879
1880 env_->CallVoidMethod(jobj_, jmethod_);
1881
1882 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1883 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1884}
1885
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001886// TODO: Don't test @FastNative here since it goes through a stub lookup (unsupported) which would
1887// normally fail with an exception, but fails with an assert.
1888JNI_TEST_NORMAL_ONLY(WithoutImplementation)
Andreas Gampe6e498692014-08-18 16:43:12 -07001889
Andreas Gampe48ee3562015-04-10 19:57:29 -07001890void JniCompilerTest::WithoutImplementationRefReturnImpl() {
1891 // This will lead to error messages in the log.
1892 ScopedLogSeverity sls(LogSeverity::FATAL);
1893
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001894 SetUpForTest(false,
1895 "withoutImplementationRefReturn",
1896 "()Ljava/lang/Object;",
1897 NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampe48ee3562015-04-10 19:57:29 -07001898
1899 env_->CallObjectMethod(jobj_, jmethod_);
1900
1901 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1902 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1903}
1904
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001905// TODO: Should work for @FastNative too.
1906JNI_TEST_NORMAL_ONLY(WithoutImplementationRefReturn)
Andreas Gampe48ee3562015-04-10 19:57:29 -07001907
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001908void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv*, jclass, jint i1, jint i2, jint i3,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001909 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1910 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1911 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1912 jfloat f10) {
1913 EXPECT_EQ(i1, 1);
1914 EXPECT_EQ(i2, 2);
1915 EXPECT_EQ(i3, 3);
1916 EXPECT_EQ(i4, 4);
1917 EXPECT_EQ(i5, 5);
1918 EXPECT_EQ(i6, 6);
1919 EXPECT_EQ(i7, 7);
1920 EXPECT_EQ(i8, 8);
1921 EXPECT_EQ(i9, 9);
1922 EXPECT_EQ(i10, 10);
1923
Roland Levillainda4d79b2015-03-24 14:36:11 +00001924 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001925 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001926 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001927 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001928 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001929 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001930 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001931 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001932 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001933 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001934 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001935 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001936 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001937 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001938 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001939 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001940 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001941 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001942 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001943 EXPECT_EQ(i20, 20);
1944}
1945
Andreas Gampe6e498692014-08-18 16:43:12 -07001946void JniCompilerTest::StackArgsIntsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001947 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001948 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsIntsFirst));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001949
1950 jint i1 = 1;
1951 jint i2 = 2;
1952 jint i3 = 3;
1953 jint i4 = 4;
1954 jint i5 = 5;
1955 jint i6 = 6;
1956 jint i7 = 7;
1957 jint i8 = 8;
1958 jint i9 = 9;
1959 jint i10 = 10;
1960
Roland Levillainda4d79b2015-03-24 14:36:11 +00001961 jfloat f1 = bit_cast<jfloat, jint>(11);
1962 jfloat f2 = bit_cast<jfloat, jint>(12);
1963 jfloat f3 = bit_cast<jfloat, jint>(13);
1964 jfloat f4 = bit_cast<jfloat, jint>(14);
1965 jfloat f5 = bit_cast<jfloat, jint>(15);
1966 jfloat f6 = bit_cast<jfloat, jint>(16);
1967 jfloat f7 = bit_cast<jfloat, jint>(17);
1968 jfloat f8 = bit_cast<jfloat, jint>(18);
1969 jfloat f9 = bit_cast<jfloat, jint>(19);
1970 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001971
1972 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
1973 f3, f4, f5, f6, f7, f8, f9, f10);
1974}
1975
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001976JNI_TEST_CRITICAL(StackArgsIntsFirst)
Andreas Gampe6e498692014-08-18 16:43:12 -07001977
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001978void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv*, jclass, jfloat f1, jfloat f2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001979 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
1980 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
1981 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
1982 jint i9, jint i10) {
1983 EXPECT_EQ(i1, 1);
1984 EXPECT_EQ(i2, 2);
1985 EXPECT_EQ(i3, 3);
1986 EXPECT_EQ(i4, 4);
1987 EXPECT_EQ(i5, 5);
1988 EXPECT_EQ(i6, 6);
1989 EXPECT_EQ(i7, 7);
1990 EXPECT_EQ(i8, 8);
1991 EXPECT_EQ(i9, 9);
1992 EXPECT_EQ(i10, 10);
1993
Roland Levillainda4d79b2015-03-24 14:36:11 +00001994 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001995 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001996 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001997 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001998 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001999 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002000 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002001 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002002 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002003 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002004 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002005 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002006 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002007 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002008 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002009 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002010 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002011 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002012 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002013 EXPECT_EQ(i20, 20);
2014}
2015
Andreas Gampe6e498692014-08-18 16:43:12 -07002016void JniCompilerTest::StackArgsFloatsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002017 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002018 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsFloatsFirst));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002019
2020 jint i1 = 1;
2021 jint i2 = 2;
2022 jint i3 = 3;
2023 jint i4 = 4;
2024 jint i5 = 5;
2025 jint i6 = 6;
2026 jint i7 = 7;
2027 jint i8 = 8;
2028 jint i9 = 9;
2029 jint i10 = 10;
2030
Roland Levillainda4d79b2015-03-24 14:36:11 +00002031 jfloat f1 = bit_cast<jfloat, jint>(11);
2032 jfloat f2 = bit_cast<jfloat, jint>(12);
2033 jfloat f3 = bit_cast<jfloat, jint>(13);
2034 jfloat f4 = bit_cast<jfloat, jint>(14);
2035 jfloat f5 = bit_cast<jfloat, jint>(15);
2036 jfloat f6 = bit_cast<jfloat, jint>(16);
2037 jfloat f7 = bit_cast<jfloat, jint>(17);
2038 jfloat f8 = bit_cast<jfloat, jint>(18);
2039 jfloat f9 = bit_cast<jfloat, jint>(19);
2040 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002041
2042 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
2043 i4, i5, i6, i7, i8, i9, i10);
2044}
2045
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002046JNI_TEST_CRITICAL(StackArgsFloatsFirst)
Andreas Gampe6e498692014-08-18 16:43:12 -07002047
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07002048void Java_MyClassNatives_stackArgsMixed(JNIEnv*, jclass, jint i1, jfloat f1, jint i2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002049 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
2050 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
2051 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
2052 EXPECT_EQ(i1, 1);
2053 EXPECT_EQ(i2, 2);
2054 EXPECT_EQ(i3, 3);
2055 EXPECT_EQ(i4, 4);
2056 EXPECT_EQ(i5, 5);
2057 EXPECT_EQ(i6, 6);
2058 EXPECT_EQ(i7, 7);
2059 EXPECT_EQ(i8, 8);
2060 EXPECT_EQ(i9, 9);
2061 EXPECT_EQ(i10, 10);
2062
Roland Levillainda4d79b2015-03-24 14:36:11 +00002063 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002064 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002065 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002066 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002067 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002068 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002069 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002070 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002071 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002072 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002073 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002074 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002075 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002076 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002077 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002078 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002079 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002080 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002081 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002082 EXPECT_EQ(i20, 20);
2083}
2084
Andreas Gampe6e498692014-08-18 16:43:12 -07002085void JniCompilerTest::StackArgsMixedImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002086 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002087 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsMixed));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002088
2089 jint i1 = 1;
2090 jint i2 = 2;
2091 jint i3 = 3;
2092 jint i4 = 4;
2093 jint i5 = 5;
2094 jint i6 = 6;
2095 jint i7 = 7;
2096 jint i8 = 8;
2097 jint i9 = 9;
2098 jint i10 = 10;
2099
Roland Levillainda4d79b2015-03-24 14:36:11 +00002100 jfloat f1 = bit_cast<jfloat, jint>(11);
2101 jfloat f2 = bit_cast<jfloat, jint>(12);
2102 jfloat f3 = bit_cast<jfloat, jint>(13);
2103 jfloat f4 = bit_cast<jfloat, jint>(14);
2104 jfloat f5 = bit_cast<jfloat, jint>(15);
2105 jfloat f6 = bit_cast<jfloat, jint>(16);
2106 jfloat f7 = bit_cast<jfloat, jint>(17);
2107 jfloat f8 = bit_cast<jfloat, jint>(18);
2108 jfloat f9 = bit_cast<jfloat, jint>(19);
2109 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002110
2111 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
2112 f7, i8, f8, i9, f9, i10, f10);
2113}
2114
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002115JNI_TEST_CRITICAL(StackArgsMixed)
Andreas Gampe6e498692014-08-18 16:43:12 -07002116
Lazar Trsicf652d602015-06-24 16:30:21 +02002117void Java_MyClassNatives_stackArgsSignExtendedMips64(JNIEnv*, jclass, jint i1, jint i2, jint i3,
2118 jint i4, jint i5, jint i6, jint i7, jint i8) {
2119 EXPECT_EQ(i1, 1);
2120 EXPECT_EQ(i2, 2);
2121 EXPECT_EQ(i3, 3);
2122 EXPECT_EQ(i4, 4);
2123 EXPECT_EQ(i5, 5);
2124 EXPECT_EQ(i6, 6);
2125 EXPECT_EQ(i7, 7);
2126 EXPECT_EQ(i8, -8);
2127
2128#if defined(__mips__) && defined(__LP64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
2129 // Mips64 ABI requires that arguments passed through stack be sign-extended 8B slots.
2130 // First 8 arguments are passed through registers, check i7 and i8.
2131 uint32_t stack1_high = *(&i7 + 1);
2132 uint32_t stack2_high = *(&i8 + 1);
2133
2134 EXPECT_EQ(stack1_high, static_cast<uint32_t>(0));
2135 EXPECT_EQ(stack2_high, static_cast<uint32_t>(0xffffffff));
2136#else
2137 LOG(INFO) << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on "
2138 << kRuntimeISA;
2139 // Force-print to std::cout so it's also outside the logcat.
2140 std::cout << "Skipping stackArgsSignExtendedMips64 as there is nothing to be done on "
2141 << kRuntimeISA << std::endl;
2142#endif
2143}
2144
2145void JniCompilerTest::StackArgsSignExtendedMips64Impl() {
2146 SetUpForTest(true, "stackArgsSignExtendedMips64", "(IIIIIIII)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002147 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsSignExtendedMips64));
Lazar Trsicf652d602015-06-24 16:30:21 +02002148 jint i1 = 1;
2149 jint i2 = 2;
2150 jint i3 = 3;
2151 jint i4 = 4;
2152 jint i5 = 5;
2153 jint i6 = 6;
2154 jint i7 = 7;
2155 jint i8 = -8;
2156
2157 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8);
2158}
2159
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002160JNI_TEST_CRITICAL(StackArgsSignExtendedMips64)
Lazar Trsicf652d602015-06-24 16:30:21 +02002161
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002162void Java_MyClassNatives_normalNative(JNIEnv*, jclass) {
2163 // Intentionally left empty.
2164}
2165
2166// Methods not annotated with anything are not considered "fast native"
2167// -- Check that the annotation lookup does not find it.
2168void JniCompilerTest::NormalNativeImpl() {
2169 SetUpForTest(/* direct */ true,
2170 "normalNative",
2171 "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002172 CURRENT_JNI_WRAPPER(Java_MyClassNatives_normalNative));
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002173
2174 ScopedObjectAccess soa(Thread::Current());
2175 ArtMethod* method = soa.DecodeMethod(jmethod_);
2176 ASSERT_TRUE(method != nullptr);
2177
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002178 EXPECT_FALSE(method->IsAnnotatedWithCriticalNative());
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002179 EXPECT_FALSE(method->IsAnnotatedWithFastNative());
2180}
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002181
2182// TODO: just rename the java functions to the standard convention and remove duplicated tests
2183JNI_TEST_NORMAL_ONLY(NormalNative)
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002184
2185// Methods annotated with @FastNative are considered "fast native"
2186// -- Check that the annotation lookup succeeds.
2187void Java_MyClassNatives_fastNative(JNIEnv*, jclass) {
2188 // Intentionally left empty.
2189}
2190
2191void JniCompilerTest::FastNativeImpl() {
2192 SetUpForTest(/* direct */ true,
2193 "fastNative",
2194 "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002195 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fastNative));
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002196
2197 ScopedObjectAccess soa(Thread::Current());
2198 ArtMethod* method = soa.DecodeMethod(jmethod_);
2199 ASSERT_TRUE(method != nullptr);
2200
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002201 EXPECT_FALSE(method->IsAnnotatedWithCriticalNative());
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002202 EXPECT_TRUE(method->IsAnnotatedWithFastNative());
2203}
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002204
2205// TODO: just rename the java functions to the standard convention and remove duplicated tests
2206JNI_TEST_NORMAL_ONLY(FastNative)
2207
2208int gJava_myClassNatives_criticalNative_calls[kJniKindCount] = {};
2209// Methods annotated with @CriticalNative are considered "critical native"
2210// -- Check that the annotation lookup succeeds.
2211void Java_MyClassNatives_criticalNative() {
2212 gJava_myClassNatives_criticalNative_calls[gCurrentJni]++;
2213}
2214
2215void JniCompilerTest::CriticalNativeImpl() {
2216 SetUpForTest(/* direct */ true,
2217 // Important: Don't change the "current jni" yet to avoid a method name suffix.
2218 "criticalNative",
2219 "()V",
2220 // TODO: Use CURRENT_JNI_WRAPPER instead which is more generic.
2221 reinterpret_cast<void*>(&Java_MyClassNatives_criticalNative));
2222
2223 // TODO: remove this manual updating of the current JNI. Merge with the other tests.
2224 UpdateCurrentJni(JniKind::kCritical);
2225 ASSERT_TRUE(IsCurrentJniCritical());
2226
2227 ScopedObjectAccess soa(Thread::Current());
2228 ArtMethod* method = soa.DecodeMethod(jmethod_);
2229 ASSERT_TRUE(method != nullptr);
2230
2231 EXPECT_TRUE(method->IsAnnotatedWithCriticalNative());
2232 EXPECT_FALSE(method->IsAnnotatedWithFastNative());
2233
2234 EXPECT_EQ(0, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2235 env_->CallStaticVoidMethod(jklass_, jmethod_);
2236 EXPECT_EQ(1, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2237
2238 gJava_myClassNatives_criticalNative_calls[gCurrentJni] = 0;
2239}
2240
2241// TODO: just rename the java functions to the standard convention and remove duplicated tests
2242JNI_TEST_NORMAL_ONLY(CriticalNative)
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002243
Ian Rogersb033c752011-07-20 12:22:35 -07002244} // namespace art