blob: 21042a337dfc52e06a4f2915945a01a67301768f [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Ian Rogersb033c752011-07-20 12:22:35 -070016
Ian Rogers700a4022014-05-19 16:49:03 -070017#include <memory>
Igor Murashkin367f3dd2016-09-01 17:00:24 -070018#include <type_traits>
Ian Rogers700a4022014-05-19 16:49:03 -070019
Nicolas Geoffray54accbc2014-08-13 03:40:45 +010020#include <math.h>
21
Mathieu Chartiere401d142015-04-22 13:56:20 -070022#include "art_method-inl.h"
Pavle Batuta837e72a2016-03-16 11:31:46 +010023#include "base/bit_utils.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070024#include "class_linker.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080025#include "common_compiler_test.h"
Igor Murashkin367f3dd2016-09-01 17:00:24 -070026#include "compiler.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070027#include "dex_file.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070028#include "gtest/gtest.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070029#include "indirect_reference_table.h"
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070030#include "jni_internal.h"
Brian Carlstromdb4d5402011-08-09 12:18:28 -070031#include "mem_map.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070032#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080033#include "mirror/class_loader.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080034#include "mirror/object_array-inl.h"
Ian Rogers04d7aa92013-03-16 14:29:17 -070035#include "mirror/object-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080036#include "mirror/stack_trace_element.h"
Dimitry Ivanov5edb0632016-04-29 11:14:25 -070037#include "nativeloader/native_loader.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070038#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070039#include "ScopedLocalRef.h"
Mathieu Chartier0795f232016-09-27 18:43:30 -070040#include "scoped_thread_state_change-inl.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070041#include "thread.h"
Ian Rogersb033c752011-07-20 12:22:35 -070042
Elliott Hughesb264f082012-04-06 17:10:10 -070043extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080044 return count + 1;
45}
46
Elliott Hughesb264f082012-04-06 17:10:10 -070047extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
Ian Rogers1cefdbd2012-02-29 09:34:50 -080048 return count + 1;
49}
50
Ian Rogersb033c752011-07-20 12:22:35 -070051namespace art {
52
Igor Murashkin367f3dd2016-09-01 17:00:24 -070053enum class JniKind {
54 kNormal = Compiler::kNone, // Regular kind of un-annotated natives.
55 kFast = Compiler::kFastNative, // Native method annotated with @FastNative.
56 kCritical = Compiler::kCriticalNative, // Native method annotated with @CriticalNative.
57 kCount = Compiler::kCriticalNative + 1 // How many different types of JNIs we can have.
58};
59
60// Used to initialize array sizes that want to have different state per current jni.
61static constexpr size_t kJniKindCount = static_cast<size_t>(JniKind::kCount);
62// Do not use directly, use the helpers instead.
63uint32_t gCurrentJni = static_cast<uint32_t>(JniKind::kNormal);
64
65// Is the current native method under test @CriticalNative?
66static bool IsCurrentJniCritical() {
67 return gCurrentJni == static_cast<uint32_t>(JniKind::kCritical);
68}
69
70// Is the current native method a plain-old non-annotated native?
71static bool IsCurrentJniNormal() {
72 return gCurrentJni == static_cast<uint32_t>(JniKind::kNormal);
73}
74
75// Signifify that a different kind of JNI is about to be tested.
76static void UpdateCurrentJni(JniKind kind) {
77 gCurrentJni = static_cast<uint32_t>(kind);
78}
79
80// (Match the name suffixes of native methods in MyClassNatives.java)
81static std::string CurrentJniStringSuffix() {
82 switch (gCurrentJni) {
83 case static_cast<uint32_t>(JniKind::kNormal): {
84 return "";
85 }
86 case static_cast<uint32_t>(JniKind::kFast): {
87 return "_Fast";
88 }
89 case static_cast<uint32_t>(JniKind::kCritical): {
90 return "_Critical";
91 }
92 default:
93 LOG(FATAL) << "Invalid current JNI value: " << gCurrentJni;
94 UNREACHABLE();
95 }
96}
97
98// Dummy values passed to our JNI handlers when we enter @CriticalNative.
99// Normally @CriticalNative calling convention strips out the "JNIEnv*, jclass" parameters.
100// However to avoid duplicating every single test method we have a templated handler
101// that inserts dummy parameters (0,1) to make it compatible with a regular JNI handler.
102static JNIEnv* const kCriticalDummyJniEnv = reinterpret_cast<JNIEnv*>(0xDEADFEAD);
103static jclass const kCriticalDummyJniClass = reinterpret_cast<jclass>(0xBEAFBEEF);
104
105// Type trait. Returns true if "T" is the same type as one of the types in Args...
106//
107// Logically equal to OR(std::same_type<T, U> for all U in Args).
108template <typename T, typename ... Args>
109struct is_any_of;
110
111template <typename T, typename U, typename ... Args>
112struct is_any_of<T, U, Args ...> {
113 using value_type = bool;
114 static constexpr const bool value = std::is_same<T, U>::value || is_any_of<T, Args ...>::value;
115};
116
117template <typename T, typename U>
118struct is_any_of<T, U> {
119 using value_type = bool;
120 static constexpr const bool value = std::is_same<T, U>::value;
121};
122
123// Type traits for JNI types.
124template <typename T>
125struct jni_type_traits {
126 // True if type T ends up holding an object reference. False otherwise.
127 // (Non-JNI types will also be false).
128 static constexpr const bool is_ref =
129 is_any_of<T, jclass, jobject, jstring, jobjectArray, jintArray,
130 jcharArray, jfloatArray, jshortArray, jdoubleArray, jlongArray>::value;
131};
132
133template <typename ... Args>
134struct count_refs_helper {
135 using value_type = size_t;
136 static constexpr const size_t value = 0;
137};
138
139template <typename Arg, typename ... Args>
140struct count_refs_helper<Arg, Args ...> {
141 using value_type = size_t;
142 static constexpr size_t value =
143 (jni_type_traits<Arg>::is_ref ? 1 : 0) + count_refs_helper<Args ...>::value;
144};
145
146template <typename T, T fn>
147struct count_refs_fn_helper;
148
149template <typename R, typename ... Args, R fn(Args...)>
150struct count_refs_fn_helper<R(Args...), fn> : public count_refs_helper<Args...> {};
151
152// Given a function type 'T' figure out how many of the parameter types are a reference.
153// -- The implicit jclass and thisObject also count as 1 reference.
154//
155// Fields:
156// * value - the result counting # of refs
157// * value_type - the type of value (size_t)
158template <typename T, T fn>
159struct count_refs : public count_refs_fn_helper<T, fn> {};
160
161// Base case: No parameters = 0 refs.
162size_t count_nonnull_refs_helper() {
163 return 0;
164}
165
166// SFINAE for ref types. 1 if non-null, 0 otherwise.
167template <typename T>
168size_t count_nonnull_refs_single_helper(T arg,
169 typename std::enable_if<jni_type_traits<T>::is_ref>::type*
170 = nullptr) {
171 return ((arg == NULL) ? 0 : 1);
172}
173
174// SFINAE for non-ref-types. Always 0.
175template <typename T>
176size_t count_nonnull_refs_single_helper(T arg ATTRIBUTE_UNUSED,
177 typename std::enable_if<!jni_type_traits<T>::is_ref>::type*
178 = nullptr) {
179 return 0;
180}
181
182// Recursive case.
183template <typename T, typename ... Args>
184size_t count_nonnull_refs_helper(T arg, Args ... args) {
185 return count_nonnull_refs_single_helper(arg) + count_nonnull_refs_helper(args...);
186}
187
188// Given any list of parameters, check how many object refs there are and only count
189// them if their runtime value is non-null.
190//
191// For example given (jobject, jint, jclass) we can get (2) if both #0/#2 are non-null,
192// (1) if either #0/#2 are null but not both, and (0) if all parameters are null.
193// Primitive parameters (including JNIEnv*, if present) are ignored.
194template <typename ... Args>
195size_t count_nonnull_refs(Args ... args) {
196 return count_nonnull_refs_helper(args...);
197}
198
199template <typename T, T fn>
200struct remove_extra_parameters_helper;
201
202template <typename R, typename Arg1, typename Arg2, typename ... Args, R fn(Arg1, Arg2, Args...)>
203struct remove_extra_parameters_helper<R(Arg1, Arg2, Args...), fn> {
204 // Note: Do not use Args&& here to maintain C-style parameter types.
205 static R apply(Args... args) {
206 JNIEnv* env = kCriticalDummyJniEnv;
207 jclass kls = kCriticalDummyJniClass;
208 return fn(env, kls, args...);
209 }
210};
211
212// Given a function 'fn' create a function 'apply' which will omit the JNIEnv/jklass parameters
213//
214// i.e. if fn(JNIEnv*,jklass,a,b,c,d,e...) then apply(a,b,c,d,e,...)
215template <typename T, T fn>
216struct jni_remove_extra_parameters : public remove_extra_parameters_helper<T, fn> {};
217
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -0800218class JniCompilerTest : public CommonCompilerTest {
Ian Rogersb033c752011-07-20 12:22:35 -0700219 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700220 void SetUp() OVERRIDE {
221 CommonCompilerTest::SetUp();
222 check_generic_jni_ = false;
223 }
224
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700225 void TearDown() OVERRIDE {
226 android::ResetNativeLoader();
227 CommonCompilerTest::TearDown();
228 }
229
Andreas Gampe6e498692014-08-18 16:43:12 -0700230 void SetCheckGenericJni(bool generic) {
231 check_generic_jni_ = generic;
232 }
233
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700234 private:
235 void CompileForTest(jobject class_loader,
236 bool direct,
237 const char* method_name,
238 const char* method_sig) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700239 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartiereb8167a2014-05-07 15:43:14 -0700240 StackHandleScope<1> hs(soa.Self());
241 Handle<mirror::ClassLoader> loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -0700242 hs.NewHandle(soa.Decode<mirror::ClassLoader>(class_loader)));
Brian Carlstrom25c33252011-09-18 15:58:35 -0700243 // Compile the native method before starting the runtime
Ian Rogers98379392014-02-24 16:53:16 -0800244 mirror::Class* c = class_linker_->FindClass(soa.Self(), "LMyClassNatives;", loader);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700245 const auto pointer_size = class_linker_->GetImagePointerSize();
246 ArtMethod* method = direct ? c->FindDirectMethod(method_name, method_sig, pointer_size) :
247 c->FindVirtualMethod(method_name, method_sig, pointer_size);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700248 ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
Andreas Gampe6e498692014-08-18 16:43:12 -0700249 if (check_generic_jni_) {
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700250 method->SetEntryPointFromQuickCompiledCode(class_linker_->GetRuntimeQuickGenericJniStub());
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100251 } else {
Ian Rogers6f3dbba2014-10-14 17:41:57 -0700252 const void* code = method->GetEntryPointFromQuickCompiledCode();
253 if (code == nullptr || class_linker_->IsQuickGenericJniStub(code)) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100254 CompileMethod(method);
255 ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
256 << method_name << " " << method_sig;
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100257 }
Brian Carlstrom25c33252011-09-18 15:58:35 -0700258 }
Brian Carlstrom25c33252011-09-18 15:58:35 -0700259 }
260
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700261 protected:
262 void CompileForTestWithCurrentJni(jobject class_loader,
263 bool direct,
264 const char* method_name_orig,
265 const char* method_sig) {
266 // Append the JNI kind to the method name, so that we automatically get the
267 // fast or critical versions of the same method.
268 std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
269 const char* method_name = method_name_str.c_str();
270
271 CompileForTest(class_loader, direct, method_name, method_sig);
272 }
273
274 void SetUpForTest(bool direct,
275 const char* method_name_orig,
276 const char* method_sig,
Andreas Gampe6e498692014-08-18 16:43:12 -0700277 void* native_fnptr) {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700278 // Append the JNI kind to the method name, so that we automatically get the
279 // fast or critical versions of the same method.
280 std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
281 const char* method_name = method_name_str.c_str();
282
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700283 // Initialize class loader and compile method when runtime not started.
Brian Carlstrom2ce745c2013-07-17 17:44:30 -0700284 if (!runtime_->IsStarted()) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700285 {
286 ScopedObjectAccess soa(Thread::Current());
287 class_loader_ = LoadDex("MyClassNatives");
288 }
Andreas Gampe6e498692014-08-18 16:43:12 -0700289 CompileForTest(class_loader_, direct, method_name, method_sig);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700290 // Start runtime.
291 Thread::Current()->TransitionFromSuspendedToRunnable();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700292 android::InitializeNativeLoader();
Dimitry Ivanovc544f342016-05-09 16:26:13 -0700293 bool started = runtime_->Start();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -0700294 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -0700295 }
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700296 // JNI operations after runtime start.
Brian Carlstrom25c33252011-09-18 15:58:35 -0700297 env_ = Thread::Current()->GetJniEnv();
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700298 library_search_path_ = env_->NewStringUTF("");
Elliott Hughesb264f082012-04-06 17:10:10 -0700299 jklass_ = env_->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -0700300 ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700301
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700302 if (direct) {
303 jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
304 } else {
305 jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
306 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700307 ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700308
Andreas Gampecf4035a2014-05-28 22:43:01 -0700309 if (native_fnptr != nullptr) {
Elliott Hughesb25c3f62012-03-26 16:35:06 -0700310 JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
Brian Carlstromfc7120c2012-08-27 13:43:25 -0700311 ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
312 << method_name << " " << method_sig;
Ian Rogersbdb03912011-09-14 00:55:44 -0700313 } else {
314 env_->UnregisterNatives(jklass_);
Shih-wei Liao31384c52011-09-06 15:27:45 -0700315 }
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700316
317 jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
318 jobj_ = env_->NewObject(jklass_, constructor);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700319 ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
Ian Rogersb033c752011-07-20 12:22:35 -0700320 }
321
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700322 public:
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700323 // Available as statics so our JNI handlers can access these.
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700324 static jclass jklass_;
325 static jobject jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700326 static jobject class_loader_;
327
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700328 protected:
Andreas Gampe6e498692014-08-18 16:43:12 -0700329 // We have to list the methods here so we can share them between default and generic JNI.
330 void CompileAndRunNoArgMethodImpl();
331 void CompileAndRunIntMethodThroughStubImpl();
332 void CompileAndRunStaticIntMethodThroughStubImpl();
333 void CompileAndRunIntMethodImpl();
334 void CompileAndRunIntIntMethodImpl();
335 void CompileAndRunLongLongMethodImpl();
336 void CompileAndRunDoubleDoubleMethodImpl();
337 void CompileAndRun_fooJJ_synchronizedImpl();
338 void CompileAndRunIntObjectObjectMethodImpl();
339 void CompileAndRunStaticIntIntMethodImpl();
340 void CompileAndRunStaticDoubleDoubleMethodImpl();
341 void RunStaticLogDoubleMethodImpl();
342 void RunStaticLogFloatMethodImpl();
343 void RunStaticReturnTrueImpl();
344 void RunStaticReturnFalseImpl();
345 void RunGenericStaticReturnIntImpl();
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700346 void RunGenericStaticReturnDoubleImpl();
347 void RunGenericStaticReturnLongImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700348 void CompileAndRunStaticIntObjectObjectMethodImpl();
349 void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl();
350 void ExceptionHandlingImpl();
351 void NativeStackTraceElementImpl();
352 void ReturnGlobalRefImpl();
353 void LocalReferenceTableClearingTestImpl();
354 void JavaLangSystemArrayCopyImpl();
355 void CompareAndSwapIntImpl();
356 void GetTextImpl();
357 void GetSinkPropertiesNativeImpl();
358 void UpcallReturnTypeChecking_InstanceImpl();
359 void UpcallReturnTypeChecking_StaticImpl();
360 void UpcallArgumentTypeChecking_InstanceImpl();
361 void UpcallArgumentTypeChecking_StaticImpl();
362 void CompileAndRunFloatFloatMethodImpl();
363 void CheckParameterAlignImpl();
364 void MaxParamNumberImpl();
365 void WithoutImplementationImpl();
Andreas Gampe48ee3562015-04-10 19:57:29 -0700366 void WithoutImplementationRefReturnImpl();
Andreas Gampe6e498692014-08-18 16:43:12 -0700367 void StackArgsIntsFirstImpl();
368 void StackArgsFloatsFirstImpl();
369 void StackArgsMixedImpl();
Pavle Batuta837e72a2016-03-16 11:31:46 +0100370#if defined(__mips__) && defined(__LP64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
Lazar Trsicf652d602015-06-24 16:30:21 +0200371 void StackArgsSignExtendedMips64Impl();
Pavle Batuta837e72a2016-03-16 11:31:46 +0100372#endif
Andreas Gampe6e498692014-08-18 16:43:12 -0700373
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700374 void NormalNativeImpl();
375 void FastNativeImpl();
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700376 void CriticalNativeImpl();
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700377
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700378 JNIEnv* env_;
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700379 jstring library_search_path_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700380 jmethodID jmethod_;
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700381
382 private:
Andreas Gampe6e498692014-08-18 16:43:12 -0700383 bool check_generic_jni_;
Ian Rogersb033c752011-07-20 12:22:35 -0700384};
385
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700386jclass JniCompilerTest::jklass_;
387jobject JniCompilerTest::jobj_;
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700388jobject JniCompilerTest::class_loader_;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700389
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700390// Test the normal compiler and normal generic JNI only.
391// The following features are unsupported in @FastNative:
392// 1) JNI stubs (lookup via dlsym) when methods aren't explicitly registered
Igor Murashkinaf1e2992016-10-12 17:44:50 -0700393// 2) synchronized keyword
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700394// -- TODO: We can support (1) if we remove the mutator lock assert during stub lookup.
395# define JNI_TEST_NORMAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700396 TEST_F(JniCompilerTest, TestName ## NormalCompiler) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700397 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700398 SCOPED_TRACE("Normal JNI with compiler"); \
399 gCurrentJni = static_cast<uint32_t>(JniKind::kNormal); \
Andreas Gampe6e498692014-08-18 16:43:12 -0700400 TestName ## Impl(); \
401 } \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700402 TEST_F(JniCompilerTest, TestName ## NormalGeneric) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700403 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700404 SCOPED_TRACE("Normal JNI with generic"); \
405 gCurrentJni = static_cast<uint32_t>(JniKind::kNormal); \
Andreas Gampe6e498692014-08-18 16:43:12 -0700406 SetCheckGenericJni(true); \
407 TestName ## Impl(); \
408 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700409
Igor Murashkin06a04e02016-09-13 15:57:37 -0700410// Test (normal, @FastNative) x (compiler, generic).
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700411#define JNI_TEST(TestName) \
412 JNI_TEST_NORMAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700413 TEST_F(JniCompilerTest, TestName ## FastCompiler) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700414 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700415 SCOPED_TRACE("@FastNative JNI with compiler"); \
416 gCurrentJni = static_cast<uint32_t>(JniKind::kFast); \
417 TestName ## Impl(); \
418 } \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700419 \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700420 TEST_F(JniCompilerTest, TestName ## FastGeneric) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700421 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700422 SCOPED_TRACE("@FastNative JNI with generic"); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700423 gCurrentJni = static_cast<uint32_t>(JniKind::kFast); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700424 SetCheckGenericJni(true); \
425 TestName ## Impl(); \
426 }
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700427
Igor Murashkin06a04e02016-09-13 15:57:37 -0700428// Test (@CriticalNative) x (compiler, generic) only.
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700429#define JNI_TEST_CRITICAL_ONLY(TestName) \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700430 TEST_F(JniCompilerTest, TestName ## CriticalCompiler) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700431 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700432 SCOPED_TRACE("@CriticalNative JNI with compiler"); \
433 gCurrentJni = static_cast<uint32_t>(JniKind::kCritical); \
434 TestName ## Impl(); \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700435 } \
436 TEST_F(JniCompilerTest, TestName ## CriticalGeneric) { \
Igor Murashkina51d8b72016-10-05 14:33:30 -0700437 ScopedCheckHandleScope top_handle_scope_check; \
Igor Murashkin06a04e02016-09-13 15:57:37 -0700438 SCOPED_TRACE("@CriticalNative JNI with generic"); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700439 gCurrentJni = static_cast<uint32_t>(JniKind::kCritical); \
Igor Murashkin294a9152016-09-28 13:23:19 -0700440 SetCheckGenericJni(true); \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700441 TestName ## Impl(); \
442 }
Igor Murashkin06a04e02016-09-13 15:57:37 -0700443
444// Test everything: (normal, @FastNative, @CriticalNative) x (compiler, generic).
445#define JNI_TEST_CRITICAL(TestName) \
446 JNI_TEST(TestName) \
447 JNI_TEST_CRITICAL_ONLY(TestName) \
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700448
449static void expectValidThreadState() {
450 // Normal JNI always transitions to "Native". Other JNIs stay in the "Runnable" state.
451 if (IsCurrentJniNormal()) {
452 EXPECT_EQ(kNative, Thread::Current()->GetState());
453 } else {
454 EXPECT_EQ(kRunnable, Thread::Current()->GetState());
455 }
456}
457
458#define EXPECT_THREAD_STATE_FOR_CURRENT_JNI() expectValidThreadState()
459
460static void expectValidMutatorLockHeld() {
461 if (IsCurrentJniNormal()) {
462 Locks::mutator_lock_->AssertNotHeld(Thread::Current());
463 } else {
464 Locks::mutator_lock_->AssertSharedHeld(Thread::Current());
465 }
466}
467
468#define EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI() expectValidMutatorLockHeld()
469
470static void expectValidJniEnvAndObject(JNIEnv* env, jobject thisObj) {
471 if (!IsCurrentJniCritical()) {
472 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
473 ASSERT_TRUE(thisObj != nullptr);
474 EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
475 } else {
476 LOG(FATAL) << "Objects are not supported for @CriticalNative, why is this being tested?";
477 UNREACHABLE();
478 }
479}
480
481// Validates the JNIEnv to be the same as the current thread's JNIEnv, and makes sure
482// that the object here is an instance of the class we registered the method with.
483//
484// Hard-fails if this somehow gets invoked for @CriticalNative since objects are unsupported.
485#define EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj) \
486 expectValidJniEnvAndObject(env, thisObj)
487
488static void expectValidJniEnvAndClass(JNIEnv* env, jclass kls) {
489 if (!IsCurrentJniCritical()) {
490 EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
491 ASSERT_TRUE(kls != nullptr);
492 EXPECT_TRUE(env->IsSameObject(static_cast<jobject>(JniCompilerTest::jklass_),
493 static_cast<jobject>(kls)));
494 } else {
495 // This is pretty much vacuously true but catch any testing setup mistakes.
496 EXPECT_EQ(env, kCriticalDummyJniEnv);
497 EXPECT_EQ(kls, kCriticalDummyJniClass);
498 }
499}
500
501// Validates the JNIEnv is the same as the current thread's JNIenv, and makes sure
502// that the jclass we got in the JNI handler is the same one as the class the method was looked
503// up for.
504//
505// (Checks are skipped for @CriticalNative since the two values are dummy).
506#define EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls) expectValidJniEnvAndClass(env, kls)
507
508// Temporarily disable the EXPECT_NUM_STACK_REFERENCES check (for a single test).
509struct ScopedDisableCheckNumStackReferences {
510 ScopedDisableCheckNumStackReferences() {
Igor Murashkin06a04e02016-09-13 15:57:37 -0700511 CHECK(sCheckNumStackReferences); // No nested support.
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700512 sCheckNumStackReferences = false;
513 }
514
515 ~ScopedDisableCheckNumStackReferences() {
516 sCheckNumStackReferences = true;
517 }
518
519 static bool sCheckNumStackReferences;
520};
521
522bool ScopedDisableCheckNumStackReferences::sCheckNumStackReferences = true;
523
Igor Murashkina51d8b72016-10-05 14:33:30 -0700524// Check that the handle scope at the start of this block is the same as the handle scope at the end of the block.
525struct ScopedCheckHandleScope {
Igor Murashkin42298112016-10-06 10:51:11 -0700526 ScopedCheckHandleScope() : handle_scope_(Thread::Current()->GetTopHandleScope()) {
Igor Murashkina51d8b72016-10-05 14:33:30 -0700527 }
528
529 ~ScopedCheckHandleScope() {
530 EXPECT_EQ(handle_scope_, Thread::Current()->GetTopHandleScope())
531 << "Top-most handle scope must be the same after all the JNI "
532 << "invocations have finished (as before they were invoked).";
533 }
534
Mathieu Chartiere8a3c572016-10-11 16:52:17 -0700535 BaseHandleScope* const handle_scope_;
Igor Murashkina51d8b72016-10-05 14:33:30 -0700536};
537
Andreas Gampe0a855762016-10-26 13:43:14 -0700538// Number of references allocated in JNI ShadowFrames on the given thread.
539static size_t NumJniShadowFrameReferences(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_) {
540 return self->GetManagedStack()->NumJniShadowFrameReferences();
541}
542
543// Number of references in handle scope on the given thread.
544static size_t NumHandleReferences(Thread* self) {
545 size_t count = 0;
546 for (BaseHandleScope* cur = self->GetTopHandleScope(); cur != nullptr; cur = cur->GetLink()) {
547 count += cur->NumberOfReferences();
548 }
549 return count;
550}
551
552// Number of references allocated in handle scopes & JNI shadow frames on this thread.
553static size_t NumStackReferences(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_) {
554 return NumHandleReferences(self) + NumJniShadowFrameReferences(self);
555}
556
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700557static void expectNumStackReferences(size_t val1, size_t val2) {
558 // In rare cases when JNI functions call themselves recursively,
559 // disable this test because it will have a false negative.
560 if (!IsCurrentJniCritical() && ScopedDisableCheckNumStackReferences::sCheckNumStackReferences) {
561 /* @CriticalNative doesn't build a HandleScope, so this test is meaningless then. */
562 ScopedObjectAccess soa(Thread::Current());
563
Andreas Gampe0a855762016-10-26 13:43:14 -0700564 size_t actual_num = NumStackReferences(Thread::Current());
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700565 // XX: Not too sure what's going on.
566 // Sometimes null references get placed and sometimes they don't?
567 EXPECT_TRUE(val1 == actual_num || val2 == actual_num)
568 << "expected either " << val1 << " or " << val2
569 << " number of stack references, but got: " << actual_num;
570 }
571}
572
573#define EXPECT_NUM_STACK_REFERENCES(val1, val2) expectNumStackReferences(val1, val2)
574
575template <typename T, T fn>
576struct make_jni_test_decorator;
577
578// Decorator for "static" JNI callbacks.
579template <typename R, typename ... Args, R fn(JNIEnv*, jclass, Args...)>
580struct make_jni_test_decorator<R(JNIEnv*, jclass kls, Args...), fn> {
581 static R apply(JNIEnv* env, jclass kls, Args ... args) {
582 EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
583 EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
584 EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls);
585 // All incoming parameters + the jclass get put into the transition's StackHandleScope.
586 EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(kls, args...),
587 (count_refs_helper<jclass, Args...>::value));
588
589 return fn(env, kls, args...);
590 }
591};
592
593// Decorator for instance JNI callbacks.
594template <typename R, typename ... Args, R fn(JNIEnv*, jobject, Args...)>
595struct make_jni_test_decorator<R(JNIEnv*, jobject, Args...), fn> {
596 static R apply(JNIEnv* env, jobject thisObj, Args ... args) {
597 EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
598 EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
599 EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj);
600 // All incoming parameters + the implicit 'this' get put into the transition's StackHandleScope.
601 EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(thisObj, args...),
602 (count_refs_helper<jobject, Args...>::value));
603
604 return fn(env, thisObj, args...);
605 }
606};
607
608// Decorate the regular JNI callee with the extra gtest checks.
609// This way we can have common test logic for everything generic like checking if a lock is held,
610// checking handle scope state, etc.
611#define MAKE_JNI_TEST_DECORATOR(fn) make_jni_test_decorator<decltype(fn), (fn)>::apply
612
613// Convert function f(JNIEnv*,jclass,a,b,c,d...) into f2(a,b,c,d...)
614// -- This way we don't have to write out each implementation twice for @CriticalNative.
615#define JNI_CRITICAL_WRAPPER(func) jni_remove_extra_parameters<decltype(func), (func)>::apply
616// Get a function pointer whose calling convention either matches a regular native
617// or a critical native depending on which kind of jni is currently under test.
618// -- This also has the benefit of genering a compile time error if the 'func' doesn't properly
619// have JNIEnv and jclass parameters first.
620#define CURRENT_JNI_WRAPPER(func) \
621 (IsCurrentJniCritical() \
622 ? reinterpret_cast<void*>(&JNI_CRITICAL_WRAPPER(MAKE_JNI_TEST_DECORATOR(func))) \
623 : reinterpret_cast<void*>(&MAKE_JNI_TEST_DECORATOR(func)))
624
625// Do the opposite of the above. Do *not* wrap the function, instead just cast it to a void*.
626// Only for "TEST_JNI_NORMAL_ONLY" configs, and it inserts a test assert to ensure this is the case.
627#define NORMAL_JNI_ONLY_NOWRAP(func) \
628 ({ ASSERT_TRUE(IsCurrentJniNormal()); reinterpret_cast<void*>(&(func)); })
629// Same as above, but with nullptr. When we want to test the stub functionality.
630#define NORMAL_JNI_ONLY_NULLPTR \
631 ({ ASSERT_TRUE(IsCurrentJniNormal()); nullptr; })
632
633
634int gJava_MyClassNatives_foo_calls[kJniKindCount] = {};
635void Java_MyClassNatives_foo(JNIEnv*, jobject) {
636 gJava_MyClassNatives_foo_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700637}
638
Andreas Gampe6e498692014-08-18 16:43:12 -0700639void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700640 SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700641
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700642 EXPECT_EQ(0, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700643 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700644 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700645 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700646 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700647
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700648 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700649}
650
Andreas Gampe6e498692014-08-18 16:43:12 -0700651JNI_TEST(CompileAndRunNoArgMethod)
652
653void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700654 SetUpForTest(false, "bar", "(I)I", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700655 // calling through stub will link with &Java_MyClassNatives_bar
Shih-wei Liao31384c52011-09-06 15:27:45 -0700656
Shih-wei Liao31384c52011-09-06 15:27:45 -0700657 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800658 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700659 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700660 << reason;
Shih-wei Liao31384c52011-09-06 15:27:45 -0700661
662 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
663 EXPECT_EQ(25, result);
664}
665
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700666// TODO: Support @FastNative and @CriticalNative through stubs.
667JNI_TEST_NORMAL_ONLY(CompileAndRunIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700668
669void JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700670 SetUpForTest(true, "sbar", "(I)I", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700671 // calling through stub will link with &Java_MyClassNatives_sbar
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800672
673 std::string reason;
Dmitriy Ivanovf5a30992015-11-11 14:18:55 -0800674 ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
Dimitry Ivanov5edb0632016-04-29 11:14:25 -0700675 LoadNativeLibrary(env_, "", class_loader_, library_search_path_, &reason))
Ian Rogers68d8b422014-07-17 11:09:10 -0700676 << reason;
Ian Rogers1cefdbd2012-02-29 09:34:50 -0800677
678 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
679 EXPECT_EQ(43, result);
680}
681
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700682// TODO: Support @FastNative and @CriticalNative through stubs.
683JNI_TEST_NORMAL_ONLY(CompileAndRunStaticIntMethodThroughStub)
Andreas Gampe6e498692014-08-18 16:43:12 -0700684
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700685int gJava_MyClassNatives_fooI_calls[kJniKindCount] = {};
686jint Java_MyClassNatives_fooI(JNIEnv*, jobject, jint x) {
687 gJava_MyClassNatives_fooI_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700688 return x;
689}
690
Andreas Gampe6e498692014-08-18 16:43:12 -0700691void JniCompilerTest::CompileAndRunIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700692 SetUpForTest(false, "fooI", "(I)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700693 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooI));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700694
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700695 EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700696 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
697 EXPECT_EQ(42, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700698 EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700699 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
700 EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700701 EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700702
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700703 gJava_MyClassNatives_fooI_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700704}
705
Andreas Gampe6e498692014-08-18 16:43:12 -0700706JNI_TEST(CompileAndRunIntMethod)
707
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700708int gJava_MyClassNatives_fooII_calls[kJniKindCount] = {};
709jint Java_MyClassNatives_fooII(JNIEnv*, jobject, jint x, jint y) {
710 gJava_MyClassNatives_fooII_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700711 return x - y; // non-commutative operator
712}
713
Andreas Gampe6e498692014-08-18 16:43:12 -0700714void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700715 SetUpForTest(false, "fooII", "(II)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700716 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooII));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700717
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700718 EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700719 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
720 EXPECT_EQ(99 - 10, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700721 EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700722 result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
723 0xCAFED00D);
724 EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700725 EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700726
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700727 gJava_MyClassNatives_fooII_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700728}
729
Andreas Gampe6e498692014-08-18 16:43:12 -0700730JNI_TEST(CompileAndRunIntIntMethod)
731
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700732int gJava_MyClassNatives_fooJJ_calls[kJniKindCount] = {};
733jlong Java_MyClassNatives_fooJJ(JNIEnv*, jobject, jlong x, jlong y) {
734 gJava_MyClassNatives_fooJJ_calls[gCurrentJni]++;
Ian Rogers9b269d22011-09-04 14:06:05 -0700735 return x - y; // non-commutative operator
736}
737
Andreas Gampe6e498692014-08-18 16:43:12 -0700738void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700739 SetUpForTest(false, "fooJJ", "(JJ)J",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700740 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ));
Ian Rogers9b269d22011-09-04 14:06:05 -0700741
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700742 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Ian Rogers0f678472014-03-10 16:18:37 -0700743 jlong a = INT64_C(0x1234567890ABCDEF);
744 jlong b = INT64_C(0xFEDCBA0987654321);
Ian Rogers9b269d22011-09-04 14:06:05 -0700745 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
746 EXPECT_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700747 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Ian Rogers9b269d22011-09-04 14:06:05 -0700748 result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
749 EXPECT_EQ(b - a, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700750 EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700751
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700752 gJava_MyClassNatives_fooJJ_calls[gCurrentJni] = 0;
Ian Rogers9b269d22011-09-04 14:06:05 -0700753}
754
Andreas Gampe6e498692014-08-18 16:43:12 -0700755JNI_TEST(CompileAndRunLongLongMethod)
756
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700757int gJava_MyClassNatives_fooDD_calls[kJniKindCount] = {};
758jdouble Java_MyClassNatives_fooDD(JNIEnv*, jobject, jdouble x, jdouble y) {
759 gJava_MyClassNatives_fooDD_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700760 return x - y; // non-commutative operator
761}
762
Andreas Gampe6e498692014-08-18 16:43:12 -0700763void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700764 SetUpForTest(false, "fooDD", "(DD)D",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700765 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooDD));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700766
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700767 EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700768 jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
769 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700770 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700771 EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700772 jdouble a = 3.14159265358979323846;
773 jdouble b = 0.69314718055994530942;
774 result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700775 EXPECT_DOUBLE_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700776 EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700777
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700778 gJava_MyClassNatives_fooDD_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700779}
780
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700781int gJava_MyClassNatives_fooJJ_synchronized_calls[kJniKindCount] = {};
782jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv*, jobject, jlong x, jlong y) {
783 gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]++;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700784 return x | y;
785}
786
Andreas Gampe6e498692014-08-18 16:43:12 -0700787void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700788 SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700789 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ_synchronized));
Elliott Hughes3e778f72012-05-21 15:29:52 -0700790
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700791 EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
Elliott Hughes3e778f72012-05-21 15:29:52 -0700792 jlong a = 0x1000000020000000ULL;
793 jlong b = 0x00ff000000aa0000ULL;
794 jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
795 EXPECT_EQ(a | b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700796 EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700797
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700798 gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni] = 0;
Elliott Hughes3e778f72012-05-21 15:29:52 -0700799}
800
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700801JNI_TEST_NORMAL_ONLY(CompileAndRun_fooJJ_synchronized)
Andreas Gampe6e498692014-08-18 16:43:12 -0700802
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700803int gJava_MyClassNatives_fooIOO_calls[kJniKindCount] = {};
804jobject Java_MyClassNatives_fooIOO(JNIEnv*, jobject thisObj, jint x, jobject y,
Ian Rogersb033c752011-07-20 12:22:35 -0700805 jobject z) {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700806 gJava_MyClassNatives_fooIOO_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -0700807 switch (x) {
808 case 1:
809 return y;
810 case 2:
811 return z;
812 default:
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700813 return thisObj;
Ian Rogersb033c752011-07-20 12:22:35 -0700814 }
815}
816
Andreas Gampe6e498692014-08-18 16:43:12 -0700817void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700818 SetUpForTest(false, "fooIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700819 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700820 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700821
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700822 EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700823 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700824 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700825 EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700826
Andreas Gampecf4035a2014-05-28 22:43:01 -0700827 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700828 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700829 EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700830 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
831 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700832 EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700833 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700834 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700835 EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700836
Andreas Gampecf4035a2014-05-28 22:43:01 -0700837 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700838 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700839 EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700840 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700841 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700842 EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700843 result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
844 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700845 EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700846
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700847 gJava_MyClassNatives_fooIOO_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -0700848}
849
Igor Murashkinaf1e2992016-10-12 17:44:50 -0700850JNI_TEST(CompileAndRunIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700851
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700852int gJava_MyClassNatives_fooSII_calls[kJniKindCount] = {};
853jint Java_MyClassNatives_fooSII(JNIEnv* env ATTRIBUTE_UNUSED,
854 jclass klass ATTRIBUTE_UNUSED,
855 jint x,
856 jint y) {
857 gJava_MyClassNatives_fooSII_calls[gCurrentJni]++;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700858 return x + y;
859}
860
Andreas Gampe6e498692014-08-18 16:43:12 -0700861void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700862 SetUpForTest(true, "fooSII", "(II)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700863 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSII));
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700864
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700865 EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700866 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
867 EXPECT_EQ(50, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700868 EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700869
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700870 gJava_MyClassNatives_fooSII_calls[gCurrentJni] = 0;
Shih-wei Liao82da44b2011-09-01 00:38:04 -0700871}
872
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700873JNI_TEST_CRITICAL(CompileAndRunStaticIntIntMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700874
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700875int gJava_MyClassNatives_fooSDD_calls[kJniKindCount] = {};
876jdouble Java_MyClassNatives_fooSDD(JNIEnv* env ATTRIBUTE_UNUSED,
877 jclass klass ATTRIBUTE_UNUSED,
878 jdouble x,
879 jdouble y) {
880 gJava_MyClassNatives_fooSDD_calls[gCurrentJni]++;
Ian Rogers7a99c112011-09-07 12:48:27 -0700881 return x - y; // non-commutative operator
882}
883
Andreas Gampe6e498692014-08-18 16:43:12 -0700884void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700885 SetUpForTest(true, "fooSDD", "(DD)D",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700886 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSDD));
Ian Rogers7a99c112011-09-07 12:48:27 -0700887
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700888 EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Ian Rogers7a99c112011-09-07 12:48:27 -0700889 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700890 EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700891 EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Ian Rogers7a99c112011-09-07 12:48:27 -0700892 jdouble a = 3.14159265358979323846;
893 jdouble b = 0.69314718055994530942;
894 result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -0700895 EXPECT_DOUBLE_EQ(a - b, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700896 EXPECT_DOUBLE_EQ(2, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -0700897
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700898 gJava_MyClassNatives_fooSDD_calls[gCurrentJni] = 0;
Ian Rogers7a99c112011-09-07 12:48:27 -0700899}
900
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700901JNI_TEST_CRITICAL(CompileAndRunStaticDoubleDoubleMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700902
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100903// The x86 generic JNI code had a bug where it assumed a floating
904// point return value would be in xmm0. We use log, to somehow ensure
905// the compiler will use the floating point stack.
906
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700907jdouble Java_MyClassNatives_logD(JNIEnv*, jclass, jdouble x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100908 return log(x);
909}
910
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700911jdouble Java_MyClassNatives_logD_notNormal(JNIEnv*, jclass, jdouble x) {
912 EXPECT_DOUBLE_EQ(2.0, x);
913 return log(x);
914}
915
Andreas Gampe6e498692014-08-18 16:43:12 -0700916void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700917 void* jni_handler;
918 if (IsCurrentJniNormal()) {
919 // This test seems a bit special, don't use a JNI wrapper here.
920 jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logD);
921 } else {
922 jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logD_notNormal);
923 }
924 SetUpForTest(true, "logD", "(D)D", jni_handler);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100925
926 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700927 EXPECT_DOUBLE_EQ(log(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100928}
929
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700930JNI_TEST_CRITICAL(RunStaticLogDoubleMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700931
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700932jfloat Java_MyClassNatives_logF(JNIEnv*, jclass, jfloat x) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100933 return logf(x);
934}
935
Andreas Gampe6e498692014-08-18 16:43:12 -0700936void JniCompilerTest::RunStaticLogFloatMethodImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700937 void* jni_handler;
938 if (IsCurrentJniNormal()) {
939 // This test seems a bit special, don't use a JNI wrapper here.
940 jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logF);
941 } else {
942 jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logF);
943 }
944
945 SetUpForTest(true, "logF", "(F)F", jni_handler);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100946
947 jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
Ian Rogers647b1a82014-10-10 11:02:11 -0700948 EXPECT_FLOAT_EQ(logf(2.0), result);
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100949}
950
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700951JNI_TEST_CRITICAL(RunStaticLogFloatMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -0700952
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700953jboolean Java_MyClassNatives_returnTrue(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100954 return JNI_TRUE;
955}
956
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700957jboolean Java_MyClassNatives_returnFalse(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100958 return JNI_FALSE;
959}
960
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700961jint Java_MyClassNatives_returnInt(JNIEnv*, jclass) {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100962 return 42;
963}
964
Andreas Gampe6e498692014-08-18 16:43:12 -0700965void JniCompilerTest::RunStaticReturnTrueImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700966 SetUpForTest(true, "returnTrue", "()Z", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnTrue));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100967
968 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
969 EXPECT_TRUE(result);
970}
971
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700972JNI_TEST_CRITICAL(RunStaticReturnTrue)
Andreas Gampe6e498692014-08-18 16:43:12 -0700973
974void JniCompilerTest::RunStaticReturnFalseImpl() {
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100975 SetUpForTest(true, "returnFalse", "()Z",
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700976 CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnFalse));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100977
978 jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
979 EXPECT_FALSE(result);
980}
981
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700982JNI_TEST_CRITICAL(RunStaticReturnFalse)
Andreas Gampe6e498692014-08-18 16:43:12 -0700983
984void JniCompilerTest::RunGenericStaticReturnIntImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700985 SetUpForTest(true, "returnInt", "()I", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnInt));
Nicolas Geoffray54accbc2014-08-13 03:40:45 +0100986
987 jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
988 EXPECT_EQ(42, result);
989}
990
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700991JNI_TEST_CRITICAL(RunGenericStaticReturnInt)
Andreas Gampe6e498692014-08-18 16:43:12 -0700992
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700993int gJava_MyClassNatives_returnDouble_calls[kJniKindCount] = {};
994jdouble Java_MyClassNatives_returnDouble(JNIEnv*, jclass) {
995 gJava_MyClassNatives_returnDouble_calls[gCurrentJni]++;
996 return 4.0;
997}
998
999void JniCompilerTest::RunGenericStaticReturnDoubleImpl() {
1000 SetUpForTest(true, "returnDouble", "()D", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnDouble));
1001
1002 jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_);
1003 EXPECT_DOUBLE_EQ(4.0, result);
1004 EXPECT_EQ(1, gJava_MyClassNatives_returnDouble_calls[gCurrentJni]);
1005
1006 gJava_MyClassNatives_returnDouble_calls[gCurrentJni] = 0;
1007}
1008
1009JNI_TEST_CRITICAL(RunGenericStaticReturnDouble)
1010
1011jlong Java_MyClassNatives_returnLong(JNIEnv*, jclass) {
1012 return 0xFEEDDEADFEEDL;
1013}
1014
1015void JniCompilerTest::RunGenericStaticReturnLongImpl() {
1016 SetUpForTest(true, "returnLong", "()J", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnLong));
1017
1018 jlong result = env_->CallStaticLongMethod(jklass_, jmethod_);
1019 EXPECT_EQ(0xFEEDDEADFEEDL, result);
1020}
1021
1022JNI_TEST_CRITICAL(RunGenericStaticReturnLong)
1023
1024int gJava_MyClassNatives_fooSIOO_calls[kJniKindCount] = {};
1025jobject Java_MyClassNatives_fooSIOO(JNIEnv*, jclass klass, jint x, jobject y, jobject z) {
1026 gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]++;
Ian Rogersb033c752011-07-20 12:22:35 -07001027 switch (x) {
1028 case 1:
1029 return y;
1030 case 2:
1031 return z;
1032 default:
1033 return klass;
1034 }
1035}
1036
Andreas Gampe6e498692014-08-18 16:43:12 -07001037void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001038 SetUpForTest(true, "fooSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001039 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001040 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSIOO));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001041
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001042 EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001043 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001044 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001045 EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001046
Andreas Gampecf4035a2014-05-28 22:43:01 -07001047 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001048 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001049 EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001050 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1051 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001052 EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001053 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001054 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001055 EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001056
Andreas Gampecf4035a2014-05-28 22:43:01 -07001057 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001058 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001059 EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001060 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001061 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001062 EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001063 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1064 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001065 EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001066
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001067 gJava_MyClassNatives_fooSIOO_calls[gCurrentJni] = 0;
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001068}
1069
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001070JNI_TEST(CompileAndRunStaticIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -07001071
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001072int gJava_MyClassNatives_fooSSIOO_calls[kJniKindCount] = {};
1073jobject Java_MyClassNatives_fooSSIOO(JNIEnv*, jclass klass, jint x, jobject y, jobject z) {
1074 gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]++;
Ian Rogersdf20fe02011-07-20 20:34:16 -07001075 switch (x) {
1076 case 1:
1077 return y;
1078 case 2:
1079 return z;
1080 default:
1081 return klass;
1082 }
1083}
1084
Andreas Gampe6e498692014-08-18 16:43:12 -07001085void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001086 SetUpForTest(true, "fooSSIOO",
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001087 "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001088 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSSIOO));
Carl Shapiro419ec7b2011-08-03 14:48:33 -07001089
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001090 EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001091 jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001092 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001093 EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001094
Andreas Gampecf4035a2014-05-28 22:43:01 -07001095 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001096 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001097 EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001098 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1099 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001100 EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001101 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001102 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001103 EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001104
Andreas Gampecf4035a2014-05-28 22:43:01 -07001105 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001106 EXPECT_TRUE(env_->IsSameObject(jklass_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001107 EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001108 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001109 EXPECT_TRUE(env_->IsSameObject(jobj_, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001110 EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001111 result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1112 EXPECT_TRUE(env_->IsSameObject(nullptr, result));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001113 EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001114
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001115 gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni] = 0;
Ian Rogersdf20fe02011-07-20 20:34:16 -07001116}
1117
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001118// TODO: Maybe. @FastNative support for returning Objects?
1119JNI_TEST_NORMAL_ONLY(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
Andreas Gampe6e498692014-08-18 16:43:12 -07001120
Elliott Hughesb264f082012-04-06 17:10:10 -07001121void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
Elliott Hughesa2501992011-08-26 19:39:54 -07001122 jclass c = env->FindClass("java/lang/RuntimeException");
1123 env->ThrowNew(c, "hello");
1124}
Ian Rogers45a76cb2011-07-21 22:00:15 -07001125
Andreas Gampe6e498692014-08-18 16:43:12 -07001126void JniCompilerTest::ExceptionHandlingImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001127 {
1128 ASSERT_FALSE(runtime_->IsStarted());
1129 ScopedObjectAccess soa(Thread::Current());
1130 class_loader_ = LoadDex("MyClassNatives");
Brian Carlstrom40381fb2011-10-19 14:13:40 -07001131
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001132 // all compilation needs to happen before Runtime::Start
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001133 CompileForTestWithCurrentJni(class_loader_, false, "foo", "()V");
1134 CompileForTestWithCurrentJni(class_loader_, false, "throwException", "()V");
1135 CompileForTestWithCurrentJni(class_loader_, false, "foo", "()V");
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001136 }
1137 // Start runtime to avoid re-initialization in SetupForTest.
1138 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -07001139 bool started = runtime_->Start();
1140 CHECK(started);
Brian Carlstrom25c33252011-09-18 15:58:35 -07001141
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001142 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Elliott Hughesa2501992011-08-26 19:39:54 -07001143
Ian Rogers67375ac2011-09-14 00:55:44 -07001144 // Check a single call of a JNI method is ok
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001145 SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001146 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001147 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogers67375ac2011-09-14 00:55:44 -07001148 EXPECT_FALSE(Thread::Current()->IsExceptionPending());
Elliott Hughesa2501992011-08-26 19:39:54 -07001149
Ian Rogers67375ac2011-09-14 00:55:44 -07001150 // Get class for exception we expect to be thrown
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001151 ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
1152 SetUpForTest(false, "throwException", "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001153 CURRENT_JNI_WRAPPER(Java_MyClassNatives_throwException));
Elliott Hughesb264f082012-04-06 17:10:10 -07001154 // Call Java_MyClassNatives_throwException (JNI method that throws exception)
Elliott Hughesa2501992011-08-26 19:39:54 -07001155 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001156 EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001157 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1158 ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
1159 env_->ExceptionClear();
1160 EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
Elliott Hughesa2501992011-08-26 19:39:54 -07001161
Ian Rogers67375ac2011-09-14 00:55:44 -07001162 // Check a single call of a JNI method is ok
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001163 SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
Ian Rogerscdd1d2d2011-08-18 09:58:17 -07001164 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001165 EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001166
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001167 gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
Ian Rogers45a76cb2011-07-21 22:00:15 -07001168}
1169
Andreas Gampe6e498692014-08-18 16:43:12 -07001170JNI_TEST(ExceptionHandling)
1171
Elliott Hughesb264f082012-04-06 17:10:10 -07001172jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001173 if (i <= 0) {
Andreas Gampecf4035a2014-05-28 22:43:01 -07001174 // We want to check raw Object* / Array* below
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001175 ScopedObjectAccess soa(env);
Ian Rogersaaa20802011-09-11 21:47:37 -07001176
1177 // Build stack trace
Sebastien Hertzee1d79a2014-02-21 15:46:30 +01001178 jobject internal = Thread::Current()->CreateInternalStackTrace<false>(soa);
Ian Rogers53b8b092014-03-13 23:45:53 -07001179 jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
Mathieu Chartier0795f232016-09-27 18:43:30 -07001180 ObjPtr<mirror::ObjectArray<mirror::StackTraceElement>> trace_array =
1181 soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>>(ste_array);
Andreas Gampecf4035a2014-05-28 22:43:01 -07001182 EXPECT_TRUE(trace_array != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001183 EXPECT_EQ(11, trace_array->GetLength());
1184
Ian Rogersaaa20802011-09-11 21:47:37 -07001185 // Check stack trace entries have expected values
Andreas Gampe277ccbd2014-11-03 21:36:10 -08001186 for (int32_t j = 0; j < trace_array->GetLength(); ++j) {
1187 EXPECT_EQ(-2, trace_array->Get(j)->GetLineNumber());
1188 mirror::StackTraceElement* ste = trace_array->Get(j);
Ian Rogersaaa20802011-09-11 21:47:37 -07001189 EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
Elliott Hughesb264f082012-04-06 17:10:10 -07001190 EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001191 EXPECT_EQ(("fooI" + CurrentJniStringSuffix()), ste->GetMethodName()->ToModifiedUtf8());
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001192 }
Ian Rogersaaa20802011-09-11 21:47:37 -07001193
1194 // end recursion
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001195 return 0;
1196 } else {
Elliott Hughesb264f082012-04-06 17:10:10 -07001197 jclass jklass = env->FindClass("MyClassNatives");
Andreas Gampecf4035a2014-05-28 22:43:01 -07001198 EXPECT_TRUE(jklass != nullptr);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001199 jmethodID jmethod = env->GetMethodID(jklass,
1200 ("fooI" + CurrentJniStringSuffix()).c_str(),
1201 "(I)I");
Andreas Gampecf4035a2014-05-28 22:43:01 -07001202 EXPECT_TRUE(jmethod != nullptr);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001203
Ian Rogersaaa20802011-09-11 21:47:37 -07001204 // Recurse with i - 1
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001205 jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
Ian Rogersaaa20802011-09-11 21:47:37 -07001206
1207 // Return sum of all depths
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001208 return i + result;
1209 }
1210}
1211
Andreas Gampe6e498692014-08-18 16:43:12 -07001212void JniCompilerTest::NativeStackTraceElementImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001213 SetUpForTest(false, "fooI", "(I)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001214 CURRENT_JNI_WRAPPER(Java_MyClassNatives_nativeUpCall));
1215
1216 // Usual # local references on stack check fails because nativeUpCall calls itself recursively,
1217 // each time the # of local references will therefore go up.
1218 ScopedDisableCheckNumStackReferences disable_num_stack_check;
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001219 jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001220
Ian Rogersaaa20802011-09-11 21:47:37 -07001221 EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
Shih-wei Liaoff0f9be2011-08-29 15:43:53 -07001222}
1223
Andreas Gampe6e498692014-08-18 16:43:12 -07001224JNI_TEST(NativeStackTraceElement)
1225
Elliott Hughesb264f082012-04-06 17:10:10 -07001226jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
Shih-wei Liao558788e2011-09-01 02:39:11 -07001227 return env->NewGlobalRef(x);
1228}
1229
Andreas Gampe6e498692014-08-18 16:43:12 -07001230void JniCompilerTest::ReturnGlobalRefImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001231 SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001232 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooO));
Shih-wei Liao558788e2011-09-01 02:39:11 -07001233 jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
1234 EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
1235 EXPECT_TRUE(env_->IsSameObject(result, jobj_));
1236}
1237
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001238JNI_TEST(ReturnGlobalRef)
Andreas Gampe6e498692014-08-18 16:43:12 -07001239
Ian Rogersdc51b792011-09-22 20:41:37 -07001240jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
1241 // Add 10 local references
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001242 ScopedObjectAccess soa(env);
Ian Rogers5a7a74a2011-09-26 16:32:29 -07001243 for (int i = 0; i < 10; i++) {
Mathieu Chartier0795f232016-09-27 18:43:30 -07001244 soa.AddLocalReference<jobject>(soa.Decode<mirror::Object>(thisObj));
Ian Rogersdc51b792011-09-22 20:41:37 -07001245 }
1246 return x+1;
1247}
1248
Andreas Gampe6e498692014-08-18 16:43:12 -07001249void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001250 SetUpForTest(false, "fooI", "(I)I", CURRENT_JNI_WRAPPER(local_ref_test));
Ian Rogersdc51b792011-09-22 20:41:37 -07001251 // 1000 invocations of a method that adds 10 local references
Elliott Hughesb25c3f62012-03-26 16:35:06 -07001252 for (int i = 0; i < 1000; i++) {
Ian Rogersdc51b792011-09-22 20:41:37 -07001253 jint result = env_->CallIntMethod(jobj_, jmethod_, i);
1254 EXPECT_TRUE(result == i + 1);
1255 }
1256}
1257
Andreas Gampe6e498692014-08-18 16:43:12 -07001258JNI_TEST(LocalReferenceTableClearingTest)
1259
Ian Rogersb9231c82011-09-05 22:13:19 -07001260void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
1261 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
1262 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
Ian Rogers82f3e092011-09-05 22:54:45 -07001263 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
Ian Rogersb9231c82011-09-05 22:13:19 -07001264 EXPECT_EQ(1234, src_pos);
1265 EXPECT_EQ(5678, dst_pos);
1266 EXPECT_EQ(9876, length);
1267}
1268
Andreas Gampe6e498692014-08-18 16:43:12 -07001269void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001270 SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001271 CURRENT_JNI_WRAPPER(my_arraycopy));
Ian Rogers82f3e092011-09-05 22:54:45 -07001272 env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
Ian Rogersb9231c82011-09-05 22:13:19 -07001273}
1274
Andreas Gampe6e498692014-08-18 16:43:12 -07001275JNI_TEST(JavaLangSystemArrayCopy)
1276
Ian Rogers67375ac2011-09-14 00:55:44 -07001277jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
1278 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
1279 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
Ian Rogers0f678472014-03-10 16:18:37 -07001280 EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
Ian Rogers67375ac2011-09-14 00:55:44 -07001281 EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
1282 EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
1283 return JNI_TRUE;
1284}
1285
Andreas Gampe6e498692014-08-18 16:43:12 -07001286void JniCompilerTest::CompareAndSwapIntImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001287 SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001288 CURRENT_JNI_WRAPPER(my_casi));
Ian Rogers0f678472014-03-10 16:18:37 -07001289 jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
1290 0xCAFEF00D, 0xEBADF00D);
Ian Rogers67375ac2011-09-14 00:55:44 -07001291 EXPECT_EQ(result, JNI_TRUE);
1292}
1293
Andreas Gampe6e498692014-08-18 16:43:12 -07001294JNI_TEST(CompareAndSwapInt)
1295
Ian Rogersc7792842012-03-03 15:36:20 -08001296jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
1297 EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
1298 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
1299 EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
1300 EXPECT_EQ(0x12345678ABCDEF88ll, val1);
1301 EXPECT_EQ(0x7FEDCBA987654321ll, val2);
1302 return 42;
1303}
1304
Andreas Gampe6e498692014-08-18 16:43:12 -07001305void JniCompilerTest::GetTextImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001306 SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001307 CURRENT_JNI_WRAPPER(my_gettext));
Ian Rogersc7792842012-03-03 15:36:20 -08001308 jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
Ian Rogers0f678472014-03-10 16:18:37 -07001309 INT64_C(0x7FEDCBA987654321), jobj_);
Ian Rogersc7792842012-03-03 15:36:20 -08001310 EXPECT_EQ(result, 42);
1311}
1312
Andreas Gampe6e498692014-08-18 16:43:12 -07001313JNI_TEST(GetText)
1314
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001315int gJava_MyClassNatives_GetSinkProperties_calls[kJniKindCount] = {};
1316jarray Java_MyClassNatives_GetSinkProperties(JNIEnv*, jobject thisObj, jstring s) {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001317 EXPECT_EQ(s, nullptr);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001318 gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]++;
1319
1320 Thread* self = Thread::Current();
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001321 ScopedObjectAccess soa(self);
Mathieu Chartier1cc62e42016-10-03 18:01:28 -07001322 EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object>(thisObj).Ptr()));
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001323 return nullptr;
1324}
1325
Andreas Gampe6e498692014-08-18 16:43:12 -07001326void JniCompilerTest::GetSinkPropertiesNativeImpl() {
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001327 SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001328 CURRENT_JNI_WRAPPER(Java_MyClassNatives_GetSinkProperties));
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001329
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001330 EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
Vladimir Marko4e24b9d2014-07-24 17:01:58 +01001331 jarray result = down_cast<jarray>(
1332 env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
1333 EXPECT_EQ(nullptr, result);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001334 EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
Andreas Gampe6e498692014-08-18 16:43:12 -07001335
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001336 gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni] = 0;
Brian Carlstromfc7120c2012-08-27 13:43:25 -07001337}
1338
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001339// @FastNative doesn't support 'synchronized' keyword and
1340// never will -- locking functions aren't fast.
1341JNI_TEST_NORMAL_ONLY(GetSinkPropertiesNative)
Andreas Gampe6e498692014-08-18 16:43:12 -07001342
Elliott Hughesb264f082012-04-06 17:10:10 -07001343// This should return jclass, but we're imitating a bug pattern.
1344jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
1345 return env->NewStringUTF("not a class!");
1346}
1347
1348// This should return jclass, but we're imitating a bug pattern.
1349jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
1350 return env->NewStringUTF("not a class!");
1351}
1352
Andreas Gampe6e498692014-08-18 16:43:12 -07001353void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001354 SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001355 CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldReturnClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001356
1357 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001358 // This native method is bad, and tries to return a jstring as a jclass.
1359 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001360 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1361 "of java.lang.String from java.lang.Class " +
1362 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1363 CurrentJniStringSuffix() + "()");
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001364
1365 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -07001366 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001367 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1368 "of java.lang.String from java.lang.Class " +
1369 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1370 CurrentJniStringSuffix() + "()");
Ian Rogers68d8b422014-07-17 11:09:10 -07001371 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001372 check_jni_abort_catcher.Check(std::string() + "calling non-static method " +
1373 "java.lang.Class " +
1374 "MyClassNatives.instanceMethodThatShouldReturnClass" +
1375 CurrentJniStringSuffix() + "() with CallStaticObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001376}
1377
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001378JNI_TEST(UpcallReturnTypeChecking_Instance)
Andreas Gampe6e498692014-08-18 16:43:12 -07001379
1380void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001381 SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001382 CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldReturnClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001383
1384 CheckJniAbortCatcher check_jni_abort_catcher;
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001385 // This native method is bad, and tries to return a jstring as a jclass.
1386 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001387 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1388 "of java.lang.String from java.lang.Class " +
1389 "MyClassNatives.staticMethodThatShouldReturnClass" +
1390 CurrentJniStringSuffix() + "()");
Elliott Hughes3f6635a2012-06-19 13:37:49 -07001391
1392 // Here, we just call the method incorrectly; we should catch that too.
Ian Rogers68d8b422014-07-17 11:09:10 -07001393 env_->CallStaticObjectMethod(jklass_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001394 check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1395 "of java.lang.String from java.lang.Class " +
1396 "MyClassNatives.staticMethodThatShouldReturnClass" +
1397 CurrentJniStringSuffix() + "()");
Ian Rogers68d8b422014-07-17 11:09:10 -07001398 env_->CallObjectMethod(jobj_, jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001399 check_jni_abort_catcher.Check(std::string() + "calling static method " +
1400 "java.lang.Class " +
1401 "MyClassNatives.staticMethodThatShouldReturnClass" +
1402 CurrentJniStringSuffix() + "() with CallObjectMethodV");
Elliott Hughesb264f082012-04-06 17:10:10 -07001403}
1404
Igor Murashkinaf1e2992016-10-12 17:44:50 -07001405JNI_TEST(UpcallReturnTypeChecking_Static)
Andreas Gampe6e498692014-08-18 16:43:12 -07001406
Elliott Hughesb264f082012-04-06 17:10:10 -07001407// This should take jclass, but we're imitating a bug pattern.
1408void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
1409}
1410
1411// This should take jclass, but we're imitating a bug pattern.
1412void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
1413}
1414
Andreas Gampe6e498692014-08-18 16:43:12 -07001415void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001416 // This will lead to error messages in the log.
1417 ScopedLogSeverity sls(LogSeverity::FATAL);
1418
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001419 SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001420 CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldTakeClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001421
1422 CheckJniAbortCatcher check_jni_abort_catcher;
1423 // We deliberately pass a bad second argument here.
1424 env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001425 check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1426 "MyClassNatives.instanceMethodThatShouldTakeClass" +
1427 CurrentJniStringSuffix() + "(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001428}
1429
Andreas Gampe6e498692014-08-18 16:43:12 -07001430JNI_TEST(UpcallArgumentTypeChecking_Instance)
1431
1432void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001433 // This will lead to error messages in the log.
1434 ScopedLogSeverity sls(LogSeverity::FATAL);
1435
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001436 SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001437 CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldTakeClass));
Elliott Hughesb264f082012-04-06 17:10:10 -07001438
1439 CheckJniAbortCatcher check_jni_abort_catcher;
1440 // We deliberately pass a bad second argument here.
1441 env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001442 check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1443 "MyClassNatives.staticMethodThatShouldTakeClass" +
1444 CurrentJniStringSuffix() + "(int, java.lang.Class)");
Elliott Hughesb264f082012-04-06 17:10:10 -07001445}
1446
Andreas Gampe6e498692014-08-18 16:43:12 -07001447JNI_TEST(UpcallArgumentTypeChecking_Static)
1448
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001449jfloat Java_MyClassNatives_checkFloats(JNIEnv*, jobject, jfloat f1, jfloat f2) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001450 return f1 - f2; // non-commutative operator
1451}
1452
Andreas Gampe6e498692014-08-18 16:43:12 -07001453void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001454 SetUpForTest(false, "checkFloats", "(FF)F",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001455 CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkFloats));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001456
1457 jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1458 99.0F, 10.0F);
Ian Rogers647b1a82014-10-10 11:02:11 -07001459 EXPECT_FLOAT_EQ(99.0F - 10.0F, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001460 jfloat a = 3.14159F;
1461 jfloat b = 0.69314F;
1462 result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
Ian Rogers647b1a82014-10-10 11:02:11 -07001463 EXPECT_FLOAT_EQ(a - b, result);
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001464}
1465
Andreas Gampe6e498692014-08-18 16:43:12 -07001466JNI_TEST(CompileAndRunFloatFloatMethod)
1467
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001468void Java_MyClassNatives_checkParameterAlign(JNIEnv* env ATTRIBUTE_UNUSED,
1469 jobject thisObj ATTRIBUTE_UNUSED,
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001470 jint i1,
1471 jlong l1) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001472 EXPECT_EQ(i1, 1234);
Ian Rogers0f678472014-03-10 16:18:37 -07001473 EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001474}
1475
Andreas Gampe6e498692014-08-18 16:43:12 -07001476void JniCompilerTest::CheckParameterAlignImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001477 SetUpForTest(false, "checkParameterAlign", "(IJ)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001478 CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkParameterAlign));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001479
Ian Rogers0f678472014-03-10 16:18:37 -07001480 env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001481}
1482
Andreas Gampe6e498692014-08-18 16:43:12 -07001483JNI_TEST(CheckParameterAlign)
1484
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001485void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject,
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001486 jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1487 jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1488 jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1489 jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1490 jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1491 jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1492 jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1493 jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1494 jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1495 jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1496 jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1497 jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1498 jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1499 jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1500 jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1501 jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1502 jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1503 jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1504 jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1505 jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1506 jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1507 jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1508 jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1509 jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1510 jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1511 jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1512 jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1513 jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1514 jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1515 jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1516 jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1517 jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001518 // two tests possible
1519 if (o0 == nullptr) {
1520 // 1) everything is null
1521 EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1522 && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1523 && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1524 && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1525 && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1526 && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1527 && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1528 && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1529 && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1530 && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1531 && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1532 && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1533 && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1534 && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1535 && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1536 && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1537 && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1538 && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1539 && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1540 && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1541 && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1542 && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1543 && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1544 && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1545 && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1546 && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1547 && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1548 && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1549 && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1550 && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1551 && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1552 && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1553 && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1554 && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1555 && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1556 && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1557 && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1558 && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1559 && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1560 && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1561 && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1562 && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1563 && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1564 && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1565 && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1566 && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1567 && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1568 && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1569 && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1570 && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1571 && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1572 } else {
1573 EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1574 EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1575 EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1576 EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1577 EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1578 EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1579 EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1580 EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1581 EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1582 EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1583 EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1584 EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1585 EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1586 EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1587 EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1588 EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1589 EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1590 EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1591 EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1592 EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1593 EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1594 EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1595 EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1596 EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1597 EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1598 EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1599 EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1600 EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1601 EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1602 EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1603 EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1604 EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1605 EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1606 EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1607 EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1608 EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1609 EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1610 EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1611 EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1612 EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1613 EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1614 EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1615 EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1616 EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1617 EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1618 EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1619 EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1620 EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1621 EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1622 EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1623 EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1624 EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1625 EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1626 EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1627 EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1628 EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1629 EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1630 EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1631 EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1632 EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1633 EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1634 EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1635 EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1636 EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1637 EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1638 EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1639 EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1640 EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1641 EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1642 EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1643 EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1644 EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1645 EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1646 EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1647 EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1648 EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1649 EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1650 EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1651 EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1652 EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1653 EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1654 EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1655 EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1656 EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1657 EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1658 EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1659 EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1660 EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1661 EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1662 EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1663 EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1664 EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1665 EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1666 EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1667 EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1668 EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1669 EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1670 EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1671 EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1672 EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1673 EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1674 EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1675 EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1676 EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1677 EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1678 EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1679 EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1680 EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1681 EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1682 EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1683 EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1684 EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1685 EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1686 EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1687 EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1688 EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1689 EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1690 EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1691 EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1692 EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1693 EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1694 EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1695 EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1696 EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1697 EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1698 EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1699 EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1700 EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1701 EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1702 EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1703 EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1704 EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1705 EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1706 EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1707 EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1708 EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1709 EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1710 EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1711 EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1712 EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1713 EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1714 EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1715 EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1716 EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1717 EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1718 EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1719 EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1720 EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1721 EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1722 EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1723 EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1724 EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1725 EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1726 EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1727 EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1728 EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1729 EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1730 EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1731 EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1732 EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1733 EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1734 EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1735 EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1736 EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1737 EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1738 EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1739 EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1740 EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1741 EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1742 EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1743 EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1744 EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1745 EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1746 EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1747 EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1748 EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1749 EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1750 EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1751 EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1752 EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1753 EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1754 EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1755 EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1756 EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1757 EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1758 EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1759 EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1760 EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1761 EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1762 EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1763 EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1764 EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1765 EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1766 EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1767 EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1768 EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1769 EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1770 EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1771 EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1772 EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1773 EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1774 EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1775 EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1776 EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1777 EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1778 EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1779 EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1780 EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1781 EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1782 EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1783 EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1784 EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1785 EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1786 EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1787 EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1788 EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1789 EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1790 EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1791 EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
1792 EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
1793 EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
1794 EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
1795 EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
1796 EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
1797 EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
1798 EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
1799 EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
1800 EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
1801 EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
1802 EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
1803 EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
1804 EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
1805 EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
1806 EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
1807 EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
1808 EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
1809 EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
1810 EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
1811 EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
1812 EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
1813 EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
1814 EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
1815 EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
1816 EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
1817 EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
1818 EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
1819 EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
1820 EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
1821 EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
1822 EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
1823 EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
1824 EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
1825 EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
1826 EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
1827 }
1828}
1829
1830const char* longSig =
1831 "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1832 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1833 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1834 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1835 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1836 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1837 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1838 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1839 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1840 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1841 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1842 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1843 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1844 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1845 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1846 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1847 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1848 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1849 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1850 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1851 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1852 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1853 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1854 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1855 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1856 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1857 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1858 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1859 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1860 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1861 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1862 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1863 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1864 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1865 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1866 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1867 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1868 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1869 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1870 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1871 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1872 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1873 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1874 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1875 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1876 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1877 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1878 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1879 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1880 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
1881 "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
1882
Andreas Gampe6e498692014-08-18 16:43:12 -07001883void JniCompilerTest::MaxParamNumberImpl() {
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001884 SetUpForTest(false, "maxParamNumber", longSig,
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001885 CURRENT_JNI_WRAPPER(Java_MyClassNatives_maxParamNumber));
Andreas Gampe7a0e5042014-03-07 13:03:19 -08001886
1887 jvalue args[254];
1888
1889 // First test: test with all arguments null.
1890 for (int i = 0; i < 254; ++i) {
1891 args[i].l = nullptr;
1892 }
1893
1894 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1895
1896 // Second test: test with int[] objects with increasing lengths
1897 for (int i = 0; i < 254; ++i) {
1898 jintArray tmp = env_->NewIntArray(i);
1899 args[i].l = tmp;
1900 EXPECT_NE(args[i].l, nullptr);
1901 }
1902
1903 env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
1904}
1905
Andreas Gampe6e498692014-08-18 16:43:12 -07001906JNI_TEST(MaxParamNumber)
1907
1908void JniCompilerTest::WithoutImplementationImpl() {
Andreas Gampe369810a2015-01-14 19:53:31 -08001909 // This will lead to error messages in the log.
1910 ScopedLogSeverity sls(LogSeverity::FATAL);
1911
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001912 SetUpForTest(false, "withoutImplementation", "()V", NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampead615172014-04-04 16:20:13 -07001913
1914 env_->CallVoidMethod(jobj_, jmethod_);
1915
1916 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1917 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1918}
1919
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001920// TODO: Don't test @FastNative here since it goes through a stub lookup (unsupported) which would
1921// normally fail with an exception, but fails with an assert.
1922JNI_TEST_NORMAL_ONLY(WithoutImplementation)
Andreas Gampe6e498692014-08-18 16:43:12 -07001923
Andreas Gampe48ee3562015-04-10 19:57:29 -07001924void JniCompilerTest::WithoutImplementationRefReturnImpl() {
1925 // This will lead to error messages in the log.
1926 ScopedLogSeverity sls(LogSeverity::FATAL);
1927
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001928 SetUpForTest(false,
1929 "withoutImplementationRefReturn",
1930 "()Ljava/lang/Object;",
1931 NORMAL_JNI_ONLY_NULLPTR);
Andreas Gampe48ee3562015-04-10 19:57:29 -07001932
1933 env_->CallObjectMethod(jobj_, jmethod_);
1934
1935 EXPECT_TRUE(Thread::Current()->IsExceptionPending());
1936 EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1937}
1938
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001939// TODO: Should work for @FastNative too.
1940JNI_TEST_NORMAL_ONLY(WithoutImplementationRefReturn)
Andreas Gampe48ee3562015-04-10 19:57:29 -07001941
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07001942void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv*, jclass, jint i1, jint i2, jint i3,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001943 jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
1944 jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
1945 jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
1946 jfloat f10) {
1947 EXPECT_EQ(i1, 1);
1948 EXPECT_EQ(i2, 2);
1949 EXPECT_EQ(i3, 3);
1950 EXPECT_EQ(i4, 4);
1951 EXPECT_EQ(i5, 5);
1952 EXPECT_EQ(i6, 6);
1953 EXPECT_EQ(i7, 7);
1954 EXPECT_EQ(i8, 8);
1955 EXPECT_EQ(i9, 9);
1956 EXPECT_EQ(i10, 10);
1957
Roland Levillainda4d79b2015-03-24 14:36:11 +00001958 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001959 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001960 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001961 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001962 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001963 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001964 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001965 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001966 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001967 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001968 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001969 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001970 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001971 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001972 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001973 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001974 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001975 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00001976 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001977 EXPECT_EQ(i20, 20);
1978}
1979
Andreas Gampe6e498692014-08-18 16:43:12 -07001980void JniCompilerTest::StackArgsIntsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001981 SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07001982 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsIntsFirst));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07001983
1984 jint i1 = 1;
1985 jint i2 = 2;
1986 jint i3 = 3;
1987 jint i4 = 4;
1988 jint i5 = 5;
1989 jint i6 = 6;
1990 jint i7 = 7;
1991 jint i8 = 8;
1992 jint i9 = 9;
1993 jint i10 = 10;
1994
Roland Levillainda4d79b2015-03-24 14:36:11 +00001995 jfloat f1 = bit_cast<jfloat, jint>(11);
1996 jfloat f2 = bit_cast<jfloat, jint>(12);
1997 jfloat f3 = bit_cast<jfloat, jint>(13);
1998 jfloat f4 = bit_cast<jfloat, jint>(14);
1999 jfloat f5 = bit_cast<jfloat, jint>(15);
2000 jfloat f6 = bit_cast<jfloat, jint>(16);
2001 jfloat f7 = bit_cast<jfloat, jint>(17);
2002 jfloat f8 = bit_cast<jfloat, jint>(18);
2003 jfloat f9 = bit_cast<jfloat, jint>(19);
2004 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002005
2006 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
2007 f3, f4, f5, f6, f7, f8, f9, f10);
2008}
2009
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002010JNI_TEST_CRITICAL(StackArgsIntsFirst)
Andreas Gampe6e498692014-08-18 16:43:12 -07002011
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07002012void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv*, jclass, jfloat f1, jfloat f2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002013 jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
2014 jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
2015 jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
2016 jint i9, jint i10) {
2017 EXPECT_EQ(i1, 1);
2018 EXPECT_EQ(i2, 2);
2019 EXPECT_EQ(i3, 3);
2020 EXPECT_EQ(i4, 4);
2021 EXPECT_EQ(i5, 5);
2022 EXPECT_EQ(i6, 6);
2023 EXPECT_EQ(i7, 7);
2024 EXPECT_EQ(i8, 8);
2025 EXPECT_EQ(i9, 9);
2026 EXPECT_EQ(i10, 10);
2027
Roland Levillainda4d79b2015-03-24 14:36:11 +00002028 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002029 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002030 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002031 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002032 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002033 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002034 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002035 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002036 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002037 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002038 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002039 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002040 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002041 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002042 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002043 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002044 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002045 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002046 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002047 EXPECT_EQ(i20, 20);
2048}
2049
Andreas Gampe6e498692014-08-18 16:43:12 -07002050void JniCompilerTest::StackArgsFloatsFirstImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002051 SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002052 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsFloatsFirst));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002053
2054 jint i1 = 1;
2055 jint i2 = 2;
2056 jint i3 = 3;
2057 jint i4 = 4;
2058 jint i5 = 5;
2059 jint i6 = 6;
2060 jint i7 = 7;
2061 jint i8 = 8;
2062 jint i9 = 9;
2063 jint i10 = 10;
2064
Roland Levillainda4d79b2015-03-24 14:36:11 +00002065 jfloat f1 = bit_cast<jfloat, jint>(11);
2066 jfloat f2 = bit_cast<jfloat, jint>(12);
2067 jfloat f3 = bit_cast<jfloat, jint>(13);
2068 jfloat f4 = bit_cast<jfloat, jint>(14);
2069 jfloat f5 = bit_cast<jfloat, jint>(15);
2070 jfloat f6 = bit_cast<jfloat, jint>(16);
2071 jfloat f7 = bit_cast<jfloat, jint>(17);
2072 jfloat f8 = bit_cast<jfloat, jint>(18);
2073 jfloat f9 = bit_cast<jfloat, jint>(19);
2074 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002075
2076 env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
2077 i4, i5, i6, i7, i8, i9, i10);
2078}
2079
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002080JNI_TEST_CRITICAL(StackArgsFloatsFirst)
Andreas Gampe6e498692014-08-18 16:43:12 -07002081
Ian Rogers6a3c1fc2014-10-31 00:33:20 -07002082void Java_MyClassNatives_stackArgsMixed(JNIEnv*, jclass, jint i1, jfloat f1, jint i2,
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002083 jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
2084 jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
2085 jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
2086 EXPECT_EQ(i1, 1);
2087 EXPECT_EQ(i2, 2);
2088 EXPECT_EQ(i3, 3);
2089 EXPECT_EQ(i4, 4);
2090 EXPECT_EQ(i5, 5);
2091 EXPECT_EQ(i6, 6);
2092 EXPECT_EQ(i7, 7);
2093 EXPECT_EQ(i8, 8);
2094 EXPECT_EQ(i9, 9);
2095 EXPECT_EQ(i10, 10);
2096
Roland Levillainda4d79b2015-03-24 14:36:11 +00002097 jint i11 = bit_cast<jint, jfloat>(f1);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002098 EXPECT_EQ(i11, 11);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002099 jint i12 = bit_cast<jint, jfloat>(f2);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002100 EXPECT_EQ(i12, 12);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002101 jint i13 = bit_cast<jint, jfloat>(f3);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002102 EXPECT_EQ(i13, 13);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002103 jint i14 = bit_cast<jint, jfloat>(f4);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002104 EXPECT_EQ(i14, 14);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002105 jint i15 = bit_cast<jint, jfloat>(f5);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002106 EXPECT_EQ(i15, 15);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002107 jint i16 = bit_cast<jint, jfloat>(f6);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002108 EXPECT_EQ(i16, 16);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002109 jint i17 = bit_cast<jint, jfloat>(f7);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002110 EXPECT_EQ(i17, 17);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002111 jint i18 = bit_cast<jint, jfloat>(f8);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002112 EXPECT_EQ(i18, 18);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002113 jint i19 = bit_cast<jint, jfloat>(f9);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002114 EXPECT_EQ(i19, 19);
Roland Levillainda4d79b2015-03-24 14:36:11 +00002115 jint i20 = bit_cast<jint, jfloat>(f10);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002116 EXPECT_EQ(i20, 20);
2117}
2118
Andreas Gampe6e498692014-08-18 16:43:12 -07002119void JniCompilerTest::StackArgsMixedImpl() {
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002120 SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002121 CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsMixed));
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002122
2123 jint i1 = 1;
2124 jint i2 = 2;
2125 jint i3 = 3;
2126 jint i4 = 4;
2127 jint i5 = 5;
2128 jint i6 = 6;
2129 jint i7 = 7;
2130 jint i8 = 8;
2131 jint i9 = 9;
2132 jint i10 = 10;
2133
Roland Levillainda4d79b2015-03-24 14:36:11 +00002134 jfloat f1 = bit_cast<jfloat, jint>(11);
2135 jfloat f2 = bit_cast<jfloat, jint>(12);
2136 jfloat f3 = bit_cast<jfloat, jint>(13);
2137 jfloat f4 = bit_cast<jfloat, jint>(14);
2138 jfloat f5 = bit_cast<jfloat, jint>(15);
2139 jfloat f6 = bit_cast<jfloat, jint>(16);
2140 jfloat f7 = bit_cast<jfloat, jint>(17);
2141 jfloat f8 = bit_cast<jfloat, jint>(18);
2142 jfloat f9 = bit_cast<jfloat, jint>(19);
2143 jfloat f10 = bit_cast<jfloat, jint>(20);
Vladimir Kostyukov1dd61ba2014-04-02 18:42:20 +07002144
2145 env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
2146 f7, i8, f8, i9, f9, i10, f10);
2147}
2148
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002149JNI_TEST_CRITICAL(StackArgsMixed)
Andreas Gampe6e498692014-08-18 16:43:12 -07002150
Lazar Trsicf652d602015-06-24 16:30:21 +02002151#if defined(__mips__) && defined(__LP64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
Pavle Batuta837e72a2016-03-16 11:31:46 +01002152// Function will fetch the last argument passed from caller that is now on top of the stack and
2153// return it as a 8B long. That way we can test if the caller has properly sign-extended the
2154// value when placing it on the stack.
2155__attribute__((naked))
2156jlong Java_MyClassNatives_getStackArgSignExtendedMips64(
2157 JNIEnv*, jclass, // Arguments passed from caller
2158 jint, jint, jint, jint, jint, jint, // through regs a0 to a7.
2159 jint) { // The last argument will be passed on the stack.
2160 __asm__(
2161 ".set noreorder\n\t" // Just return and store 8 bytes from the top of the stack
2162 "jr $ra\n\t" // in v0 (in branch delay slot). This should be the last
2163 "ld $v0, 0($sp)\n\t"); // argument. It is a 32-bit int, but it should be sign
2164 // extended and it occupies 64-bit location.
Lazar Trsicf652d602015-06-24 16:30:21 +02002165}
2166
2167void JniCompilerTest::StackArgsSignExtendedMips64Impl() {
Pavle Batuta837e72a2016-03-16 11:31:46 +01002168 uint64_t ret;
2169 SetUpForTest(true,
2170 "getStackArgSignExtendedMips64",
2171 "(IIIIIII)J",
2172 // Don't use wrapper because this is raw assembly function.
2173 reinterpret_cast<void*>(&Java_MyClassNatives_getStackArgSignExtendedMips64));
Lazar Trsicf652d602015-06-24 16:30:21 +02002174
Pavle Batuta837e72a2016-03-16 11:31:46 +01002175 // Mips64 ABI requires that arguments passed through stack be sign-extended 8B slots.
2176 // First 8 arguments are passed through registers.
2177 // Final argument's value is 7. When sign-extended, higher stack bits should be 0.
2178 ret = env_->CallStaticLongMethod(jklass_, jmethod_, 1, 2, 3, 4, 5, 6, 7);
2179 EXPECT_EQ(High32Bits(ret), static_cast<uint32_t>(0));
2180
2181 // Final argument's value is -8. When sign-extended, higher stack bits should be 0xffffffff.
2182 ret = env_->CallStaticLongMethod(jklass_, jmethod_, 1, 2, 3, 4, 5, 6, -8);
2183 EXPECT_EQ(High32Bits(ret), static_cast<uint32_t>(0xffffffff));
Lazar Trsicf652d602015-06-24 16:30:21 +02002184}
2185
Pavle Batuta837e72a2016-03-16 11:31:46 +01002186JNI_TEST(StackArgsSignExtendedMips64)
2187#endif
Lazar Trsicf652d602015-06-24 16:30:21 +02002188
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002189void Java_MyClassNatives_normalNative(JNIEnv*, jclass) {
2190 // Intentionally left empty.
2191}
2192
2193// Methods not annotated with anything are not considered "fast native"
2194// -- Check that the annotation lookup does not find it.
2195void JniCompilerTest::NormalNativeImpl() {
2196 SetUpForTest(/* direct */ true,
2197 "normalNative",
2198 "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002199 CURRENT_JNI_WRAPPER(Java_MyClassNatives_normalNative));
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002200
Andreas Gampe13b27842016-11-07 16:48:23 -08002201 ArtMethod* method = jni::DecodeArtMethod(jmethod_);
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002202 ASSERT_TRUE(method != nullptr);
2203
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002204 EXPECT_FALSE(method->IsAnnotatedWithCriticalNative());
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002205 EXPECT_FALSE(method->IsAnnotatedWithFastNative());
2206}
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002207
2208// TODO: just rename the java functions to the standard convention and remove duplicated tests
2209JNI_TEST_NORMAL_ONLY(NormalNative)
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002210
2211// Methods annotated with @FastNative are considered "fast native"
2212// -- Check that the annotation lookup succeeds.
2213void Java_MyClassNatives_fastNative(JNIEnv*, jclass) {
2214 // Intentionally left empty.
2215}
2216
2217void JniCompilerTest::FastNativeImpl() {
2218 SetUpForTest(/* direct */ true,
2219 "fastNative",
2220 "()V",
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002221 CURRENT_JNI_WRAPPER(Java_MyClassNatives_fastNative));
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002222
Andreas Gampe13b27842016-11-07 16:48:23 -08002223 ArtMethod* method = jni::DecodeArtMethod(jmethod_);
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002224 ASSERT_TRUE(method != nullptr);
2225
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002226 EXPECT_FALSE(method->IsAnnotatedWithCriticalNative());
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002227 EXPECT_TRUE(method->IsAnnotatedWithFastNative());
2228}
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002229
2230// TODO: just rename the java functions to the standard convention and remove duplicated tests
2231JNI_TEST_NORMAL_ONLY(FastNative)
2232
2233int gJava_myClassNatives_criticalNative_calls[kJniKindCount] = {};
2234// Methods annotated with @CriticalNative are considered "critical native"
2235// -- Check that the annotation lookup succeeds.
2236void Java_MyClassNatives_criticalNative() {
2237 gJava_myClassNatives_criticalNative_calls[gCurrentJni]++;
2238}
2239
2240void JniCompilerTest::CriticalNativeImpl() {
2241 SetUpForTest(/* direct */ true,
2242 // Important: Don't change the "current jni" yet to avoid a method name suffix.
2243 "criticalNative",
2244 "()V",
2245 // TODO: Use CURRENT_JNI_WRAPPER instead which is more generic.
2246 reinterpret_cast<void*>(&Java_MyClassNatives_criticalNative));
2247
2248 // TODO: remove this manual updating of the current JNI. Merge with the other tests.
2249 UpdateCurrentJni(JniKind::kCritical);
2250 ASSERT_TRUE(IsCurrentJniCritical());
2251
Andreas Gampe13b27842016-11-07 16:48:23 -08002252 ArtMethod* method = jni::DecodeArtMethod(jmethod_);
Igor Murashkin367f3dd2016-09-01 17:00:24 -07002253 ASSERT_TRUE(method != nullptr);
2254
2255 EXPECT_TRUE(method->IsAnnotatedWithCriticalNative());
2256 EXPECT_FALSE(method->IsAnnotatedWithFastNative());
2257
2258 EXPECT_EQ(0, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2259 env_->CallStaticVoidMethod(jklass_, jmethod_);
2260 EXPECT_EQ(1, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2261
2262 gJava_myClassNatives_criticalNative_calls[gCurrentJni] = 0;
2263}
2264
2265// TODO: just rename the java functions to the standard convention and remove duplicated tests
2266JNI_TEST_NORMAL_ONLY(CriticalNative)
Igor Murashkin9d4b6da2016-07-29 09:51:58 -07002267
Ian Rogersb033c752011-07-20 12:22:35 -07002268} // namespace art