xref: /aosp_15_r20/art/compiler/jni/jni_compiler_test.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #include <math.h>
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include <memory>
20*795d594fSAndroid Build Coastguard Worker #include <type_traits>
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker #include "art_method-inl.h"
23*795d594fSAndroid Build Coastguard Worker #include "base/bit_utils.h"
24*795d594fSAndroid Build Coastguard Worker #include "base/casts.h"
25*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
26*795d594fSAndroid Build Coastguard Worker #include "base/mem_map.h"
27*795d594fSAndroid Build Coastguard Worker #include "class_linker.h"
28*795d594fSAndroid Build Coastguard Worker #include "common_compiler_test.h"
29*795d594fSAndroid Build Coastguard Worker #include "compiler.h"
30*795d594fSAndroid Build Coastguard Worker #include "dex/dex_file.h"
31*795d594fSAndroid Build Coastguard Worker #include "driver/compiler_options.h"
32*795d594fSAndroid Build Coastguard Worker #include "entrypoints/entrypoint_utils-inl.h"
33*795d594fSAndroid Build Coastguard Worker #include "gtest/gtest.h"
34*795d594fSAndroid Build Coastguard Worker #include "indirect_reference_table.h"
35*795d594fSAndroid Build Coastguard Worker #include "java_frame_root_info.h"
36*795d594fSAndroid Build Coastguard Worker #include "jni/java_vm_ext.h"
37*795d594fSAndroid Build Coastguard Worker #include "jni/jni_internal.h"
38*795d594fSAndroid Build Coastguard Worker #include "mirror/class-inl.h"
39*795d594fSAndroid Build Coastguard Worker #include "mirror/class_loader.h"
40*795d594fSAndroid Build Coastguard Worker #include "mirror/object-inl.h"
41*795d594fSAndroid Build Coastguard Worker #include "mirror/object_array-inl.h"
42*795d594fSAndroid Build Coastguard Worker #include "mirror/stack_trace_element-inl.h"
43*795d594fSAndroid Build Coastguard Worker #include "nativehelper/scoped_local_ref.h"
44*795d594fSAndroid Build Coastguard Worker #include "nativeloader/native_loader.h"
45*795d594fSAndroid Build Coastguard Worker #include "oat/oat_quick_method_header.h"
46*795d594fSAndroid Build Coastguard Worker #include "runtime.h"
47*795d594fSAndroid Build Coastguard Worker #include "scoped_thread_state_change-inl.h"
48*795d594fSAndroid Build Coastguard Worker #include "thread-inl.h"
49*795d594fSAndroid Build Coastguard Worker 
Java_MyClassNatives_bar(JNIEnv *,jobject,jint count)50*795d594fSAndroid Build Coastguard Worker extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
51*795d594fSAndroid Build Coastguard Worker   return count + 1;
52*795d594fSAndroid Build Coastguard Worker }
53*795d594fSAndroid Build Coastguard Worker 
54*795d594fSAndroid Build Coastguard Worker // Note: JNI name mangling "_" -> "_1".
Java_MyClassNatives_bar_1Fast(JNIEnv *,jobject,jint count)55*795d594fSAndroid Build Coastguard Worker extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar_1Fast(JNIEnv*, jobject, jint count) {
56*795d594fSAndroid Build Coastguard Worker   return count + 1;
57*795d594fSAndroid Build Coastguard Worker }
58*795d594fSAndroid Build Coastguard Worker 
Java_MyClassNatives_sbar(JNIEnv *,jclass,jint count)59*795d594fSAndroid Build Coastguard Worker extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
60*795d594fSAndroid Build Coastguard Worker   return count + 1;
61*795d594fSAndroid Build Coastguard Worker }
62*795d594fSAndroid Build Coastguard Worker 
63*795d594fSAndroid Build Coastguard Worker // Note: JNI name mangling "_" -> "_1".
Java_MyClassNatives_sbar_1Fast(JNIEnv *,jclass,jint count)64*795d594fSAndroid Build Coastguard Worker extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar_1Fast(JNIEnv*, jclass, jint count) {
65*795d594fSAndroid Build Coastguard Worker   return count + 1;
66*795d594fSAndroid Build Coastguard Worker }
67*795d594fSAndroid Build Coastguard Worker 
68*795d594fSAndroid Build Coastguard Worker // Note: JNI name mangling "_" -> "_1".
Java_MyClassNatives_sbar_1Critical(jint count)69*795d594fSAndroid Build Coastguard Worker extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar_1Critical(jint count) {
70*795d594fSAndroid Build Coastguard Worker   return count + 1;
71*795d594fSAndroid Build Coastguard Worker }
72*795d594fSAndroid Build Coastguard Worker 
73*795d594fSAndroid Build Coastguard Worker // TODO: In the Baker read barrier configuration, add checks to ensure
74*795d594fSAndroid Build Coastguard Worker // the Marking Register's value is correct.
75*795d594fSAndroid Build Coastguard Worker 
76*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
77*795d594fSAndroid Build Coastguard Worker 
78*795d594fSAndroid Build Coastguard Worker enum class JniKind {
79*795d594fSAndroid Build Coastguard Worker   kNormal,      // Regular kind of un-annotated natives.
80*795d594fSAndroid Build Coastguard Worker   kFast,        // Native method annotated with @FastNative.
81*795d594fSAndroid Build Coastguard Worker   kCritical,    // Native method annotated with @CriticalNative.
82*795d594fSAndroid Build Coastguard Worker   kCount        // How many different types of JNIs we can have.
83*795d594fSAndroid Build Coastguard Worker };
84*795d594fSAndroid Build Coastguard Worker 
85*795d594fSAndroid Build Coastguard Worker // Used to initialize array sizes that want to have different state per current jni.
86*795d594fSAndroid Build Coastguard Worker static constexpr size_t kJniKindCount = static_cast<size_t>(JniKind::kCount);
87*795d594fSAndroid Build Coastguard Worker // Do not use directly, use the helpers instead.
88*795d594fSAndroid Build Coastguard Worker uint32_t gCurrentJni = static_cast<uint32_t>(JniKind::kNormal);
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker // Is the current native method under test @CriticalNative?
IsCurrentJniCritical()91*795d594fSAndroid Build Coastguard Worker static bool IsCurrentJniCritical() {
92*795d594fSAndroid Build Coastguard Worker   return gCurrentJni == static_cast<uint32_t>(JniKind::kCritical);
93*795d594fSAndroid Build Coastguard Worker }
94*795d594fSAndroid Build Coastguard Worker 
95*795d594fSAndroid Build Coastguard Worker // Is the current native method under test @FastNative?
IsCurrentJniFast()96*795d594fSAndroid Build Coastguard Worker static bool IsCurrentJniFast() {
97*795d594fSAndroid Build Coastguard Worker   return gCurrentJni == static_cast<uint32_t>(JniKind::kFast);
98*795d594fSAndroid Build Coastguard Worker }
99*795d594fSAndroid Build Coastguard Worker 
100*795d594fSAndroid Build Coastguard Worker // Is the current native method a plain-old non-annotated native?
IsCurrentJniNormal()101*795d594fSAndroid Build Coastguard Worker static bool IsCurrentJniNormal() {
102*795d594fSAndroid Build Coastguard Worker   return gCurrentJni == static_cast<uint32_t>(JniKind::kNormal);
103*795d594fSAndroid Build Coastguard Worker }
104*795d594fSAndroid Build Coastguard Worker 
105*795d594fSAndroid Build Coastguard Worker // Signify that a different kind of JNI is about to be tested.
UpdateCurrentJni(JniKind kind)106*795d594fSAndroid Build Coastguard Worker static void UpdateCurrentJni(JniKind kind) {
107*795d594fSAndroid Build Coastguard Worker   gCurrentJni = static_cast<uint32_t>(kind);
108*795d594fSAndroid Build Coastguard Worker }
109*795d594fSAndroid Build Coastguard Worker 
110*795d594fSAndroid Build Coastguard Worker // (Match the name suffixes of native methods in MyClassNatives.java)
CurrentJniStringSuffix()111*795d594fSAndroid Build Coastguard Worker static std::string CurrentJniStringSuffix() {
112*795d594fSAndroid Build Coastguard Worker   switch (gCurrentJni) {
113*795d594fSAndroid Build Coastguard Worker     case static_cast<uint32_t>(JniKind::kNormal): {
114*795d594fSAndroid Build Coastguard Worker       return "";
115*795d594fSAndroid Build Coastguard Worker     }
116*795d594fSAndroid Build Coastguard Worker     case static_cast<uint32_t>(JniKind::kFast): {
117*795d594fSAndroid Build Coastguard Worker       return "_Fast";
118*795d594fSAndroid Build Coastguard Worker     }
119*795d594fSAndroid Build Coastguard Worker     case static_cast<uint32_t>(JniKind::kCritical): {
120*795d594fSAndroid Build Coastguard Worker       return "_Critical";
121*795d594fSAndroid Build Coastguard Worker     }
122*795d594fSAndroid Build Coastguard Worker     default:
123*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "Invalid current JNI value: " << gCurrentJni;
124*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
125*795d594fSAndroid Build Coastguard Worker   }
126*795d594fSAndroid Build Coastguard Worker }
127*795d594fSAndroid Build Coastguard Worker 
128*795d594fSAndroid Build Coastguard Worker // Fake values passed to our JNI handlers when we enter @CriticalNative.
129*795d594fSAndroid Build Coastguard Worker // Normally @CriticalNative calling convention strips out the "JNIEnv*, jclass" parameters.
130*795d594fSAndroid Build Coastguard Worker // However to avoid duplicating every single test method we have a templated handler
131*795d594fSAndroid Build Coastguard Worker // that inserts fake parameters (0,1) to make it compatible with a regular JNI handler.
132*795d594fSAndroid Build Coastguard Worker static JNIEnv* const kCriticalFakeJniEnv = reinterpret_cast<JNIEnv*>(0xDEADFEAD);
133*795d594fSAndroid Build Coastguard Worker static jclass const kCriticalFakeJniClass = reinterpret_cast<jclass>(0xBEAFBEEF);
134*795d594fSAndroid Build Coastguard Worker 
135*795d594fSAndroid Build Coastguard Worker // Type trait. Returns true if "T" is the same type as one of the types in Args...
136*795d594fSAndroid Build Coastguard Worker //
137*795d594fSAndroid Build Coastguard Worker // Logically equal to OR(std::same_type<T, U> for all U in Args).
138*795d594fSAndroid Build Coastguard Worker template <typename T, typename ... Args>
139*795d594fSAndroid Build Coastguard Worker struct is_any_of;
140*795d594fSAndroid Build Coastguard Worker 
141*795d594fSAndroid Build Coastguard Worker template <typename T, typename U, typename ... Args>
142*795d594fSAndroid Build Coastguard Worker struct is_any_of<T, U, Args ...> {
143*795d594fSAndroid Build Coastguard Worker   using value_type = bool;
144*795d594fSAndroid Build Coastguard Worker   static constexpr const bool value = std::is_same<T, U>::value || is_any_of<T, Args ...>::value;
145*795d594fSAndroid Build Coastguard Worker };
146*795d594fSAndroid Build Coastguard Worker 
147*795d594fSAndroid Build Coastguard Worker template <typename T, typename U>
148*795d594fSAndroid Build Coastguard Worker struct is_any_of<T, U> {
149*795d594fSAndroid Build Coastguard Worker   using value_type = bool;
150*795d594fSAndroid Build Coastguard Worker   static constexpr const bool value = std::is_same<T, U>::value;
151*795d594fSAndroid Build Coastguard Worker };
152*795d594fSAndroid Build Coastguard Worker 
153*795d594fSAndroid Build Coastguard Worker // Type traits for JNI types.
154*795d594fSAndroid Build Coastguard Worker template <typename T>
155*795d594fSAndroid Build Coastguard Worker struct jni_type_traits {
156*795d594fSAndroid Build Coastguard Worker   // True if type T ends up holding an object reference. False otherwise.
157*795d594fSAndroid Build Coastguard Worker   // (Non-JNI types will also be false).
158*795d594fSAndroid Build Coastguard Worker   static constexpr const bool is_ref =
159*795d594fSAndroid Build Coastguard Worker       is_any_of<T, jclass, jobject, jstring, jobjectArray, jintArray,
160*795d594fSAndroid Build Coastguard Worker                 jcharArray, jfloatArray, jshortArray, jdoubleArray, jlongArray>::value;
161*795d594fSAndroid Build Coastguard Worker };
162*795d594fSAndroid Build Coastguard Worker 
163*795d594fSAndroid Build Coastguard Worker // Base case: No parameters = 0 refs.
count_nonnull_refs_helper()164*795d594fSAndroid Build Coastguard Worker size_t count_nonnull_refs_helper() {
165*795d594fSAndroid Build Coastguard Worker   return 0;
166*795d594fSAndroid Build Coastguard Worker }
167*795d594fSAndroid Build Coastguard Worker 
168*795d594fSAndroid Build Coastguard Worker // SFINAE for ref types. 1 if non-null, 0 otherwise.
169*795d594fSAndroid Build Coastguard Worker template <typename T>
count_nonnull_refs_single_helper(T arg,typename std::enable_if<jni_type_traits<T>::is_ref>::type * =nullptr)170*795d594fSAndroid Build Coastguard Worker size_t count_nonnull_refs_single_helper(T arg,
171*795d594fSAndroid Build Coastguard Worker                                         typename std::enable_if<jni_type_traits<T>::is_ref>::type*
172*795d594fSAndroid Build Coastguard Worker                                             = nullptr) {
173*795d594fSAndroid Build Coastguard Worker   return ((arg == NULL) ? 0 : 1);
174*795d594fSAndroid Build Coastguard Worker }
175*795d594fSAndroid Build Coastguard Worker 
176*795d594fSAndroid Build Coastguard Worker // SFINAE for non-ref-types. Always 0.
177*795d594fSAndroid Build Coastguard Worker template <typename T>
count_nonnull_refs_single_helper(T arg,typename std::enable_if<!jni_type_traits<T>::is_ref>::type * =nullptr)178*795d594fSAndroid Build Coastguard Worker size_t count_nonnull_refs_single_helper(
179*795d594fSAndroid Build Coastguard Worker     [[maybe_unused]] T arg, typename std::enable_if<!jni_type_traits<T>::is_ref>::type* = nullptr) {
180*795d594fSAndroid Build Coastguard Worker   return 0;
181*795d594fSAndroid Build Coastguard Worker }
182*795d594fSAndroid Build Coastguard Worker 
183*795d594fSAndroid Build Coastguard Worker // Recursive case.
184*795d594fSAndroid Build Coastguard Worker template <typename T, typename ... Args>
count_nonnull_refs_helper(T arg,Args...args)185*795d594fSAndroid Build Coastguard Worker size_t count_nonnull_refs_helper(T arg, Args ... args) {
186*795d594fSAndroid Build Coastguard Worker   return count_nonnull_refs_single_helper(arg) + count_nonnull_refs_helper(args...);
187*795d594fSAndroid Build Coastguard Worker }
188*795d594fSAndroid Build Coastguard Worker 
189*795d594fSAndroid Build Coastguard Worker // Given any list of parameters, check how many object refs there are and only count
190*795d594fSAndroid Build Coastguard Worker // them if their runtime value is non-null.
191*795d594fSAndroid Build Coastguard Worker //
192*795d594fSAndroid Build Coastguard Worker // For example given (jobject, jint, jclass) we can get (2) if both #0/#2 are non-null,
193*795d594fSAndroid Build Coastguard Worker // (1) if either #0/#2 are null but not both, and (0) if all parameters are null.
194*795d594fSAndroid Build Coastguard Worker // Primitive parameters (including JNIEnv*, if present) are ignored.
195*795d594fSAndroid Build Coastguard Worker template <typename ... Args>
count_nonnull_refs(Args...args)196*795d594fSAndroid Build Coastguard Worker size_t count_nonnull_refs(Args ... args) {
197*795d594fSAndroid Build Coastguard Worker   return count_nonnull_refs_helper(args...);
198*795d594fSAndroid Build Coastguard Worker }
199*795d594fSAndroid Build Coastguard Worker 
200*795d594fSAndroid Build Coastguard Worker template <typename T, T* fn>
201*795d594fSAndroid Build Coastguard Worker struct remove_extra_parameters_helper;
202*795d594fSAndroid Build Coastguard Worker 
203*795d594fSAndroid Build Coastguard Worker template <typename R, typename Arg1, typename Arg2, typename ... Args, R (*fn)(Arg1, Arg2, Args...)>
204*795d594fSAndroid Build Coastguard Worker struct remove_extra_parameters_helper<R(Arg1, Arg2, Args...), fn> {
205*795d594fSAndroid Build Coastguard Worker   // Note: Do not use Args&& here to maintain C-style parameter types.
applyart::remove_extra_parameters_helper206*795d594fSAndroid Build Coastguard Worker   static R apply(Args... args) {
207*795d594fSAndroid Build Coastguard Worker     JNIEnv* env = kCriticalFakeJniEnv;
208*795d594fSAndroid Build Coastguard Worker     jclass kls = kCriticalFakeJniClass;
209*795d594fSAndroid Build Coastguard Worker     return fn(env, kls, args...);
210*795d594fSAndroid Build Coastguard Worker   }
211*795d594fSAndroid Build Coastguard Worker };
212*795d594fSAndroid Build Coastguard Worker 
213*795d594fSAndroid Build Coastguard Worker // Given a function 'fn' create a function 'apply' which will omit the JNIEnv/jklass parameters
214*795d594fSAndroid Build Coastguard Worker //
215*795d594fSAndroid Build Coastguard Worker // i.e. if fn(JNIEnv*,jklass,a,b,c,d,e...) then apply(a,b,c,d,e,...)
216*795d594fSAndroid Build Coastguard Worker template <typename T, T* fn>
217*795d594fSAndroid Build Coastguard Worker struct jni_remove_extra_parameters : public remove_extra_parameters_helper<T, fn> {};
218*795d594fSAndroid Build Coastguard Worker 
219*795d594fSAndroid Build Coastguard Worker class JniCompilerTest : public CommonCompilerTest {
220*795d594fSAndroid Build Coastguard Worker  protected:
SetUp()221*795d594fSAndroid Build Coastguard Worker   void SetUp() override {
222*795d594fSAndroid Build Coastguard Worker     CommonCompilerTest::SetUp();
223*795d594fSAndroid Build Coastguard Worker     check_generic_jni_ = false;
224*795d594fSAndroid Build Coastguard Worker   }
225*795d594fSAndroid Build Coastguard Worker 
TearDown()226*795d594fSAndroid Build Coastguard Worker   void TearDown() override {
227*795d594fSAndroid Build Coastguard Worker     android::ResetNativeLoader();
228*795d594fSAndroid Build Coastguard Worker     CommonCompilerTest::TearDown();
229*795d594fSAndroid Build Coastguard Worker   }
230*795d594fSAndroid Build Coastguard Worker 
SetCheckGenericJni(bool generic)231*795d594fSAndroid Build Coastguard Worker   void SetCheckGenericJni(bool generic) {
232*795d594fSAndroid Build Coastguard Worker     check_generic_jni_ = generic;
233*795d594fSAndroid Build Coastguard Worker   }
234*795d594fSAndroid Build Coastguard Worker 
235*795d594fSAndroid Build Coastguard Worker  private:
CompileForTest(jobject class_loader,bool direct,const char * method_name,const char * method_sig)236*795d594fSAndroid Build Coastguard Worker   void CompileForTest(jobject class_loader,
237*795d594fSAndroid Build Coastguard Worker                       bool direct,
238*795d594fSAndroid Build Coastguard Worker                       const char* method_name,
239*795d594fSAndroid Build Coastguard Worker                       const char* method_sig) {
240*795d594fSAndroid Build Coastguard Worker     Thread* self = Thread::Current();
241*795d594fSAndroid Build Coastguard Worker     ScopedObjectAccess soa(self);
242*795d594fSAndroid Build Coastguard Worker     StackHandleScope<2> hs(self);
243*795d594fSAndroid Build Coastguard Worker     Handle<mirror::ClassLoader> loader(
244*795d594fSAndroid Build Coastguard Worker         hs.NewHandle(soa.Decode<mirror::ClassLoader>(class_loader)));
245*795d594fSAndroid Build Coastguard Worker     // Compile the native method before starting the runtime
246*795d594fSAndroid Build Coastguard Worker     Handle<mirror::Class> c = hs.NewHandle(FindClass("LMyClassNatives;", loader));
247*795d594fSAndroid Build Coastguard Worker     const auto pointer_size = class_linker_->GetImagePointerSize();
248*795d594fSAndroid Build Coastguard Worker     ArtMethod* method = c->FindClassMethod(method_name, method_sig, pointer_size);
249*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(method != nullptr) << method_name << " " << method_sig;
250*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(direct, method->IsDirect()) << method_name << " " << method_sig;
251*795d594fSAndroid Build Coastguard Worker     if (direct) {
252*795d594fSAndroid Build Coastguard Worker       // Class initialization could replace the entrypoint, so force
253*795d594fSAndroid Build Coastguard Worker       // the initialization before we set up the entrypoint below.
254*795d594fSAndroid Build Coastguard Worker       class_linker_->EnsureInitialized(
255*795d594fSAndroid Build Coastguard Worker           self, c, /*can_init_fields=*/ true, /*can_init_parents=*/ true);
256*795d594fSAndroid Build Coastguard Worker       {
257*795d594fSAndroid Build Coastguard Worker         ScopedThreadSuspension sts(self, ThreadState::kNative);
258*795d594fSAndroid Build Coastguard Worker         class_linker_->MakeInitializedClassesVisiblyInitialized(self, /*wait=*/ true);
259*795d594fSAndroid Build Coastguard Worker       }
260*795d594fSAndroid Build Coastguard Worker     }
261*795d594fSAndroid Build Coastguard Worker     if (check_generic_jni_) {
262*795d594fSAndroid Build Coastguard Worker       method->SetEntryPointFromQuickCompiledCode(class_linker_->GetRuntimeQuickGenericJniStub());
263*795d594fSAndroid Build Coastguard Worker     } else {
264*795d594fSAndroid Build Coastguard Worker       const void* code = method->GetEntryPointFromQuickCompiledCode();
265*795d594fSAndroid Build Coastguard Worker       if (code == nullptr || class_linker_->IsQuickGenericJniStub(code)) {
266*795d594fSAndroid Build Coastguard Worker         CompileMethod(method);
267*795d594fSAndroid Build Coastguard Worker         ASSERT_TRUE(method->GetEntryPointFromQuickCompiledCode() != nullptr)
268*795d594fSAndroid Build Coastguard Worker             << method_name << " " << method_sig;
269*795d594fSAndroid Build Coastguard Worker       }
270*795d594fSAndroid Build Coastguard Worker     }
271*795d594fSAndroid Build Coastguard Worker   }
272*795d594fSAndroid Build Coastguard Worker 
273*795d594fSAndroid Build Coastguard Worker  protected:
CompileForTestWithCurrentJni(jobject class_loader,bool direct,const char * method_name_orig,const char * method_sig)274*795d594fSAndroid Build Coastguard Worker   void CompileForTestWithCurrentJni(jobject class_loader,
275*795d594fSAndroid Build Coastguard Worker                                     bool direct,
276*795d594fSAndroid Build Coastguard Worker                                     const char* method_name_orig,
277*795d594fSAndroid Build Coastguard Worker                                     const char* method_sig) {
278*795d594fSAndroid Build Coastguard Worker     // Append the JNI kind to the method name, so that we automatically get the
279*795d594fSAndroid Build Coastguard Worker     // fast or critical versions of the same method.
280*795d594fSAndroid Build Coastguard Worker     std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
281*795d594fSAndroid Build Coastguard Worker     const char* method_name = method_name_str.c_str();
282*795d594fSAndroid Build Coastguard Worker 
283*795d594fSAndroid Build Coastguard Worker     CompileForTest(class_loader, direct, method_name, method_sig);
284*795d594fSAndroid Build Coastguard Worker   }
285*795d594fSAndroid Build Coastguard Worker 
SetUpForTest(bool direct,const char * method_name_orig,const char * method_sig,void * native_fnptr)286*795d594fSAndroid Build Coastguard Worker   void SetUpForTest(bool direct,
287*795d594fSAndroid Build Coastguard Worker                     const char* method_name_orig,
288*795d594fSAndroid Build Coastguard Worker                     const char* method_sig,
289*795d594fSAndroid Build Coastguard Worker                     void* native_fnptr) {
290*795d594fSAndroid Build Coastguard Worker     // Append the JNI kind to the method name, so that we automatically get the
291*795d594fSAndroid Build Coastguard Worker     // fast or critical versions of the same method.
292*795d594fSAndroid Build Coastguard Worker     std::string method_name_str = std::string(method_name_orig) + CurrentJniStringSuffix();
293*795d594fSAndroid Build Coastguard Worker     const char* method_name = method_name_str.c_str();
294*795d594fSAndroid Build Coastguard Worker 
295*795d594fSAndroid Build Coastguard Worker     // Initialize class loader and compile method when runtime not started.
296*795d594fSAndroid Build Coastguard Worker     if (!runtime_->IsStarted()) {
297*795d594fSAndroid Build Coastguard Worker       {
298*795d594fSAndroid Build Coastguard Worker         ScopedObjectAccess soa(Thread::Current());
299*795d594fSAndroid Build Coastguard Worker         class_loader_ = LoadDex("MyClassNatives");
300*795d594fSAndroid Build Coastguard Worker       }
301*795d594fSAndroid Build Coastguard Worker       CompileForTest(class_loader_, direct, method_name, method_sig);
302*795d594fSAndroid Build Coastguard Worker       // Start runtime.
303*795d594fSAndroid Build Coastguard Worker       Thread::Current()->TransitionFromSuspendedToRunnable();
304*795d594fSAndroid Build Coastguard Worker       android::InitializeNativeLoader();
305*795d594fSAndroid Build Coastguard Worker       bool started = runtime_->Start();
306*795d594fSAndroid Build Coastguard Worker       CHECK(started);
307*795d594fSAndroid Build Coastguard Worker     }
308*795d594fSAndroid Build Coastguard Worker     // JNI operations after runtime start.
309*795d594fSAndroid Build Coastguard Worker     env_ = Thread::Current()->GetJniEnv();
310*795d594fSAndroid Build Coastguard Worker     jklass_ = env_->FindClass("MyClassNatives");
311*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(jklass_ != nullptr) << method_name << " " << method_sig;
312*795d594fSAndroid Build Coastguard Worker 
313*795d594fSAndroid Build Coastguard Worker     if (direct) {
314*795d594fSAndroid Build Coastguard Worker       jmethod_ = env_->GetStaticMethodID(jklass_, method_name, method_sig);
315*795d594fSAndroid Build Coastguard Worker     } else {
316*795d594fSAndroid Build Coastguard Worker       jmethod_ = env_->GetMethodID(jklass_, method_name, method_sig);
317*795d594fSAndroid Build Coastguard Worker     }
318*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(jmethod_ != nullptr) << method_name << " " << method_sig;
319*795d594fSAndroid Build Coastguard Worker 
320*795d594fSAndroid Build Coastguard Worker     // Make sure the test class is visibly initialized so that the RegisterNatives() below
321*795d594fSAndroid Build Coastguard Worker     // sets the JNI entrypoint rather than leaving it as null (this test pretends to be an
322*795d594fSAndroid Build Coastguard Worker     // AOT compiler and therefore the ClassLinker skips entrypoint initialization). Even
323*795d594fSAndroid Build Coastguard Worker     // if the ClassLinker initialized it with a stub, we would not want to test that here.
324*795d594fSAndroid Build Coastguard Worker     class_linker_->MakeInitializedClassesVisiblyInitialized(Thread::Current(), /*wait=*/ true);
325*795d594fSAndroid Build Coastguard Worker 
326*795d594fSAndroid Build Coastguard Worker     if (native_fnptr != nullptr) {
327*795d594fSAndroid Build Coastguard Worker       JNINativeMethod methods[] = { { method_name, method_sig, native_fnptr } };
328*795d594fSAndroid Build Coastguard Worker       ASSERT_EQ(JNI_OK, env_->RegisterNatives(jklass_, methods, 1))
329*795d594fSAndroid Build Coastguard Worker               << method_name << " " << method_sig;
330*795d594fSAndroid Build Coastguard Worker     } else {
331*795d594fSAndroid Build Coastguard Worker       env_->UnregisterNatives(jklass_);
332*795d594fSAndroid Build Coastguard Worker     }
333*795d594fSAndroid Build Coastguard Worker 
334*795d594fSAndroid Build Coastguard Worker     jmethodID constructor = env_->GetMethodID(jklass_, "<init>", "()V");
335*795d594fSAndroid Build Coastguard Worker     jobj_ = env_->NewObject(jklass_, constructor);
336*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(jobj_ != nullptr) << method_name << " " << method_sig;
337*795d594fSAndroid Build Coastguard Worker   }
338*795d594fSAndroid Build Coastguard Worker 
339*795d594fSAndroid Build Coastguard Worker  public:
340*795d594fSAndroid Build Coastguard Worker   // Available as statics so our JNI handlers can access these.
341*795d594fSAndroid Build Coastguard Worker   static jclass jklass_;
342*795d594fSAndroid Build Coastguard Worker   static jobject jobj_;
343*795d594fSAndroid Build Coastguard Worker   static jobject class_loader_;
344*795d594fSAndroid Build Coastguard Worker 
345*795d594fSAndroid Build Coastguard Worker   static void AssertCallerObjectLocked(JNIEnv* env);
346*795d594fSAndroid Build Coastguard Worker 
347*795d594fSAndroid Build Coastguard Worker   static LockWord GetLockWord(jobject obj);
348*795d594fSAndroid Build Coastguard Worker 
349*795d594fSAndroid Build Coastguard Worker  protected:
350*795d594fSAndroid Build Coastguard Worker   // We have to list the methods here so we can share them between default and generic JNI.
351*795d594fSAndroid Build Coastguard Worker   void CompileAndRunNoArgMethodImpl();
352*795d594fSAndroid Build Coastguard Worker   void CompileAndRunIntMethodThroughStubImpl();
353*795d594fSAndroid Build Coastguard Worker   void CompileAndRunStaticIntMethodThroughStubImpl();
354*795d594fSAndroid Build Coastguard Worker   void CompileAndRunIntMethodImpl();
355*795d594fSAndroid Build Coastguard Worker   void CompileAndRunIntIntMethodImpl();
356*795d594fSAndroid Build Coastguard Worker   void CompileAndRunLongLongMethodImpl();
357*795d594fSAndroid Build Coastguard Worker   void CompileAndRunDoubleDoubleMethodImpl();
358*795d594fSAndroid Build Coastguard Worker   void CompileAndRun_fooJJ_synchronizedImpl();
359*795d594fSAndroid Build Coastguard Worker   void CompileAndRunIntObjectObjectMethodImpl();
360*795d594fSAndroid Build Coastguard Worker   void CompileAndRunStaticIntIntMethodImpl();
361*795d594fSAndroid Build Coastguard Worker   void CompileAndRunStaticDoubleDoubleMethodImpl();
362*795d594fSAndroid Build Coastguard Worker   void RunStaticLogDoubleMethodImpl();
363*795d594fSAndroid Build Coastguard Worker   void RunStaticLogFloatMethodImpl();
364*795d594fSAndroid Build Coastguard Worker   void RunStaticReturnTrueImpl();
365*795d594fSAndroid Build Coastguard Worker   void RunStaticReturnFalseImpl();
366*795d594fSAndroid Build Coastguard Worker   void RunGenericStaticReturnIntImpl();
367*795d594fSAndroid Build Coastguard Worker   void RunGenericStaticReturnDoubleImpl();
368*795d594fSAndroid Build Coastguard Worker   void RunGenericStaticReturnLongImpl();
369*795d594fSAndroid Build Coastguard Worker   void CompileAndRunStaticIntObjectObjectMethodImpl();
370*795d594fSAndroid Build Coastguard Worker   void CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl();
371*795d594fSAndroid Build Coastguard Worker   void ExceptionHandlingImpl();
372*795d594fSAndroid Build Coastguard Worker   void NativeStackTraceElementImpl();
373*795d594fSAndroid Build Coastguard Worker   void ReturnGlobalRefImpl();
374*795d594fSAndroid Build Coastguard Worker   void LocalReferenceTableClearingTestImpl();
375*795d594fSAndroid Build Coastguard Worker   void JavaLangSystemArrayCopyImpl();
376*795d594fSAndroid Build Coastguard Worker   void CompareAndSwapIntImpl();
377*795d594fSAndroid Build Coastguard Worker   void GetTextImpl();
378*795d594fSAndroid Build Coastguard Worker   void GetSinkPropertiesNativeImpl();
379*795d594fSAndroid Build Coastguard Worker   void UpcallReturnTypeChecking_InstanceImpl();
380*795d594fSAndroid Build Coastguard Worker   void UpcallReturnTypeChecking_StaticImpl();
381*795d594fSAndroid Build Coastguard Worker   void UpcallArgumentTypeChecking_InstanceImpl();
382*795d594fSAndroid Build Coastguard Worker   void UpcallArgumentTypeChecking_StaticImpl();
383*795d594fSAndroid Build Coastguard Worker   void CompileAndRunFloatFloatMethodImpl();
384*795d594fSAndroid Build Coastguard Worker   void CheckParameterAlignImpl();
385*795d594fSAndroid Build Coastguard Worker   void MaxParamNumberImpl();
386*795d594fSAndroid Build Coastguard Worker   void WithoutImplementationImpl();
387*795d594fSAndroid Build Coastguard Worker   void WithoutImplementationRefReturnImpl();
388*795d594fSAndroid Build Coastguard Worker   void StaticWithoutImplementationImpl();
389*795d594fSAndroid Build Coastguard Worker   void StackArgsIntsFirstImpl();
390*795d594fSAndroid Build Coastguard Worker   void StackArgsFloatsFirstImpl();
391*795d594fSAndroid Build Coastguard Worker   void StackArgsMixedImpl();
392*795d594fSAndroid Build Coastguard Worker 
393*795d594fSAndroid Build Coastguard Worker   void NormalNativeImpl();
394*795d594fSAndroid Build Coastguard Worker   void FastNativeImpl();
395*795d594fSAndroid Build Coastguard Worker   void CriticalNativeImpl();
396*795d594fSAndroid Build Coastguard Worker 
397*795d594fSAndroid Build Coastguard Worker   JNIEnv* env_;
398*795d594fSAndroid Build Coastguard Worker   jmethodID jmethod_;
399*795d594fSAndroid Build Coastguard Worker 
400*795d594fSAndroid Build Coastguard Worker  private:
401*795d594fSAndroid Build Coastguard Worker   bool check_generic_jni_;
402*795d594fSAndroid Build Coastguard Worker };
403*795d594fSAndroid Build Coastguard Worker 
404*795d594fSAndroid Build Coastguard Worker jclass JniCompilerTest::jklass_;
405*795d594fSAndroid Build Coastguard Worker jobject JniCompilerTest::jobj_;
406*795d594fSAndroid Build Coastguard Worker jobject JniCompilerTest::class_loader_;
407*795d594fSAndroid Build Coastguard Worker 
AssertCallerObjectLocked(JNIEnv * env)408*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::AssertCallerObjectLocked(JNIEnv* env) {
409*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::ForEnv(env);
410*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(self, Thread::Current());
411*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self);
412*795d594fSAndroid Build Coastguard Worker   ArtMethod** caller_frame = self->GetManagedStack()->GetTopQuickFrame();
413*795d594fSAndroid Build Coastguard Worker   CHECK(caller_frame != nullptr);
414*795d594fSAndroid Build Coastguard Worker   ArtMethod* caller = *caller_frame;
415*795d594fSAndroid Build Coastguard Worker   CHECK(caller != nullptr);
416*795d594fSAndroid Build Coastguard Worker   CHECK(caller->IsNative());
417*795d594fSAndroid Build Coastguard Worker   CHECK(!caller->IsFastNative());
418*795d594fSAndroid Build Coastguard Worker   CHECK(!caller->IsCriticalNative());
419*795d594fSAndroid Build Coastguard Worker   CHECK(caller->IsSynchronized());
420*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> lock;
421*795d594fSAndroid Build Coastguard Worker   if (self->GetManagedStack()->GetTopQuickFrameGenericJniTag()) {
422*795d594fSAndroid Build Coastguard Worker     // Generic JNI.
423*795d594fSAndroid Build Coastguard Worker     lock = GetGenericJniSynchronizationObject(self, caller);
424*795d594fSAndroid Build Coastguard Worker   } else if (caller->IsStatic()) {
425*795d594fSAndroid Build Coastguard Worker     lock = caller->GetDeclaringClass();
426*795d594fSAndroid Build Coastguard Worker   } else {
427*795d594fSAndroid Build Coastguard Worker     uint8_t* sp = reinterpret_cast<uint8_t*>(caller_frame);
428*795d594fSAndroid Build Coastguard Worker     const void* code_ptr = EntryPointToCodePointer(caller->GetEntryPointFromQuickCompiledCode());
429*795d594fSAndroid Build Coastguard Worker     OatQuickMethodHeader* method_header = OatQuickMethodHeader::FromCodePointer(code_ptr);
430*795d594fSAndroid Build Coastguard Worker     size_t frame_size = method_header->GetFrameSizeInBytes();
431*795d594fSAndroid Build Coastguard Worker     StackReference<mirror::Object>* this_ref = reinterpret_cast<StackReference<mirror::Object>*>(
432*795d594fSAndroid Build Coastguard Worker         sp + frame_size + static_cast<size_t>(kRuntimePointerSize));
433*795d594fSAndroid Build Coastguard Worker     lock = this_ref->AsMirrorPtr();
434*795d594fSAndroid Build Coastguard Worker   }
435*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(Monitor::GetLockOwnerThreadId(lock), self->GetThreadId());
436*795d594fSAndroid Build Coastguard Worker }
437*795d594fSAndroid Build Coastguard Worker 
GetLockWord(jobject obj)438*795d594fSAndroid Build Coastguard Worker LockWord JniCompilerTest::GetLockWord(jobject obj) {
439*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(Thread::Current());
440*795d594fSAndroid Build Coastguard Worker   return soa.Decode<mirror::Object>(obj)->GetLockWord(/*as_volatile=*/ false);
441*795d594fSAndroid Build Coastguard Worker }
442*795d594fSAndroid Build Coastguard Worker 
443*795d594fSAndroid Build Coastguard Worker // Test the normal compiler and normal generic JNI only.
444*795d594fSAndroid Build Coastguard Worker // The following features are unsupported in @FastNative:
445*795d594fSAndroid Build Coastguard Worker // 1) synchronized keyword
446*795d594fSAndroid Build Coastguard Worker # define JNI_TEST_NORMAL_ONLY(TestName)          \
447*795d594fSAndroid Build Coastguard Worker   TEST_F(JniCompilerTest, TestName ## NormalCompiler) { \
448*795d594fSAndroid Build Coastguard Worker     ScopedCheckHandleScope top_handle_scope_check;  \
449*795d594fSAndroid Build Coastguard Worker     SCOPED_TRACE("Normal JNI with compiler");    \
450*795d594fSAndroid Build Coastguard Worker     gCurrentJni = static_cast<uint32_t>(JniKind::kNormal); \
451*795d594fSAndroid Build Coastguard Worker     TestName ## Impl();                          \
452*795d594fSAndroid Build Coastguard Worker   }                                              \
453*795d594fSAndroid Build Coastguard Worker   TEST_F(JniCompilerTest, TestName ## NormalGeneric) { \
454*795d594fSAndroid Build Coastguard Worker     ScopedCheckHandleScope top_handle_scope_check;  \
455*795d594fSAndroid Build Coastguard Worker     SCOPED_TRACE("Normal JNI with generic");     \
456*795d594fSAndroid Build Coastguard Worker     gCurrentJni = static_cast<uint32_t>(JniKind::kNormal); \
457*795d594fSAndroid Build Coastguard Worker     SetCheckGenericJni(true);                    \
458*795d594fSAndroid Build Coastguard Worker     TestName ## Impl();                          \
459*795d594fSAndroid Build Coastguard Worker   }
460*795d594fSAndroid Build Coastguard Worker 
461*795d594fSAndroid Build Coastguard Worker // Test (normal, @FastNative) x (compiler, generic).
462*795d594fSAndroid Build Coastguard Worker #define JNI_TEST(TestName) \
463*795d594fSAndroid Build Coastguard Worker   JNI_TEST_NORMAL_ONLY(TestName)                 \
464*795d594fSAndroid Build Coastguard Worker   TEST_F(JniCompilerTest, TestName ## FastCompiler) {    \
465*795d594fSAndroid Build Coastguard Worker     ScopedCheckHandleScope top_handle_scope_check;  \
466*795d594fSAndroid Build Coastguard Worker     SCOPED_TRACE("@FastNative JNI with compiler");  \
467*795d594fSAndroid Build Coastguard Worker     gCurrentJni = static_cast<uint32_t>(JniKind::kFast); \
468*795d594fSAndroid Build Coastguard Worker     TestName ## Impl();                          \
469*795d594fSAndroid Build Coastguard Worker   }                                              \
470*795d594fSAndroid Build Coastguard Worker                                                  \
471*795d594fSAndroid Build Coastguard Worker   TEST_F(JniCompilerTest, TestName ## FastGeneric) { \
472*795d594fSAndroid Build Coastguard Worker     ScopedCheckHandleScope top_handle_scope_check;  \
473*795d594fSAndroid Build Coastguard Worker     SCOPED_TRACE("@FastNative JNI with generic");  \
474*795d594fSAndroid Build Coastguard Worker     gCurrentJni = static_cast<uint32_t>(JniKind::kFast); \
475*795d594fSAndroid Build Coastguard Worker     SetCheckGenericJni(true);                    \
476*795d594fSAndroid Build Coastguard Worker     TestName ## Impl();                          \
477*795d594fSAndroid Build Coastguard Worker   }
478*795d594fSAndroid Build Coastguard Worker 
479*795d594fSAndroid Build Coastguard Worker // Test (@CriticalNative) x (compiler, generic) only.
480*795d594fSAndroid Build Coastguard Worker #define JNI_TEST_CRITICAL_ONLY(TestName) \
481*795d594fSAndroid Build Coastguard Worker   TEST_F(JniCompilerTest, TestName ## CriticalCompiler) { \
482*795d594fSAndroid Build Coastguard Worker     ScopedCheckHandleScope top_handle_scope_check;  \
483*795d594fSAndroid Build Coastguard Worker     SCOPED_TRACE("@CriticalNative JNI with compiler");  \
484*795d594fSAndroid Build Coastguard Worker     gCurrentJni = static_cast<uint32_t>(JniKind::kCritical); \
485*795d594fSAndroid Build Coastguard Worker     TestName ## Impl();                          \
486*795d594fSAndroid Build Coastguard Worker   }                                              \
487*795d594fSAndroid Build Coastguard Worker   TEST_F(JniCompilerTest, TestName ## CriticalGeneric) { \
488*795d594fSAndroid Build Coastguard Worker     ScopedCheckHandleScope top_handle_scope_check;  \
489*795d594fSAndroid Build Coastguard Worker     SCOPED_TRACE("@CriticalNative JNI with generic");  \
490*795d594fSAndroid Build Coastguard Worker     gCurrentJni = static_cast<uint32_t>(JniKind::kCritical); \
491*795d594fSAndroid Build Coastguard Worker     SetCheckGenericJni(true);                    \
492*795d594fSAndroid Build Coastguard Worker     TestName ## Impl();                          \
493*795d594fSAndroid Build Coastguard Worker   }
494*795d594fSAndroid Build Coastguard Worker 
495*795d594fSAndroid Build Coastguard Worker // Test everything: (normal, @FastNative, @CriticalNative) x (compiler, generic).
496*795d594fSAndroid Build Coastguard Worker #define JNI_TEST_CRITICAL(TestName)              \
497*795d594fSAndroid Build Coastguard Worker   JNI_TEST(TestName)                             \
498*795d594fSAndroid Build Coastguard Worker   JNI_TEST_CRITICAL_ONLY(TestName)               \
499*795d594fSAndroid Build Coastguard Worker 
expectValidThreadState()500*795d594fSAndroid Build Coastguard Worker static void expectValidThreadState() {
501*795d594fSAndroid Build Coastguard Worker   // Normal JNI always transitions to "Native". Other JNIs stay in the "Runnable" state.
502*795d594fSAndroid Build Coastguard Worker   if (IsCurrentJniNormal()) {
503*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(ThreadState::kNative, Thread::Current()->GetState());
504*795d594fSAndroid Build Coastguard Worker   } else {
505*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(ThreadState::kRunnable, Thread::Current()->GetState());
506*795d594fSAndroid Build Coastguard Worker   }
507*795d594fSAndroid Build Coastguard Worker }
508*795d594fSAndroid Build Coastguard Worker 
509*795d594fSAndroid Build Coastguard Worker #define EXPECT_THREAD_STATE_FOR_CURRENT_JNI() expectValidThreadState()
510*795d594fSAndroid Build Coastguard Worker 
expectValidMutatorLockHeld()511*795d594fSAndroid Build Coastguard Worker static void expectValidMutatorLockHeld() {
512*795d594fSAndroid Build Coastguard Worker   if (IsCurrentJniNormal()) {
513*795d594fSAndroid Build Coastguard Worker     Locks::mutator_lock_->AssertNotHeld(Thread::Current());
514*795d594fSAndroid Build Coastguard Worker   } else {
515*795d594fSAndroid Build Coastguard Worker     Locks::mutator_lock_->AssertSharedHeld(Thread::Current());
516*795d594fSAndroid Build Coastguard Worker   }
517*795d594fSAndroid Build Coastguard Worker }
518*795d594fSAndroid Build Coastguard Worker 
519*795d594fSAndroid Build Coastguard Worker #define EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI() expectValidMutatorLockHeld()
520*795d594fSAndroid Build Coastguard Worker 
expectValidJniEnvAndObject(JNIEnv * env,jobject thisObj)521*795d594fSAndroid Build Coastguard Worker static void expectValidJniEnvAndObject(JNIEnv* env, jobject thisObj) {
522*795d594fSAndroid Build Coastguard Worker   if (!IsCurrentJniCritical()) {
523*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
524*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(thisObj != nullptr);
525*795d594fSAndroid Build Coastguard Worker     EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
526*795d594fSAndroid Build Coastguard Worker   } else {
527*795d594fSAndroid Build Coastguard Worker     LOG(FATAL) << "Objects are not supported for @CriticalNative, why is this being tested?";
528*795d594fSAndroid Build Coastguard Worker     UNREACHABLE();
529*795d594fSAndroid Build Coastguard Worker   }
530*795d594fSAndroid Build Coastguard Worker }
531*795d594fSAndroid Build Coastguard Worker 
532*795d594fSAndroid Build Coastguard Worker // Validates the JNIEnv to be the same as the current thread's JNIEnv, and makes sure
533*795d594fSAndroid Build Coastguard Worker // that the object here is an instance of the class we registered the method with.
534*795d594fSAndroid Build Coastguard Worker //
535*795d594fSAndroid Build Coastguard Worker // Hard-fails if this somehow gets invoked for @CriticalNative since objects are unsupported.
536*795d594fSAndroid Build Coastguard Worker #define EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj) \
537*795d594fSAndroid Build Coastguard Worker     expectValidJniEnvAndObject(env, thisObj)
538*795d594fSAndroid Build Coastguard Worker 
expectValidJniEnvAndClass(JNIEnv * env,jclass kls)539*795d594fSAndroid Build Coastguard Worker static void expectValidJniEnvAndClass(JNIEnv* env, jclass kls) {
540*795d594fSAndroid Build Coastguard Worker   if (!IsCurrentJniCritical()) {
541*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
542*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(kls != nullptr);
543*795d594fSAndroid Build Coastguard Worker     EXPECT_TRUE(env->IsSameObject(static_cast<jobject>(JniCompilerTest::jklass_),
544*795d594fSAndroid Build Coastguard Worker                                   static_cast<jobject>(kls)));
545*795d594fSAndroid Build Coastguard Worker   } else {
546*795d594fSAndroid Build Coastguard Worker     // This is pretty much vacuously true but catch any testing setup mistakes.
547*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(env, kCriticalFakeJniEnv);
548*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(kls, kCriticalFakeJniClass);
549*795d594fSAndroid Build Coastguard Worker   }
550*795d594fSAndroid Build Coastguard Worker }
551*795d594fSAndroid Build Coastguard Worker 
552*795d594fSAndroid Build Coastguard Worker // Validates the JNIEnv is the same as the current thread's JNIenv, and makes sure
553*795d594fSAndroid Build Coastguard Worker // that the jclass we got in the JNI handler is the same one as the class the method was looked
554*795d594fSAndroid Build Coastguard Worker // up for.
555*795d594fSAndroid Build Coastguard Worker //
556*795d594fSAndroid Build Coastguard Worker // (Checks are skipped for @CriticalNative since the two values are fake).
557*795d594fSAndroid Build Coastguard Worker #define EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls) expectValidJniEnvAndClass(env, kls)
558*795d594fSAndroid Build Coastguard Worker 
559*795d594fSAndroid Build Coastguard Worker // Temporarily disable the EXPECT_NUM_STACK_REFERENCES check (for a single test).
560*795d594fSAndroid Build Coastguard Worker struct ScopedDisableCheckNumStackReferences {
ScopedDisableCheckNumStackReferencesart::ScopedDisableCheckNumStackReferences561*795d594fSAndroid Build Coastguard Worker   ScopedDisableCheckNumStackReferences() {
562*795d594fSAndroid Build Coastguard Worker     CHECK(sCheckNumStackReferences);  // No nested support.
563*795d594fSAndroid Build Coastguard Worker     sCheckNumStackReferences = false;
564*795d594fSAndroid Build Coastguard Worker   }
565*795d594fSAndroid Build Coastguard Worker 
~ScopedDisableCheckNumStackReferencesart::ScopedDisableCheckNumStackReferences566*795d594fSAndroid Build Coastguard Worker   ~ScopedDisableCheckNumStackReferences() {
567*795d594fSAndroid Build Coastguard Worker     sCheckNumStackReferences = true;
568*795d594fSAndroid Build Coastguard Worker   }
569*795d594fSAndroid Build Coastguard Worker 
570*795d594fSAndroid Build Coastguard Worker   static bool sCheckNumStackReferences;
571*795d594fSAndroid Build Coastguard Worker };
572*795d594fSAndroid Build Coastguard Worker 
573*795d594fSAndroid Build Coastguard Worker bool ScopedDisableCheckNumStackReferences::sCheckNumStackReferences = true;
574*795d594fSAndroid Build Coastguard Worker 
575*795d594fSAndroid Build Coastguard Worker // Check that the handle scope at the start of this block is the same
576*795d594fSAndroid Build Coastguard Worker // as the handle scope at the end of the block.
577*795d594fSAndroid Build Coastguard Worker struct ScopedCheckHandleScope {
ScopedCheckHandleScopeart::ScopedCheckHandleScope578*795d594fSAndroid Build Coastguard Worker   ScopedCheckHandleScope() : handle_scope_(Thread::Current()->GetTopHandleScope()) {
579*795d594fSAndroid Build Coastguard Worker   }
580*795d594fSAndroid Build Coastguard Worker 
~ScopedCheckHandleScopeart::ScopedCheckHandleScope581*795d594fSAndroid Build Coastguard Worker   ~ScopedCheckHandleScope() {
582*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(handle_scope_, Thread::Current()->GetTopHandleScope())
583*795d594fSAndroid Build Coastguard Worker         << "Top-most handle scope must be the same after all the JNI "
584*795d594fSAndroid Build Coastguard Worker         << "invocations have finished (as before they were invoked).";
585*795d594fSAndroid Build Coastguard Worker   }
586*795d594fSAndroid Build Coastguard Worker 
587*795d594fSAndroid Build Coastguard Worker   BaseHandleScope* const handle_scope_;
588*795d594fSAndroid Build Coastguard Worker };
589*795d594fSAndroid Build Coastguard Worker 
590*795d594fSAndroid Build Coastguard Worker class CountReferencesVisitor : public RootVisitor {
591*795d594fSAndroid Build Coastguard Worker  public:
VisitRoots(mirror::Object *** roots,size_t count,const RootInfo & info)592*795d594fSAndroid Build Coastguard Worker   void VisitRoots([[maybe_unused]] mirror::Object*** roots,
593*795d594fSAndroid Build Coastguard Worker                   size_t count,
594*795d594fSAndroid Build Coastguard Worker                   const RootInfo& info) override REQUIRES_SHARED(Locks::mutator_lock_) {
595*795d594fSAndroid Build Coastguard Worker     if (info.GetType() == art::RootType::kRootJavaFrame) {
596*795d594fSAndroid Build Coastguard Worker       const JavaFrameRootInfo& jrfi = static_cast<const JavaFrameRootInfo&>(info);
597*795d594fSAndroid Build Coastguard Worker       if (jrfi.GetVReg() == JavaFrameRootInfo::kNativeReferenceArgument) {
598*795d594fSAndroid Build Coastguard Worker         DCHECK_EQ(count, 1u);
599*795d594fSAndroid Build Coastguard Worker         num_references_ += count;
600*795d594fSAndroid Build Coastguard Worker       }
601*795d594fSAndroid Build Coastguard Worker     }
602*795d594fSAndroid Build Coastguard Worker   }
603*795d594fSAndroid Build Coastguard Worker 
VisitRoots(mirror::CompressedReference<mirror::Object> ** roots,size_t count,const RootInfo & info)604*795d594fSAndroid Build Coastguard Worker   void VisitRoots([[maybe_unused]] mirror::CompressedReference<mirror::Object>** roots,
605*795d594fSAndroid Build Coastguard Worker                   [[maybe_unused]] size_t count,
606*795d594fSAndroid Build Coastguard Worker                   const RootInfo& info) override REQUIRES_SHARED(Locks::mutator_lock_) {
607*795d594fSAndroid Build Coastguard Worker     CHECK_NE(info.GetType(), art::RootType::kRootJavaFrame);
608*795d594fSAndroid Build Coastguard Worker   }
609*795d594fSAndroid Build Coastguard Worker 
NumReferences() const610*795d594fSAndroid Build Coastguard Worker   size_t NumReferences() const {
611*795d594fSAndroid Build Coastguard Worker     return num_references_;
612*795d594fSAndroid Build Coastguard Worker   }
613*795d594fSAndroid Build Coastguard Worker 
614*795d594fSAndroid Build Coastguard Worker  private:
615*795d594fSAndroid Build Coastguard Worker   size_t num_references_ = 0u;
616*795d594fSAndroid Build Coastguard Worker };
617*795d594fSAndroid Build Coastguard Worker 
618*795d594fSAndroid Build Coastguard Worker // Number of references allocated in handle scopes & JNI shadow frames on this thread.
NumStackReferences(Thread * self)619*795d594fSAndroid Build Coastguard Worker static size_t NumStackReferences(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_) {
620*795d594fSAndroid Build Coastguard Worker   CountReferencesVisitor visitor;
621*795d594fSAndroid Build Coastguard Worker   self->VisitRoots(&visitor, kVisitRootFlagAllRoots);
622*795d594fSAndroid Build Coastguard Worker   return visitor.NumReferences();
623*795d594fSAndroid Build Coastguard Worker }
624*795d594fSAndroid Build Coastguard Worker 
expectNumStackReferences(size_t expected)625*795d594fSAndroid Build Coastguard Worker static void expectNumStackReferences(size_t expected) {
626*795d594fSAndroid Build Coastguard Worker   // In rare cases when JNI functions call themselves recursively,
627*795d594fSAndroid Build Coastguard Worker   // disable this test because it will have a false negative.
628*795d594fSAndroid Build Coastguard Worker   if (!IsCurrentJniCritical() && ScopedDisableCheckNumStackReferences::sCheckNumStackReferences) {
629*795d594fSAndroid Build Coastguard Worker     /* @CriticalNative doesn't build a HandleScope, so this test is meaningless then. */
630*795d594fSAndroid Build Coastguard Worker     ScopedObjectAccess soa(Thread::Current());
631*795d594fSAndroid Build Coastguard Worker 
632*795d594fSAndroid Build Coastguard Worker     size_t num_references = NumStackReferences(Thread::Current());
633*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(expected, num_references);
634*795d594fSAndroid Build Coastguard Worker   }
635*795d594fSAndroid Build Coastguard Worker }
636*795d594fSAndroid Build Coastguard Worker 
637*795d594fSAndroid Build Coastguard Worker #define EXPECT_NUM_STACK_REFERENCES(expected) expectNumStackReferences(expected)
638*795d594fSAndroid Build Coastguard Worker 
639*795d594fSAndroid Build Coastguard Worker template <typename T, T* fn>
640*795d594fSAndroid Build Coastguard Worker struct make_jni_test_decorator;
641*795d594fSAndroid Build Coastguard Worker 
642*795d594fSAndroid Build Coastguard Worker // Decorator for "static" JNI callbacks.
643*795d594fSAndroid Build Coastguard Worker template <typename R, typename ... Args, R (*fn)(JNIEnv*, jclass, Args...)>
644*795d594fSAndroid Build Coastguard Worker struct make_jni_test_decorator<R(JNIEnv*, jclass kls, Args...), fn> {
applyart::make_jni_test_decorator645*795d594fSAndroid Build Coastguard Worker   static R apply(JNIEnv* env, jclass kls, Args ... args) {
646*795d594fSAndroid Build Coastguard Worker     EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
647*795d594fSAndroid Build Coastguard Worker     EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
648*795d594fSAndroid Build Coastguard Worker     EXPECT_JNI_ENV_AND_CLASS_FOR_CURRENT_JNI(env, kls);
649*795d594fSAndroid Build Coastguard Worker     // All incoming parameters get spilled into the JNI transition frame.
650*795d594fSAndroid Build Coastguard Worker     // The `jclass` is just a reference to the method's declaring class field.
651*795d594fSAndroid Build Coastguard Worker     EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(args...));
652*795d594fSAndroid Build Coastguard Worker 
653*795d594fSAndroid Build Coastguard Worker     return fn(env, kls, args...);
654*795d594fSAndroid Build Coastguard Worker   }
655*795d594fSAndroid Build Coastguard Worker };
656*795d594fSAndroid Build Coastguard Worker 
657*795d594fSAndroid Build Coastguard Worker // Decorator for instance JNI callbacks.
658*795d594fSAndroid Build Coastguard Worker template <typename R, typename ... Args, R (*fn)(JNIEnv*, jobject, Args...)>
659*795d594fSAndroid Build Coastguard Worker struct make_jni_test_decorator<R(JNIEnv*, jobject, Args...), fn> {
applyart::make_jni_test_decorator660*795d594fSAndroid Build Coastguard Worker   static R apply(JNIEnv* env, jobject thisObj, Args ... args) {
661*795d594fSAndroid Build Coastguard Worker     EXPECT_THREAD_STATE_FOR_CURRENT_JNI();
662*795d594fSAndroid Build Coastguard Worker     EXPECT_MUTATOR_LOCK_FOR_CURRENT_JNI();
663*795d594fSAndroid Build Coastguard Worker     EXPECT_JNI_ENV_AND_OBJECT_FOR_CURRENT_JNI(env, thisObj);
664*795d594fSAndroid Build Coastguard Worker     // All incoming parameters + the implicit 'this' get spilled into the JNI transition frame.
665*795d594fSAndroid Build Coastguard Worker     EXPECT_NUM_STACK_REFERENCES(count_nonnull_refs(thisObj, args...));
666*795d594fSAndroid Build Coastguard Worker 
667*795d594fSAndroid Build Coastguard Worker     return fn(env, thisObj, args...);
668*795d594fSAndroid Build Coastguard Worker   }
669*795d594fSAndroid Build Coastguard Worker };
670*795d594fSAndroid Build Coastguard Worker 
671*795d594fSAndroid Build Coastguard Worker // Decorate the regular JNI callee with the extra gtest checks.
672*795d594fSAndroid Build Coastguard Worker // This way we can have common test logic for everything generic like checking if a lock is held,
673*795d594fSAndroid Build Coastguard Worker // checking handle scope state, etc.
674*795d594fSAndroid Build Coastguard Worker #define MAKE_JNI_TEST_DECORATOR(fn) make_jni_test_decorator<decltype(fn), (fn)>::apply
675*795d594fSAndroid Build Coastguard Worker 
676*795d594fSAndroid Build Coastguard Worker // Convert function f(JNIEnv*,jclass,a,b,c,d...) into f2(a,b,c,d...)
677*795d594fSAndroid Build Coastguard Worker // -- This way we don't have to write out each implementation twice for @CriticalNative.
678*795d594fSAndroid Build Coastguard Worker #define JNI_CRITICAL_WRAPPER(func) jni_remove_extra_parameters<decltype(func), (func)>::apply
679*795d594fSAndroid Build Coastguard Worker // Get a function pointer whose calling convention either matches a regular native
680*795d594fSAndroid Build Coastguard Worker // or a critical native depending on which kind of jni is currently under test.
681*795d594fSAndroid Build Coastguard Worker // -- This also has the benefit of genering a compile time error if the 'func' doesn't properly
682*795d594fSAndroid Build Coastguard Worker //    have JNIEnv and jclass parameters first.
683*795d594fSAndroid Build Coastguard Worker #define CURRENT_JNI_WRAPPER(func)                                                         \
684*795d594fSAndroid Build Coastguard Worker     (IsCurrentJniCritical()                                                               \
685*795d594fSAndroid Build Coastguard Worker          ? reinterpret_cast<void*>(&JNI_CRITICAL_WRAPPER(MAKE_JNI_TEST_DECORATOR(func)))  \
686*795d594fSAndroid Build Coastguard Worker          : reinterpret_cast<void*>(&MAKE_JNI_TEST_DECORATOR(func)))
687*795d594fSAndroid Build Coastguard Worker 
688*795d594fSAndroid Build Coastguard Worker // Do the opposite of the above. Do *not* wrap the function, instead just cast it to a void*.
689*795d594fSAndroid Build Coastguard Worker // Only for "TEST_JNI_NORMAL_ONLY" configs, and it inserts a test assert to ensure this is the case.
690*795d594fSAndroid Build Coastguard Worker #define NORMAL_JNI_ONLY_NOWRAP(func) \
691*795d594fSAndroid Build Coastguard Worker     ({ ASSERT_TRUE(IsCurrentJniNormal()); reinterpret_cast<void*>(&(func)); })
692*795d594fSAndroid Build Coastguard Worker // Same as above, but with nullptr. When we want to test the stub functionality.
693*795d594fSAndroid Build Coastguard Worker #define NORMAL_OR_FAST_JNI_ONLY_NULLPTR \
694*795d594fSAndroid Build Coastguard Worker     ({ ASSERT_TRUE(IsCurrentJniNormal() || IsCurrentJniFast()); nullptr; })
695*795d594fSAndroid Build Coastguard Worker 
696*795d594fSAndroid Build Coastguard Worker 
697*795d594fSAndroid Build Coastguard Worker int gJava_MyClassNatives_foo_calls[kJniKindCount] = {};
Java_MyClassNatives_foo(JNIEnv *,jobject)698*795d594fSAndroid Build Coastguard Worker void Java_MyClassNatives_foo(JNIEnv*, jobject) {
699*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_foo_calls[gCurrentJni]++;
700*795d594fSAndroid Build Coastguard Worker }
701*795d594fSAndroid Build Coastguard Worker 
CompileAndRunNoArgMethodImpl()702*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CompileAndRunNoArgMethodImpl() {
703*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
704*795d594fSAndroid Build Coastguard Worker 
705*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0, gJava_MyClassNatives_foo_calls[gCurrentJni]);
706*795d594fSAndroid Build Coastguard Worker   env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
707*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
708*795d594fSAndroid Build Coastguard Worker   env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
709*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
710*795d594fSAndroid Build Coastguard Worker 
711*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
712*795d594fSAndroid Build Coastguard Worker }
713*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(CompileAndRunNoArgMethod)714*795d594fSAndroid Build Coastguard Worker JNI_TEST(CompileAndRunNoArgMethod)
715*795d594fSAndroid Build Coastguard Worker 
716*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CompileAndRunIntMethodThroughStubImpl() {
717*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "bar", "(I)I", NORMAL_OR_FAST_JNI_ONLY_NULLPTR);
718*795d594fSAndroid Build Coastguard Worker   // calling through stub will link with &Java_MyClassNatives_bar{,_1Fast}
719*795d594fSAndroid Build Coastguard Worker 
720*795d594fSAndroid Build Coastguard Worker   std::string reason;
721*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
722*795d594fSAndroid Build Coastguard Worker                   LoadNativeLibrary(env_, "", class_loader_, nullptr, &reason))
723*795d594fSAndroid Build Coastguard Worker       << reason;
724*795d594fSAndroid Build Coastguard Worker 
725*795d594fSAndroid Build Coastguard Worker   jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 24);
726*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(25, result);
727*795d594fSAndroid Build Coastguard Worker }
728*795d594fSAndroid Build Coastguard Worker 
729*795d594fSAndroid Build Coastguard Worker // Note: @CriticalNative is only for static methods.
JNI_TEST(CompileAndRunIntMethodThroughStub)730*795d594fSAndroid Build Coastguard Worker JNI_TEST(CompileAndRunIntMethodThroughStub)
731*795d594fSAndroid Build Coastguard Worker 
732*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CompileAndRunStaticIntMethodThroughStubImpl() {
733*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "sbar", "(I)I", nullptr);
734*795d594fSAndroid Build Coastguard Worker   // calling through stub will link with &Java_MyClassNatives_sbar{,_1Fast,_1Critical}
735*795d594fSAndroid Build Coastguard Worker 
736*795d594fSAndroid Build Coastguard Worker   std::string reason;
737*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(Runtime::Current()->GetJavaVM()->
738*795d594fSAndroid Build Coastguard Worker                   LoadNativeLibrary(env_, "", class_loader_, nullptr, &reason))
739*795d594fSAndroid Build Coastguard Worker       << reason;
740*795d594fSAndroid Build Coastguard Worker 
741*795d594fSAndroid Build Coastguard Worker   jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 42);
742*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(43, result);
743*795d594fSAndroid Build Coastguard Worker }
744*795d594fSAndroid Build Coastguard Worker 
745*795d594fSAndroid Build Coastguard Worker JNI_TEST_CRITICAL(CompileAndRunStaticIntMethodThroughStub)
746*795d594fSAndroid Build Coastguard Worker 
747*795d594fSAndroid Build Coastguard Worker int gJava_MyClassNatives_fooI_calls[kJniKindCount] = {};
Java_MyClassNatives_fooI(JNIEnv *,jobject,jint x)748*795d594fSAndroid Build Coastguard Worker jint Java_MyClassNatives_fooI(JNIEnv*, jobject, jint x) {
749*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooI_calls[gCurrentJni]++;
750*795d594fSAndroid Build Coastguard Worker   return x;
751*795d594fSAndroid Build Coastguard Worker }
752*795d594fSAndroid Build Coastguard Worker 
CompileAndRunIntMethodImpl()753*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CompileAndRunIntMethodImpl() {
754*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "fooI", "(I)I",
755*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooI));
756*795d594fSAndroid Build Coastguard Worker 
757*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
758*795d594fSAndroid Build Coastguard Worker   jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
759*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(42, result);
760*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
761*795d594fSAndroid Build Coastguard Worker   result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
762*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
763*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls[gCurrentJni]);
764*795d594fSAndroid Build Coastguard Worker 
765*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooI_calls[gCurrentJni] = 0;
766*795d594fSAndroid Build Coastguard Worker }
767*795d594fSAndroid Build Coastguard Worker 
768*795d594fSAndroid Build Coastguard Worker JNI_TEST(CompileAndRunIntMethod)
769*795d594fSAndroid Build Coastguard Worker 
770*795d594fSAndroid Build Coastguard Worker int gJava_MyClassNatives_fooII_calls[kJniKindCount] = {};
Java_MyClassNatives_fooII(JNIEnv *,jobject,jint x,jint y)771*795d594fSAndroid Build Coastguard Worker jint Java_MyClassNatives_fooII(JNIEnv*, jobject, jint x, jint y) {
772*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooII_calls[gCurrentJni]++;
773*795d594fSAndroid Build Coastguard Worker   return x - y;  // non-commutative operator
774*795d594fSAndroid Build Coastguard Worker }
775*795d594fSAndroid Build Coastguard Worker 
CompileAndRunIntIntMethodImpl()776*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CompileAndRunIntIntMethodImpl() {
777*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "fooII", "(II)I",
778*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooII));
779*795d594fSAndroid Build Coastguard Worker 
780*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
781*795d594fSAndroid Build Coastguard Worker   jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
782*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(99 - 10, result);
783*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
784*795d594fSAndroid Build Coastguard Worker   result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
785*795d594fSAndroid Build Coastguard Worker                                          0xCAFED00D);
786*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
787*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls[gCurrentJni]);
788*795d594fSAndroid Build Coastguard Worker 
789*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooII_calls[gCurrentJni] = 0;
790*795d594fSAndroid Build Coastguard Worker }
791*795d594fSAndroid Build Coastguard Worker 
792*795d594fSAndroid Build Coastguard Worker JNI_TEST(CompileAndRunIntIntMethod)
793*795d594fSAndroid Build Coastguard Worker 
794*795d594fSAndroid Build Coastguard Worker int gJava_MyClassNatives_fooJJ_calls[kJniKindCount] = {};
Java_MyClassNatives_fooJJ(JNIEnv *,jobject,jlong x,jlong y)795*795d594fSAndroid Build Coastguard Worker jlong Java_MyClassNatives_fooJJ(JNIEnv*, jobject, jlong x, jlong y) {
796*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooJJ_calls[gCurrentJni]++;
797*795d594fSAndroid Build Coastguard Worker   return x - y;  // non-commutative operator
798*795d594fSAndroid Build Coastguard Worker }
799*795d594fSAndroid Build Coastguard Worker 
CompileAndRunLongLongMethodImpl()800*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CompileAndRunLongLongMethodImpl() {
801*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "fooJJ", "(JJ)J",
802*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ));
803*795d594fSAndroid Build Coastguard Worker 
804*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
805*795d594fSAndroid Build Coastguard Worker   jlong a = INT64_C(0x1234567890ABCDEF);
806*795d594fSAndroid Build Coastguard Worker   jlong b = INT64_C(0xFEDCBA0987654321);
807*795d594fSAndroid Build Coastguard Worker   jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
808*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(a - b, result);
809*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
810*795d594fSAndroid Build Coastguard Worker   result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
811*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(b - a, result);
812*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls[gCurrentJni]);
813*795d594fSAndroid Build Coastguard Worker 
814*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooJJ_calls[gCurrentJni] = 0;
815*795d594fSAndroid Build Coastguard Worker }
816*795d594fSAndroid Build Coastguard Worker 
817*795d594fSAndroid Build Coastguard Worker JNI_TEST(CompileAndRunLongLongMethod)
818*795d594fSAndroid Build Coastguard Worker 
819*795d594fSAndroid Build Coastguard Worker int gJava_MyClassNatives_fooDD_calls[kJniKindCount] = {};
Java_MyClassNatives_fooDD(JNIEnv *,jobject,jdouble x,jdouble y)820*795d594fSAndroid Build Coastguard Worker jdouble Java_MyClassNatives_fooDD(JNIEnv*, jobject, jdouble x, jdouble y) {
821*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooDD_calls[gCurrentJni]++;
822*795d594fSAndroid Build Coastguard Worker   return x - y;  // non-commutative operator
823*795d594fSAndroid Build Coastguard Worker }
824*795d594fSAndroid Build Coastguard Worker 
CompileAndRunDoubleDoubleMethodImpl()825*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CompileAndRunDoubleDoubleMethodImpl() {
826*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "fooDD", "(DD)D",
827*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooDD));
828*795d594fSAndroid Build Coastguard Worker 
829*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
830*795d594fSAndroid Build Coastguard Worker   jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
831*795d594fSAndroid Build Coastguard Worker                                                     99.0, 10.0);
832*795d594fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
833*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
834*795d594fSAndroid Build Coastguard Worker   jdouble a = 3.14159265358979323846;
835*795d594fSAndroid Build Coastguard Worker   jdouble b = 0.69314718055994530942;
836*795d594fSAndroid Build Coastguard Worker   result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
837*795d594fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(a - b, result);
838*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls[gCurrentJni]);
839*795d594fSAndroid Build Coastguard Worker 
840*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooDD_calls[gCurrentJni] = 0;
841*795d594fSAndroid Build Coastguard Worker }
842*795d594fSAndroid Build Coastguard Worker 
843*795d594fSAndroid Build Coastguard Worker int gJava_MyClassNatives_fooJJ_synchronized_calls[kJniKindCount] = {};
Java_MyClassNatives_fooJJ_synchronized(JNIEnv * env,jobject,jlong x,jlong y)844*795d594fSAndroid Build Coastguard Worker jlong Java_MyClassNatives_fooJJ_synchronized(JNIEnv* env, jobject, jlong x, jlong y) {
845*795d594fSAndroid Build Coastguard Worker   JniCompilerTest::AssertCallerObjectLocked(env);
846*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]++;
847*795d594fSAndroid Build Coastguard Worker   return x | y;
848*795d594fSAndroid Build Coastguard Worker }
849*795d594fSAndroid Build Coastguard Worker 
850*795d594fSAndroid Build Coastguard Worker EXPORT  // Defined in `libart.so`.
851*795d594fSAndroid Build Coastguard Worker void InitEntryPoints(JniEntryPoints* jpoints,
852*795d594fSAndroid Build Coastguard Worker                      QuickEntryPoints* qpoints,
853*795d594fSAndroid Build Coastguard Worker                      bool monitor_jni_entry_exit);
854*795d594fSAndroid Build Coastguard Worker 
CompileAndRun_fooJJ_synchronizedImpl()855*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CompileAndRun_fooJJ_synchronizedImpl() {
856*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "fooJJ_synchronized", "(JJ)J",
857*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooJJ_synchronized));
858*795d594fSAndroid Build Coastguard Worker 
859*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
860*795d594fSAndroid Build Coastguard Worker   jlong a = 0x1000000020000000ULL;
861*795d594fSAndroid Build Coastguard Worker   jlong b = 0x00ff000000aa0000ULL;
862*795d594fSAndroid Build Coastguard Worker   jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
863*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(a | b, result);
864*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
865*795d594fSAndroid Build Coastguard Worker 
866*795d594fSAndroid Build Coastguard Worker   // Exercise recursive thin locking/unlocking.
867*795d594fSAndroid Build Coastguard Worker   // Note: Thin lock count 0 means locked once.
868*795d594fSAndroid Build Coastguard Worker   env_->MonitorEnter(jobj_);
869*795d594fSAndroid Build Coastguard Worker   LockWord lock_word = GetLockWord(jobj_);
870*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(lock_word.GetState(), LockWord::kThinLocked);
871*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(lock_word.ThinLockCount(), 0u);
872*795d594fSAndroid Build Coastguard Worker   result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
873*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(a | b, result);
874*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
875*795d594fSAndroid Build Coastguard Worker   lock_word = GetLockWord(jobj_);
876*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(lock_word.GetState(), LockWord::kThinLocked);
877*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(lock_word.ThinLockCount(), 0u);
878*795d594fSAndroid Build Coastguard Worker   env_->MonitorExit(jobj_);
879*795d594fSAndroid Build Coastguard Worker   lock_word = GetLockWord(jobj_);
880*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(lock_word.GetState(), LockWord::kUnlocked);
881*795d594fSAndroid Build Coastguard Worker 
882*795d594fSAndroid Build Coastguard Worker   // Exercise lock inflation due to thin lock count overflow.
883*795d594fSAndroid Build Coastguard Worker   constexpr uint32_t kMaxThinLockRecursiveLocks = 1u << LockWord::kThinLockCountSize;
884*795d594fSAndroid Build Coastguard Worker   for (uint32_t i = 0; i != kMaxThinLockRecursiveLocks; ++i) {
885*795d594fSAndroid Build Coastguard Worker     env_->MonitorEnter(jobj_);
886*795d594fSAndroid Build Coastguard Worker     lock_word = GetLockWord(jobj_);
887*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(lock_word.GetState(), LockWord::kThinLocked);
888*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(lock_word.ThinLockCount(), i);
889*795d594fSAndroid Build Coastguard Worker   }
890*795d594fSAndroid Build Coastguard Worker   result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
891*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(a | b, result);
892*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(3, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
893*795d594fSAndroid Build Coastguard Worker   lock_word = GetLockWord(jobj_);
894*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(lock_word.GetState(), LockWord::kFatLocked);
895*795d594fSAndroid Build Coastguard Worker   for (uint32_t i = 0; i != kMaxThinLockRecursiveLocks; ++i) {
896*795d594fSAndroid Build Coastguard Worker     env_->MonitorExit(jobj_);  // Remains "fat-locked" even if actually unlocked.
897*795d594fSAndroid Build Coastguard Worker   }
898*795d594fSAndroid Build Coastguard Worker 
899*795d594fSAndroid Build Coastguard Worker   // Exercise locking for "fat-locked".
900*795d594fSAndroid Build Coastguard Worker   lock_word = GetLockWord(jobj_);
901*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(lock_word.GetState(), LockWord::kFatLocked);
902*795d594fSAndroid Build Coastguard Worker   result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
903*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(a | b, result);
904*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(4, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
905*795d594fSAndroid Build Coastguard Worker   lock_word = GetLockWord(jobj_);
906*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(lock_word.GetState(), LockWord::kFatLocked);
907*795d594fSAndroid Build Coastguard Worker 
908*795d594fSAndroid Build Coastguard Worker   // Exercise locking/unocking for "fat-locked" through the "no_inline" path.
909*795d594fSAndroid Build Coastguard Worker   // These entrypoints are selected with verbose "systrace_lock_logging".
910*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
911*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(gLogVerbosity.systrace_lock_logging);
912*795d594fSAndroid Build Coastguard Worker   gLogVerbosity.systrace_lock_logging = true;
913*795d594fSAndroid Build Coastguard Worker   InitEntryPoints(&self->tlsPtr_.jni_entrypoints,
914*795d594fSAndroid Build Coastguard Worker                   &self->tlsPtr_.quick_entrypoints,
915*795d594fSAndroid Build Coastguard Worker                   self->ReadFlag(ThreadFlag::kMonitorJniEntryExit));
916*795d594fSAndroid Build Coastguard Worker   result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
917*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(a | b, result);
918*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(5, gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni]);
919*795d594fSAndroid Build Coastguard Worker   gLogVerbosity.systrace_lock_logging = false;
920*795d594fSAndroid Build Coastguard Worker   InitEntryPoints(&self->tlsPtr_.jni_entrypoints,
921*795d594fSAndroid Build Coastguard Worker                   &self->tlsPtr_.quick_entrypoints,
922*795d594fSAndroid Build Coastguard Worker                   self->ReadFlag(ThreadFlag::kMonitorJniEntryExit));
923*795d594fSAndroid Build Coastguard Worker 
924*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooJJ_synchronized_calls[gCurrentJni] = 0;
925*795d594fSAndroid Build Coastguard Worker }
926*795d594fSAndroid Build Coastguard Worker 
927*795d594fSAndroid Build Coastguard Worker JNI_TEST_NORMAL_ONLY(CompileAndRun_fooJJ_synchronized)
928*795d594fSAndroid Build Coastguard Worker 
929*795d594fSAndroid Build Coastguard Worker int gJava_MyClassNatives_fooIOO_calls[kJniKindCount] = {};
Java_MyClassNatives_fooIOO(JNIEnv *,jobject thisObj,jint x,jobject y,jobject z)930*795d594fSAndroid Build Coastguard Worker jobject Java_MyClassNatives_fooIOO(JNIEnv*, jobject thisObj, jint x, jobject y,
931*795d594fSAndroid Build Coastguard Worker                             jobject z) {
932*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooIOO_calls[gCurrentJni]++;
933*795d594fSAndroid Build Coastguard Worker   switch (x) {
934*795d594fSAndroid Build Coastguard Worker     case 1:
935*795d594fSAndroid Build Coastguard Worker       return y;
936*795d594fSAndroid Build Coastguard Worker     case 2:
937*795d594fSAndroid Build Coastguard Worker       return z;
938*795d594fSAndroid Build Coastguard Worker     default:
939*795d594fSAndroid Build Coastguard Worker       return thisObj;
940*795d594fSAndroid Build Coastguard Worker   }
941*795d594fSAndroid Build Coastguard Worker }
942*795d594fSAndroid Build Coastguard Worker 
CompileAndRunIntObjectObjectMethodImpl()943*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CompileAndRunIntObjectObjectMethodImpl() {
944*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "fooIOO",
945*795d594fSAndroid Build Coastguard Worker                "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
946*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooIOO));
947*795d594fSAndroid Build Coastguard Worker 
948*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
949*795d594fSAndroid Build Coastguard Worker   jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, nullptr);
950*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(jobj_, result));
951*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
952*795d594fSAndroid Build Coastguard Worker 
953*795d594fSAndroid Build Coastguard Worker   result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, nullptr, jklass_);
954*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(jobj_, result));
955*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
956*795d594fSAndroid Build Coastguard Worker   result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, nullptr, jklass_);
957*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(nullptr, result));
958*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
959*795d594fSAndroid Build Coastguard Worker   result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, nullptr, jklass_);
960*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
961*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
962*795d594fSAndroid Build Coastguard Worker 
963*795d594fSAndroid Build Coastguard Worker   result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, nullptr);
964*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(jobj_, result));
965*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
966*795d594fSAndroid Build Coastguard Worker   result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, nullptr);
967*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
968*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
969*795d594fSAndroid Build Coastguard Worker   result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, nullptr);
970*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(nullptr, result));
971*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls[gCurrentJni]);
972*795d594fSAndroid Build Coastguard Worker 
973*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooIOO_calls[gCurrentJni] = 0;
974*795d594fSAndroid Build Coastguard Worker }
975*795d594fSAndroid Build Coastguard Worker 
976*795d594fSAndroid Build Coastguard Worker JNI_TEST(CompileAndRunIntObjectObjectMethod)
977*795d594fSAndroid Build Coastguard Worker 
978*795d594fSAndroid Build Coastguard Worker int gJava_MyClassNatives_fooSII_calls[kJniKindCount] = {};
Java_MyClassNatives_fooSII(JNIEnv * env,jclass klass,jint x,jint y)979*795d594fSAndroid Build Coastguard Worker jint Java_MyClassNatives_fooSII([[maybe_unused]] JNIEnv* env,
980*795d594fSAndroid Build Coastguard Worker                                 [[maybe_unused]] jclass klass,
981*795d594fSAndroid Build Coastguard Worker                                 jint x,
982*795d594fSAndroid Build Coastguard Worker                                 jint y) {
983*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooSII_calls[gCurrentJni]++;
984*795d594fSAndroid Build Coastguard Worker   return x + y;
985*795d594fSAndroid Build Coastguard Worker }
986*795d594fSAndroid Build Coastguard Worker 
CompileAndRunStaticIntIntMethodImpl()987*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CompileAndRunStaticIntIntMethodImpl() {
988*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "fooSII", "(II)I",
989*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSII));
990*795d594fSAndroid Build Coastguard Worker 
991*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
992*795d594fSAndroid Build Coastguard Worker   jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
993*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(50, result);
994*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls[gCurrentJni]);
995*795d594fSAndroid Build Coastguard Worker 
996*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooSII_calls[gCurrentJni] = 0;
997*795d594fSAndroid Build Coastguard Worker }
998*795d594fSAndroid Build Coastguard Worker 
999*795d594fSAndroid Build Coastguard Worker JNI_TEST_CRITICAL(CompileAndRunStaticIntIntMethod)
1000*795d594fSAndroid Build Coastguard Worker 
1001*795d594fSAndroid Build Coastguard Worker int gJava_MyClassNatives_fooSDD_calls[kJniKindCount] = {};
Java_MyClassNatives_fooSDD(JNIEnv * env,jclass klass,jdouble x,jdouble y)1002*795d594fSAndroid Build Coastguard Worker jdouble Java_MyClassNatives_fooSDD([[maybe_unused]] JNIEnv* env,
1003*795d594fSAndroid Build Coastguard Worker                                    [[maybe_unused]] jclass klass,
1004*795d594fSAndroid Build Coastguard Worker                                    jdouble x,
1005*795d594fSAndroid Build Coastguard Worker                                    jdouble y) {
1006*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooSDD_calls[gCurrentJni]++;
1007*795d594fSAndroid Build Coastguard Worker   return x - y;  // non-commutative operator
1008*795d594fSAndroid Build Coastguard Worker }
1009*795d594fSAndroid Build Coastguard Worker 
CompileAndRunStaticDoubleDoubleMethodImpl()1010*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CompileAndRunStaticDoubleDoubleMethodImpl() {
1011*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "fooSDD", "(DD)D",
1012*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSDD));
1013*795d594fSAndroid Build Coastguard Worker 
1014*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
1015*795d594fSAndroid Build Coastguard Worker   jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
1016*795d594fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(99.0 - 10.0, result);
1017*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
1018*795d594fSAndroid Build Coastguard Worker   jdouble a = 3.14159265358979323846;
1019*795d594fSAndroid Build Coastguard Worker   jdouble b = 0.69314718055994530942;
1020*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
1021*795d594fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(a - b, result);
1022*795d594fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(2, gJava_MyClassNatives_fooSDD_calls[gCurrentJni]);
1023*795d594fSAndroid Build Coastguard Worker 
1024*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooSDD_calls[gCurrentJni] = 0;
1025*795d594fSAndroid Build Coastguard Worker }
1026*795d594fSAndroid Build Coastguard Worker 
JNI_TEST_CRITICAL(CompileAndRunStaticDoubleDoubleMethod)1027*795d594fSAndroid Build Coastguard Worker JNI_TEST_CRITICAL(CompileAndRunStaticDoubleDoubleMethod)
1028*795d594fSAndroid Build Coastguard Worker 
1029*795d594fSAndroid Build Coastguard Worker // The x86 generic JNI code had a bug where it assumed a floating
1030*795d594fSAndroid Build Coastguard Worker // point return value would be in xmm0. We use log, to somehow ensure
1031*795d594fSAndroid Build Coastguard Worker // the compiler will use the floating point stack.
1032*795d594fSAndroid Build Coastguard Worker 
1033*795d594fSAndroid Build Coastguard Worker jdouble Java_MyClassNatives_logD(JNIEnv*, jclass, jdouble x) {
1034*795d594fSAndroid Build Coastguard Worker   return log(x);
1035*795d594fSAndroid Build Coastguard Worker }
1036*795d594fSAndroid Build Coastguard Worker 
Java_MyClassNatives_logD_notNormal(JNIEnv *,jclass,jdouble x)1037*795d594fSAndroid Build Coastguard Worker jdouble Java_MyClassNatives_logD_notNormal(JNIEnv*, jclass, jdouble x) {
1038*795d594fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(2.0, x);
1039*795d594fSAndroid Build Coastguard Worker   return log(x);
1040*795d594fSAndroid Build Coastguard Worker }
1041*795d594fSAndroid Build Coastguard Worker 
RunStaticLogDoubleMethodImpl()1042*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::RunStaticLogDoubleMethodImpl() {
1043*795d594fSAndroid Build Coastguard Worker   void* jni_handler;
1044*795d594fSAndroid Build Coastguard Worker   if (IsCurrentJniNormal()) {
1045*795d594fSAndroid Build Coastguard Worker     // This test seems a bit special, don't use a JNI wrapper here.
1046*795d594fSAndroid Build Coastguard Worker     jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logD);
1047*795d594fSAndroid Build Coastguard Worker   } else {
1048*795d594fSAndroid Build Coastguard Worker     jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logD_notNormal);
1049*795d594fSAndroid Build Coastguard Worker   }
1050*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "logD", "(D)D", jni_handler);
1051*795d594fSAndroid Build Coastguard Worker 
1052*795d594fSAndroid Build Coastguard Worker   jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 2.0);
1053*795d594fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(log(2.0), result);
1054*795d594fSAndroid Build Coastguard Worker }
1055*795d594fSAndroid Build Coastguard Worker 
JNI_TEST_CRITICAL(RunStaticLogDoubleMethod)1056*795d594fSAndroid Build Coastguard Worker JNI_TEST_CRITICAL(RunStaticLogDoubleMethod)
1057*795d594fSAndroid Build Coastguard Worker 
1058*795d594fSAndroid Build Coastguard Worker jfloat Java_MyClassNatives_logF(JNIEnv*, jclass, jfloat x) {
1059*795d594fSAndroid Build Coastguard Worker   return logf(x);
1060*795d594fSAndroid Build Coastguard Worker }
1061*795d594fSAndroid Build Coastguard Worker 
RunStaticLogFloatMethodImpl()1062*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::RunStaticLogFloatMethodImpl() {
1063*795d594fSAndroid Build Coastguard Worker   void* jni_handler;
1064*795d594fSAndroid Build Coastguard Worker   if (IsCurrentJniNormal()) {
1065*795d594fSAndroid Build Coastguard Worker     // This test seems a bit special, don't use a JNI wrapper here.
1066*795d594fSAndroid Build Coastguard Worker     jni_handler = NORMAL_JNI_ONLY_NOWRAP(Java_MyClassNatives_logF);
1067*795d594fSAndroid Build Coastguard Worker   } else {
1068*795d594fSAndroid Build Coastguard Worker     jni_handler = CURRENT_JNI_WRAPPER(Java_MyClassNatives_logF);
1069*795d594fSAndroid Build Coastguard Worker   }
1070*795d594fSAndroid Build Coastguard Worker 
1071*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "logF", "(F)F", jni_handler);
1072*795d594fSAndroid Build Coastguard Worker 
1073*795d594fSAndroid Build Coastguard Worker   jfloat result = env_->CallStaticFloatMethod(jklass_, jmethod_, 2.0);
1074*795d594fSAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(logf(2.0), result);
1075*795d594fSAndroid Build Coastguard Worker }
1076*795d594fSAndroid Build Coastguard Worker 
JNI_TEST_CRITICAL(RunStaticLogFloatMethod)1077*795d594fSAndroid Build Coastguard Worker JNI_TEST_CRITICAL(RunStaticLogFloatMethod)
1078*795d594fSAndroid Build Coastguard Worker 
1079*795d594fSAndroid Build Coastguard Worker jboolean Java_MyClassNatives_returnTrue(JNIEnv*, jclass) {
1080*795d594fSAndroid Build Coastguard Worker   return JNI_TRUE;
1081*795d594fSAndroid Build Coastguard Worker }
1082*795d594fSAndroid Build Coastguard Worker 
Java_MyClassNatives_returnFalse(JNIEnv *,jclass)1083*795d594fSAndroid Build Coastguard Worker jboolean Java_MyClassNatives_returnFalse(JNIEnv*, jclass) {
1084*795d594fSAndroid Build Coastguard Worker   return JNI_FALSE;
1085*795d594fSAndroid Build Coastguard Worker }
1086*795d594fSAndroid Build Coastguard Worker 
Java_MyClassNatives_returnInt(JNIEnv *,jclass)1087*795d594fSAndroid Build Coastguard Worker jint Java_MyClassNatives_returnInt(JNIEnv*, jclass) {
1088*795d594fSAndroid Build Coastguard Worker   return 42;
1089*795d594fSAndroid Build Coastguard Worker }
1090*795d594fSAndroid Build Coastguard Worker 
RunStaticReturnTrueImpl()1091*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::RunStaticReturnTrueImpl() {
1092*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "returnTrue", "()Z", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnTrue));
1093*795d594fSAndroid Build Coastguard Worker 
1094*795d594fSAndroid Build Coastguard Worker   jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
1095*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(result);
1096*795d594fSAndroid Build Coastguard Worker }
1097*795d594fSAndroid Build Coastguard Worker 
JNI_TEST_CRITICAL(RunStaticReturnTrue)1098*795d594fSAndroid Build Coastguard Worker JNI_TEST_CRITICAL(RunStaticReturnTrue)
1099*795d594fSAndroid Build Coastguard Worker 
1100*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::RunStaticReturnFalseImpl() {
1101*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "returnFalse", "()Z",
1102*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnFalse));
1103*795d594fSAndroid Build Coastguard Worker 
1104*795d594fSAndroid Build Coastguard Worker   jboolean result = env_->CallStaticBooleanMethod(jklass_, jmethod_);
1105*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(result);
1106*795d594fSAndroid Build Coastguard Worker }
1107*795d594fSAndroid Build Coastguard Worker 
JNI_TEST_CRITICAL(RunStaticReturnFalse)1108*795d594fSAndroid Build Coastguard Worker JNI_TEST_CRITICAL(RunStaticReturnFalse)
1109*795d594fSAndroid Build Coastguard Worker 
1110*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::RunGenericStaticReturnIntImpl() {
1111*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "returnInt", "()I", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnInt));
1112*795d594fSAndroid Build Coastguard Worker 
1113*795d594fSAndroid Build Coastguard Worker   jint result = env_->CallStaticIntMethod(jklass_, jmethod_);
1114*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(42, result);
1115*795d594fSAndroid Build Coastguard Worker }
1116*795d594fSAndroid Build Coastguard Worker 
1117*795d594fSAndroid Build Coastguard Worker JNI_TEST_CRITICAL(RunGenericStaticReturnInt)
1118*795d594fSAndroid Build Coastguard Worker 
1119*795d594fSAndroid Build Coastguard Worker int gJava_MyClassNatives_returnDouble_calls[kJniKindCount] = {};
Java_MyClassNatives_returnDouble(JNIEnv *,jclass)1120*795d594fSAndroid Build Coastguard Worker jdouble Java_MyClassNatives_returnDouble(JNIEnv*, jclass) {
1121*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_returnDouble_calls[gCurrentJni]++;
1122*795d594fSAndroid Build Coastguard Worker   return 4.0;
1123*795d594fSAndroid Build Coastguard Worker }
1124*795d594fSAndroid Build Coastguard Worker 
RunGenericStaticReturnDoubleImpl()1125*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::RunGenericStaticReturnDoubleImpl() {
1126*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "returnDouble", "()D", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnDouble));
1127*795d594fSAndroid Build Coastguard Worker 
1128*795d594fSAndroid Build Coastguard Worker   jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_);
1129*795d594fSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(4.0, result);
1130*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_MyClassNatives_returnDouble_calls[gCurrentJni]);
1131*795d594fSAndroid Build Coastguard Worker 
1132*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_returnDouble_calls[gCurrentJni] = 0;
1133*795d594fSAndroid Build Coastguard Worker }
1134*795d594fSAndroid Build Coastguard Worker 
JNI_TEST_CRITICAL(RunGenericStaticReturnDouble)1135*795d594fSAndroid Build Coastguard Worker JNI_TEST_CRITICAL(RunGenericStaticReturnDouble)
1136*795d594fSAndroid Build Coastguard Worker 
1137*795d594fSAndroid Build Coastguard Worker jlong Java_MyClassNatives_returnLong(JNIEnv*, jclass) {
1138*795d594fSAndroid Build Coastguard Worker   return 0xFEEDDEADFEEDL;
1139*795d594fSAndroid Build Coastguard Worker }
1140*795d594fSAndroid Build Coastguard Worker 
RunGenericStaticReturnLongImpl()1141*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::RunGenericStaticReturnLongImpl() {
1142*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "returnLong", "()J", CURRENT_JNI_WRAPPER(Java_MyClassNatives_returnLong));
1143*795d594fSAndroid Build Coastguard Worker 
1144*795d594fSAndroid Build Coastguard Worker   jlong result = env_->CallStaticLongMethod(jklass_, jmethod_);
1145*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0xFEEDDEADFEEDL, result);
1146*795d594fSAndroid Build Coastguard Worker }
1147*795d594fSAndroid Build Coastguard Worker 
1148*795d594fSAndroid Build Coastguard Worker JNI_TEST_CRITICAL(RunGenericStaticReturnLong)
1149*795d594fSAndroid Build Coastguard Worker 
1150*795d594fSAndroid Build Coastguard Worker int gJava_MyClassNatives_fooSIOO_calls[kJniKindCount] = {};
Java_MyClassNatives_fooSIOO(JNIEnv *,jclass klass,jint x,jobject y,jobject z)1151*795d594fSAndroid Build Coastguard Worker jobject Java_MyClassNatives_fooSIOO(JNIEnv*, jclass klass, jint x, jobject y, jobject z) {
1152*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]++;
1153*795d594fSAndroid Build Coastguard Worker   switch (x) {
1154*795d594fSAndroid Build Coastguard Worker     case 1:
1155*795d594fSAndroid Build Coastguard Worker       return y;
1156*795d594fSAndroid Build Coastguard Worker     case 2:
1157*795d594fSAndroid Build Coastguard Worker       return z;
1158*795d594fSAndroid Build Coastguard Worker     default:
1159*795d594fSAndroid Build Coastguard Worker       return klass;
1160*795d594fSAndroid Build Coastguard Worker   }
1161*795d594fSAndroid Build Coastguard Worker }
1162*795d594fSAndroid Build Coastguard Worker 
CompileAndRunStaticIntObjectObjectMethodImpl()1163*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CompileAndRunStaticIntObjectObjectMethodImpl() {
1164*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "fooSIOO",
1165*795d594fSAndroid Build Coastguard Worker                "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
1166*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSIOO));
1167*795d594fSAndroid Build Coastguard Worker 
1168*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
1169*795d594fSAndroid Build Coastguard Worker   jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
1170*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
1171*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
1172*795d594fSAndroid Build Coastguard Worker 
1173*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
1174*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
1175*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
1176*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1177*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(nullptr, result));
1178*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
1179*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
1180*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(jobj_, result));
1181*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
1182*795d594fSAndroid Build Coastguard Worker 
1183*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
1184*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
1185*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
1186*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
1187*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(jobj_, result));
1188*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
1189*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1190*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(nullptr, result));
1191*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls[gCurrentJni]);
1192*795d594fSAndroid Build Coastguard Worker 
1193*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooSIOO_calls[gCurrentJni] = 0;
1194*795d594fSAndroid Build Coastguard Worker }
1195*795d594fSAndroid Build Coastguard Worker 
1196*795d594fSAndroid Build Coastguard Worker JNI_TEST(CompileAndRunStaticIntObjectObjectMethod)
1197*795d594fSAndroid Build Coastguard Worker 
1198*795d594fSAndroid Build Coastguard Worker int gJava_MyClassNatives_fooSSIOO_calls[kJniKindCount] = {};
Java_MyClassNatives_fooSSIOO(JNIEnv * env,jclass klass,jint x,jobject y,jobject z)1199*795d594fSAndroid Build Coastguard Worker jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y, jobject z) {
1200*795d594fSAndroid Build Coastguard Worker   JniCompilerTest::AssertCallerObjectLocked(env);
1201*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]++;
1202*795d594fSAndroid Build Coastguard Worker   switch (x) {
1203*795d594fSAndroid Build Coastguard Worker     case 1:
1204*795d594fSAndroid Build Coastguard Worker       return y;
1205*795d594fSAndroid Build Coastguard Worker     case 2:
1206*795d594fSAndroid Build Coastguard Worker       return z;
1207*795d594fSAndroid Build Coastguard Worker     default:
1208*795d594fSAndroid Build Coastguard Worker       return klass;
1209*795d594fSAndroid Build Coastguard Worker   }
1210*795d594fSAndroid Build Coastguard Worker }
1211*795d594fSAndroid Build Coastguard Worker 
CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl()1212*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CompileAndRunStaticSynchronizedIntObjectObjectMethodImpl() {
1213*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "fooSSIOO",
1214*795d594fSAndroid Build Coastguard Worker                "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
1215*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooSSIOO));
1216*795d594fSAndroid Build Coastguard Worker 
1217*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
1218*795d594fSAndroid Build Coastguard Worker   jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, nullptr);
1219*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
1220*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
1221*795d594fSAndroid Build Coastguard Worker 
1222*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, nullptr, jobj_);
1223*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
1224*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
1225*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, nullptr, jobj_);
1226*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(nullptr, result));
1227*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
1228*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, nullptr, jobj_);
1229*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(jobj_, result));
1230*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
1231*795d594fSAndroid Build Coastguard Worker 
1232*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, nullptr);
1233*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
1234*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
1235*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, nullptr);
1236*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(jobj_, result));
1237*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
1238*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1239*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(nullptr, result));
1240*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
1241*795d594fSAndroid Build Coastguard Worker 
1242*795d594fSAndroid Build Coastguard Worker   // Exercise recursive thin locking/unlocking.
1243*795d594fSAndroid Build Coastguard Worker   // Note: Thin lock count 0 means locked once.
1244*795d594fSAndroid Build Coastguard Worker   env_->MonitorEnter(jklass_);
1245*795d594fSAndroid Build Coastguard Worker   LockWord lock_word = GetLockWord(jklass_);
1246*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(lock_word.GetState(), LockWord::kThinLocked);
1247*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(lock_word.ThinLockCount(), 0u);
1248*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1249*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(nullptr, result));
1250*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(8, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
1251*795d594fSAndroid Build Coastguard Worker   lock_word = GetLockWord(jklass_);
1252*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(lock_word.GetState(), LockWord::kThinLocked);
1253*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(lock_word.ThinLockCount(), 0u);
1254*795d594fSAndroid Build Coastguard Worker   env_->MonitorExit(jklass_);
1255*795d594fSAndroid Build Coastguard Worker   lock_word = GetLockWord(jklass_);
1256*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(lock_word.GetState(), LockWord::kUnlocked);
1257*795d594fSAndroid Build Coastguard Worker 
1258*795d594fSAndroid Build Coastguard Worker   // Exercise lock inflation due to thin lock count overflow.
1259*795d594fSAndroid Build Coastguard Worker   constexpr uint32_t kMaxThinLockRecursiveLocks = 1u << LockWord::kThinLockCountSize;
1260*795d594fSAndroid Build Coastguard Worker   for (uint32_t i = 0; i != kMaxThinLockRecursiveLocks; ++i) {
1261*795d594fSAndroid Build Coastguard Worker     env_->MonitorEnter(jklass_);
1262*795d594fSAndroid Build Coastguard Worker     lock_word = GetLockWord(jklass_);
1263*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(lock_word.GetState(), LockWord::kThinLocked);
1264*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(lock_word.ThinLockCount(), i);
1265*795d594fSAndroid Build Coastguard Worker   }
1266*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1267*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(nullptr, result));
1268*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(9, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
1269*795d594fSAndroid Build Coastguard Worker   lock_word = GetLockWord(jklass_);
1270*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(lock_word.GetState(), LockWord::kFatLocked);
1271*795d594fSAndroid Build Coastguard Worker   for (uint32_t i = 0; i != kMaxThinLockRecursiveLocks; ++i) {
1272*795d594fSAndroid Build Coastguard Worker     env_->MonitorExit(jklass_);  // Remains "fat-locked" even if actually unlocked.
1273*795d594fSAndroid Build Coastguard Worker   }
1274*795d594fSAndroid Build Coastguard Worker 
1275*795d594fSAndroid Build Coastguard Worker   // Exercise locking for "fat-locked".
1276*795d594fSAndroid Build Coastguard Worker   lock_word = GetLockWord(jklass_);
1277*795d594fSAndroid Build Coastguard Worker   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, nullptr);
1278*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(nullptr, result));
1279*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(10, gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni]);
1280*795d594fSAndroid Build Coastguard Worker   lock_word = GetLockWord(jklass_);
1281*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(lock_word.GetState(), LockWord::kFatLocked);
1282*795d594fSAndroid Build Coastguard Worker 
1283*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_fooSSIOO_calls[gCurrentJni] = 0;
1284*795d594fSAndroid Build Coastguard Worker }
1285*795d594fSAndroid Build Coastguard Worker 
1286*795d594fSAndroid Build Coastguard Worker // TODO: Maybe. @FastNative support for returning Objects?
JNI_TEST_NORMAL_ONLY(CompileAndRunStaticSynchronizedIntObjectObjectMethod)1287*795d594fSAndroid Build Coastguard Worker JNI_TEST_NORMAL_ONLY(CompileAndRunStaticSynchronizedIntObjectObjectMethod)
1288*795d594fSAndroid Build Coastguard Worker 
1289*795d594fSAndroid Build Coastguard Worker void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
1290*795d594fSAndroid Build Coastguard Worker   jclass c = env->FindClass("java/lang/RuntimeException");
1291*795d594fSAndroid Build Coastguard Worker   env->ThrowNew(c, "hello");
1292*795d594fSAndroid Build Coastguard Worker }
1293*795d594fSAndroid Build Coastguard Worker 
Java_MyClassNatives_synchronizedThrowException(JNIEnv * env,jobject)1294*795d594fSAndroid Build Coastguard Worker void Java_MyClassNatives_synchronizedThrowException(JNIEnv* env, jobject) {
1295*795d594fSAndroid Build Coastguard Worker   JniCompilerTest::AssertCallerObjectLocked(env);
1296*795d594fSAndroid Build Coastguard Worker   jclass c = env->FindClass("java/lang/RuntimeException");
1297*795d594fSAndroid Build Coastguard Worker   env->ThrowNew(c, "hello");
1298*795d594fSAndroid Build Coastguard Worker }
1299*795d594fSAndroid Build Coastguard Worker 
ExceptionHandlingImpl()1300*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::ExceptionHandlingImpl() {
1301*795d594fSAndroid Build Coastguard Worker   {
1302*795d594fSAndroid Build Coastguard Worker     ASSERT_FALSE(runtime_->IsStarted());
1303*795d594fSAndroid Build Coastguard Worker     ScopedObjectAccess soa(Thread::Current());
1304*795d594fSAndroid Build Coastguard Worker     class_loader_ = LoadDex("MyClassNatives");
1305*795d594fSAndroid Build Coastguard Worker 
1306*795d594fSAndroid Build Coastguard Worker     // all compilation needs to happen before Runtime::Start
1307*795d594fSAndroid Build Coastguard Worker     CompileForTestWithCurrentJni(class_loader_, false, "foo", "()V");
1308*795d594fSAndroid Build Coastguard Worker     CompileForTestWithCurrentJni(class_loader_, false, "throwException", "()V");
1309*795d594fSAndroid Build Coastguard Worker     if (gCurrentJni == enum_cast<uint32_t>(JniKind::kNormal)) {
1310*795d594fSAndroid Build Coastguard Worker       CompileForTestWithCurrentJni(class_loader_, false, "synchronizedThrowException", "()V");
1311*795d594fSAndroid Build Coastguard Worker     }
1312*795d594fSAndroid Build Coastguard Worker   }
1313*795d594fSAndroid Build Coastguard Worker   // Start runtime to avoid re-initialization in SetUpForTest.
1314*795d594fSAndroid Build Coastguard Worker   Thread::Current()->TransitionFromSuspendedToRunnable();
1315*795d594fSAndroid Build Coastguard Worker   bool started = runtime_->Start();
1316*795d594fSAndroid Build Coastguard Worker   CHECK(started);
1317*795d594fSAndroid Build Coastguard Worker 
1318*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
1319*795d594fSAndroid Build Coastguard Worker 
1320*795d594fSAndroid Build Coastguard Worker   // Check a single call of a JNI method is ok
1321*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "foo", "()V", CURRENT_JNI_WRAPPER(Java_MyClassNatives_foo));
1322*795d594fSAndroid Build Coastguard Worker   env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
1323*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
1324*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(Thread::Current()->IsExceptionPending());
1325*795d594fSAndroid Build Coastguard Worker 
1326*795d594fSAndroid Build Coastguard Worker   // Get class for exception we expect to be thrown
1327*795d594fSAndroid Build Coastguard Worker   ScopedLocalRef<jclass> jlre(env_, env_->FindClass("java/lang/RuntimeException"));
1328*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "throwException", "()V",
1329*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_throwException));
1330*795d594fSAndroid Build Coastguard Worker   // Call Java_MyClassNatives_throwException (JNI method that throws exception)
1331*795d594fSAndroid Build Coastguard Worker   env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
1332*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1333*795d594fSAndroid Build Coastguard Worker   ScopedLocalRef<jthrowable> exception(env_, env_->ExceptionOccurred());
1334*795d594fSAndroid Build Coastguard Worker   env_->ExceptionClear();
1335*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsInstanceOf(exception.get(), jlre.get()));
1336*795d594fSAndroid Build Coastguard Worker 
1337*795d594fSAndroid Build Coastguard Worker   // Check a single call of a JNI method is ok
1338*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_MyClassNatives_foo_calls[gCurrentJni]);
1339*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
1340*795d594fSAndroid Build Coastguard Worker   env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
1341*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
1342*795d594fSAndroid Build Coastguard Worker 
1343*795d594fSAndroid Build Coastguard Worker   if (gCurrentJni == enum_cast<uint32_t>(JniKind::kNormal)) {
1344*795d594fSAndroid Build Coastguard Worker     SetUpForTest(false, "synchronizedThrowException", "()V",
1345*795d594fSAndroid Build Coastguard Worker                  CURRENT_JNI_WRAPPER(Java_MyClassNatives_synchronizedThrowException));
1346*795d594fSAndroid Build Coastguard Worker     LockWord lock_word = GetLockWord(jobj_);
1347*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(lock_word.GetState(), LockWord::kUnlocked);
1348*795d594fSAndroid Build Coastguard Worker     // Call Java_MyClassNatives_synchronizedThrowException (synchronized JNI method
1349*795d594fSAndroid Build Coastguard Worker     // that throws exception) to check that we correctly unlock the object.
1350*795d594fSAndroid Build Coastguard Worker     env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
1351*795d594fSAndroid Build Coastguard Worker     EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
1352*795d594fSAndroid Build Coastguard Worker     ScopedLocalRef<jthrowable> exception2(env_, env_->ExceptionOccurred());
1353*795d594fSAndroid Build Coastguard Worker     env_->ExceptionClear();
1354*795d594fSAndroid Build Coastguard Worker     EXPECT_TRUE(env_->IsInstanceOf(exception2.get(), jlre.get()));
1355*795d594fSAndroid Build Coastguard Worker     lock_word = GetLockWord(jobj_);
1356*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(lock_word.GetState(), LockWord::kUnlocked);
1357*795d594fSAndroid Build Coastguard Worker 
1358*795d594fSAndroid Build Coastguard Worker     // Check a single call of a JNI method is ok
1359*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(2, gJava_MyClassNatives_foo_calls[gCurrentJni]);
1360*795d594fSAndroid Build Coastguard Worker     SetUpForTest(false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
1361*795d594fSAndroid Build Coastguard Worker     env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
1362*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(3, gJava_MyClassNatives_foo_calls[gCurrentJni]);
1363*795d594fSAndroid Build Coastguard Worker   }
1364*795d594fSAndroid Build Coastguard Worker 
1365*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_foo_calls[gCurrentJni] = 0;
1366*795d594fSAndroid Build Coastguard Worker }
1367*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(ExceptionHandling)1368*795d594fSAndroid Build Coastguard Worker JNI_TEST(ExceptionHandling)
1369*795d594fSAndroid Build Coastguard Worker 
1370*795d594fSAndroid Build Coastguard Worker jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
1371*795d594fSAndroid Build Coastguard Worker   if (i <= 0) {
1372*795d594fSAndroid Build Coastguard Worker     // We want to check raw Object* / Array* below
1373*795d594fSAndroid Build Coastguard Worker     ScopedObjectAccess soa(env);
1374*795d594fSAndroid Build Coastguard Worker 
1375*795d594fSAndroid Build Coastguard Worker     // Build stack trace
1376*795d594fSAndroid Build Coastguard Worker     jobject internal =
1377*795d594fSAndroid Build Coastguard Worker         soa.AddLocalReference<jobject>(Thread::Current()->CreateInternalStackTrace(soa));
1378*795d594fSAndroid Build Coastguard Worker     jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
1379*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::ObjectArray<mirror::StackTraceElement>> trace_array =
1380*795d594fSAndroid Build Coastguard Worker         soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>>(ste_array);
1381*795d594fSAndroid Build Coastguard Worker     EXPECT_TRUE(trace_array != nullptr);
1382*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(11, trace_array->GetLength());
1383*795d594fSAndroid Build Coastguard Worker 
1384*795d594fSAndroid Build Coastguard Worker     // Check stack trace entries have expected values
1385*795d594fSAndroid Build Coastguard Worker     for (int32_t j = 0; j < trace_array->GetLength(); ++j) {
1386*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(-2, trace_array->Get(j)->GetLineNumber());
1387*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::StackTraceElement> ste = trace_array->Get(j);
1388*795d594fSAndroid Build Coastguard Worker       EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
1389*795d594fSAndroid Build Coastguard Worker       EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
1390*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(("fooI" + CurrentJniStringSuffix()), ste->GetMethodName()->ToModifiedUtf8());
1391*795d594fSAndroid Build Coastguard Worker     }
1392*795d594fSAndroid Build Coastguard Worker 
1393*795d594fSAndroid Build Coastguard Worker     // end recursion
1394*795d594fSAndroid Build Coastguard Worker     return 0;
1395*795d594fSAndroid Build Coastguard Worker   } else {
1396*795d594fSAndroid Build Coastguard Worker     jclass jklass = env->FindClass("MyClassNatives");
1397*795d594fSAndroid Build Coastguard Worker     EXPECT_TRUE(jklass != nullptr);
1398*795d594fSAndroid Build Coastguard Worker     jmethodID jmethod = env->GetMethodID(jklass,
1399*795d594fSAndroid Build Coastguard Worker                                          ("fooI" + CurrentJniStringSuffix()).c_str(),
1400*795d594fSAndroid Build Coastguard Worker                                          "(I)I");
1401*795d594fSAndroid Build Coastguard Worker     EXPECT_TRUE(jmethod != nullptr);
1402*795d594fSAndroid Build Coastguard Worker 
1403*795d594fSAndroid Build Coastguard Worker     // Recurse with i - 1
1404*795d594fSAndroid Build Coastguard Worker     jint result = env->CallNonvirtualIntMethod(thisObj, jklass, jmethod, i - 1);
1405*795d594fSAndroid Build Coastguard Worker 
1406*795d594fSAndroid Build Coastguard Worker     // Return sum of all depths
1407*795d594fSAndroid Build Coastguard Worker     return i + result;
1408*795d594fSAndroid Build Coastguard Worker   }
1409*795d594fSAndroid Build Coastguard Worker }
1410*795d594fSAndroid Build Coastguard Worker 
NativeStackTraceElementImpl()1411*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::NativeStackTraceElementImpl() {
1412*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "fooI", "(I)I",
1413*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_nativeUpCall));
1414*795d594fSAndroid Build Coastguard Worker 
1415*795d594fSAndroid Build Coastguard Worker   // Usual # local references on stack check fails because nativeUpCall calls itself recursively,
1416*795d594fSAndroid Build Coastguard Worker   // each time the # of local references will therefore go up.
1417*795d594fSAndroid Build Coastguard Worker   ScopedDisableCheckNumStackReferences disable_num_stack_check;
1418*795d594fSAndroid Build Coastguard Worker   jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
1419*795d594fSAndroid Build Coastguard Worker 
1420*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
1421*795d594fSAndroid Build Coastguard Worker }
1422*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(NativeStackTraceElement)1423*795d594fSAndroid Build Coastguard Worker JNI_TEST(NativeStackTraceElement)
1424*795d594fSAndroid Build Coastguard Worker 
1425*795d594fSAndroid Build Coastguard Worker jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
1426*795d594fSAndroid Build Coastguard Worker   return env->NewGlobalRef(x);
1427*795d594fSAndroid Build Coastguard Worker }
1428*795d594fSAndroid Build Coastguard Worker 
ReturnGlobalRefImpl()1429*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::ReturnGlobalRefImpl() {
1430*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
1431*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_fooO));
1432*795d594fSAndroid Build Coastguard Worker   jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
1433*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
1434*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->IsSameObject(result, jobj_));
1435*795d594fSAndroid Build Coastguard Worker }
1436*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(ReturnGlobalRef)1437*795d594fSAndroid Build Coastguard Worker JNI_TEST(ReturnGlobalRef)
1438*795d594fSAndroid Build Coastguard Worker 
1439*795d594fSAndroid Build Coastguard Worker jint local_ref_test(JNIEnv* env, jobject thisObj, jint x) {
1440*795d594fSAndroid Build Coastguard Worker   // Add 10 local references
1441*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(env);
1442*795d594fSAndroid Build Coastguard Worker   for (int i = 0; i < 10; i++) {
1443*795d594fSAndroid Build Coastguard Worker     soa.AddLocalReference<jobject>(soa.Decode<mirror::Object>(thisObj));
1444*795d594fSAndroid Build Coastguard Worker   }
1445*795d594fSAndroid Build Coastguard Worker   return x+1;
1446*795d594fSAndroid Build Coastguard Worker }
1447*795d594fSAndroid Build Coastguard Worker 
LocalReferenceTableClearingTestImpl()1448*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::LocalReferenceTableClearingTestImpl() {
1449*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "fooI", "(I)I", CURRENT_JNI_WRAPPER(local_ref_test));
1450*795d594fSAndroid Build Coastguard Worker   // 1000 invocations of a method that adds 10 local references
1451*795d594fSAndroid Build Coastguard Worker   for (int i = 0; i < 1000; i++) {
1452*795d594fSAndroid Build Coastguard Worker     jint result = env_->CallIntMethod(jobj_, jmethod_, i);
1453*795d594fSAndroid Build Coastguard Worker     EXPECT_TRUE(result == i + 1);
1454*795d594fSAndroid Build Coastguard Worker   }
1455*795d594fSAndroid Build Coastguard Worker }
1456*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(LocalReferenceTableClearingTest)1457*795d594fSAndroid Build Coastguard Worker JNI_TEST(LocalReferenceTableClearingTest)
1458*795d594fSAndroid Build Coastguard Worker 
1459*795d594fSAndroid Build Coastguard Worker void my_arraycopy(JNIEnv* env, jclass klass, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) {
1460*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, klass));
1461*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jklass_, dst));
1462*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, src));
1463*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1234, src_pos);
1464*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(5678, dst_pos);
1465*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(9876, length);
1466*795d594fSAndroid Build Coastguard Worker }
1467*795d594fSAndroid Build Coastguard Worker 
JavaLangSystemArrayCopyImpl()1468*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::JavaLangSystemArrayCopyImpl() {
1469*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
1470*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(my_arraycopy));
1471*795d594fSAndroid Build Coastguard Worker   env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
1472*795d594fSAndroid Build Coastguard Worker }
1473*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(JavaLangSystemArrayCopy)1474*795d594fSAndroid Build Coastguard Worker JNI_TEST(JavaLangSystemArrayCopy)
1475*795d594fSAndroid Build Coastguard Worker 
1476*795d594fSAndroid Build Coastguard Worker jboolean my_casi(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, jint expected, jint newval) {
1477*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, unsafe));
1478*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj));
1479*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(INT64_C(0x12345678ABCDEF88), offset);
1480*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<jint>(0xCAFEF00D), expected);
1481*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<jint>(0xEBADF00D), newval);
1482*795d594fSAndroid Build Coastguard Worker   return JNI_TRUE;
1483*795d594fSAndroid Build Coastguard Worker }
1484*795d594fSAndroid Build Coastguard Worker 
CompareAndSwapIntImpl()1485*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CompareAndSwapIntImpl() {
1486*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
1487*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(my_casi));
1488*795d594fSAndroid Build Coastguard Worker   jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, INT64_C(0x12345678ABCDEF88),
1489*795d594fSAndroid Build Coastguard Worker                                             0xCAFEF00D, 0xEBADF00D);
1490*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(result, JNI_TRUE);
1491*795d594fSAndroid Build Coastguard Worker }
1492*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(CompareAndSwapInt)1493*795d594fSAndroid Build Coastguard Worker JNI_TEST(CompareAndSwapInt)
1494*795d594fSAndroid Build Coastguard Worker 
1495*795d594fSAndroid Build Coastguard Worker jint my_gettext(JNIEnv* env, jclass klass, jlong val1, jobject obj1, jlong val2, jobject obj2) {
1496*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
1497*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj1));
1498*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env->IsSameObject(JniCompilerTest::jobj_, obj2));
1499*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0x12345678ABCDEF88LL, val1);
1500*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0x7FEDCBA987654321LL, val2);
1501*795d594fSAndroid Build Coastguard Worker   return 42;
1502*795d594fSAndroid Build Coastguard Worker }
1503*795d594fSAndroid Build Coastguard Worker 
GetTextImpl()1504*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::GetTextImpl() {
1505*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
1506*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(my_gettext));
1507*795d594fSAndroid Build Coastguard Worker   jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88LL, jobj_,
1508*795d594fSAndroid Build Coastguard Worker                                           INT64_C(0x7FEDCBA987654321), jobj_);
1509*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(result, 42);
1510*795d594fSAndroid Build Coastguard Worker }
1511*795d594fSAndroid Build Coastguard Worker 
1512*795d594fSAndroid Build Coastguard Worker JNI_TEST(GetText)
1513*795d594fSAndroid Build Coastguard Worker 
1514*795d594fSAndroid Build Coastguard Worker int gJava_MyClassNatives_GetSinkProperties_calls[kJniKindCount] = {};
Java_MyClassNatives_GetSinkProperties(JNIEnv * env,jobject thisObj,jstring s)1515*795d594fSAndroid Build Coastguard Worker jarray Java_MyClassNatives_GetSinkProperties(JNIEnv* env, jobject thisObj, jstring s) {
1516*795d594fSAndroid Build Coastguard Worker   JniCompilerTest::AssertCallerObjectLocked(env);
1517*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(s, nullptr);
1518*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]++;
1519*795d594fSAndroid Build Coastguard Worker 
1520*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
1521*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self);
1522*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(self->HoldsLock(soa.Decode<mirror::Object>(thisObj)));
1523*795d594fSAndroid Build Coastguard Worker   return nullptr;
1524*795d594fSAndroid Build Coastguard Worker }
1525*795d594fSAndroid Build Coastguard Worker 
GetSinkPropertiesNativeImpl()1526*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::GetSinkPropertiesNativeImpl() {
1527*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "getSinkPropertiesNative", "(Ljava/lang/String;)[Ljava/lang/Object;",
1528*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_GetSinkProperties));
1529*795d594fSAndroid Build Coastguard Worker 
1530*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
1531*795d594fSAndroid Build Coastguard Worker   jarray result = down_cast<jarray>(
1532*795d594fSAndroid Build Coastguard Worker       env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, nullptr));
1533*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, result);
1534*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni]);
1535*795d594fSAndroid Build Coastguard Worker 
1536*795d594fSAndroid Build Coastguard Worker   gJava_MyClassNatives_GetSinkProperties_calls[gCurrentJni] = 0;
1537*795d594fSAndroid Build Coastguard Worker }
1538*795d594fSAndroid Build Coastguard Worker 
1539*795d594fSAndroid Build Coastguard Worker // @FastNative doesn't support 'synchronized' keyword and
1540*795d594fSAndroid Build Coastguard Worker // never will -- locking functions aren't fast.
JNI_TEST_NORMAL_ONLY(GetSinkPropertiesNative)1541*795d594fSAndroid Build Coastguard Worker JNI_TEST_NORMAL_ONLY(GetSinkPropertiesNative)
1542*795d594fSAndroid Build Coastguard Worker 
1543*795d594fSAndroid Build Coastguard Worker // This should return jclass, but we're imitating a bug pattern.
1544*795d594fSAndroid Build Coastguard Worker jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
1545*795d594fSAndroid Build Coastguard Worker   return env->NewStringUTF("not a class!");
1546*795d594fSAndroid Build Coastguard Worker }
1547*795d594fSAndroid Build Coastguard Worker 
1548*795d594fSAndroid Build Coastguard Worker // This should return jclass, but we're imitating a bug pattern.
Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv * env,jclass)1549*795d594fSAndroid Build Coastguard Worker jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
1550*795d594fSAndroid Build Coastguard Worker   return env->NewStringUTF("not a class!");
1551*795d594fSAndroid Build Coastguard Worker }
1552*795d594fSAndroid Build Coastguard Worker 
UpcallReturnTypeChecking_InstanceImpl()1553*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::UpcallReturnTypeChecking_InstanceImpl() {
1554*795d594fSAndroid Build Coastguard Worker   // Set debuggable so that the JNI compiler does not emit a fast-path that would skip the
1555*795d594fSAndroid Build Coastguard Worker   // runtime call where we do these checks. Note that while normal gtests use the debug build
1556*795d594fSAndroid Build Coastguard Worker   // which disables the fast path, `art_standalone_compiler_tests` run in the release build.
1557*795d594fSAndroid Build Coastguard Worker   compiler_options_->SetDebuggable(true);
1558*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
1559*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldReturnClass));
1560*795d594fSAndroid Build Coastguard Worker 
1561*795d594fSAndroid Build Coastguard Worker   CheckJniAbortCatcher check_jni_abort_catcher;
1562*795d594fSAndroid Build Coastguard Worker   // This native method is bad, and tries to return a jstring as a jclass.
1563*795d594fSAndroid Build Coastguard Worker   env_->CallObjectMethod(jobj_, jmethod_);
1564*795d594fSAndroid Build Coastguard Worker   check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1565*795d594fSAndroid Build Coastguard Worker                                     "of java.lang.String from java.lang.Class " +
1566*795d594fSAndroid Build Coastguard Worker                                     "MyClassNatives.instanceMethodThatShouldReturnClass" +
1567*795d594fSAndroid Build Coastguard Worker                                     CurrentJniStringSuffix() + "()");
1568*795d594fSAndroid Build Coastguard Worker 
1569*795d594fSAndroid Build Coastguard Worker   // Here, we just call the method incorrectly; we should catch that too.
1570*795d594fSAndroid Build Coastguard Worker   env_->CallObjectMethod(jobj_, jmethod_);
1571*795d594fSAndroid Build Coastguard Worker   check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1572*795d594fSAndroid Build Coastguard Worker                                     "of java.lang.String from java.lang.Class " +
1573*795d594fSAndroid Build Coastguard Worker                                     "MyClassNatives.instanceMethodThatShouldReturnClass" +
1574*795d594fSAndroid Build Coastguard Worker                                     CurrentJniStringSuffix() + "()");
1575*795d594fSAndroid Build Coastguard Worker   env_->CallStaticObjectMethod(jklass_, jmethod_);
1576*795d594fSAndroid Build Coastguard Worker   check_jni_abort_catcher.Check(std::string() + "calling non-static method " +
1577*795d594fSAndroid Build Coastguard Worker                                     "java.lang.Class " +
1578*795d594fSAndroid Build Coastguard Worker                                     "MyClassNatives.instanceMethodThatShouldReturnClass" +
1579*795d594fSAndroid Build Coastguard Worker                                     CurrentJniStringSuffix() + "() with CallStaticObjectMethodV");
1580*795d594fSAndroid Build Coastguard Worker }
1581*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(UpcallReturnTypeChecking_Instance)1582*795d594fSAndroid Build Coastguard Worker JNI_TEST(UpcallReturnTypeChecking_Instance)
1583*795d594fSAndroid Build Coastguard Worker 
1584*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::UpcallReturnTypeChecking_StaticImpl() {
1585*795d594fSAndroid Build Coastguard Worker   // Set debuggable so that the JNI compiler does not emit a fast-path that would skip the
1586*795d594fSAndroid Build Coastguard Worker   // runtime call where we do these checks. Note that while normal gtests use the debug build
1587*795d594fSAndroid Build Coastguard Worker   // which disables the fast path, `art_standalone_compiler_tests` run in the release build.
1588*795d594fSAndroid Build Coastguard Worker   compiler_options_->SetDebuggable(true);
1589*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
1590*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldReturnClass));
1591*795d594fSAndroid Build Coastguard Worker 
1592*795d594fSAndroid Build Coastguard Worker   CheckJniAbortCatcher check_jni_abort_catcher;
1593*795d594fSAndroid Build Coastguard Worker   // This native method is bad, and tries to return a jstring as a jclass.
1594*795d594fSAndroid Build Coastguard Worker   env_->CallStaticObjectMethod(jklass_, jmethod_);
1595*795d594fSAndroid Build Coastguard Worker   check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1596*795d594fSAndroid Build Coastguard Worker                                     "of java.lang.String from java.lang.Class " +
1597*795d594fSAndroid Build Coastguard Worker                                     "MyClassNatives.staticMethodThatShouldReturnClass" +
1598*795d594fSAndroid Build Coastguard Worker                                     CurrentJniStringSuffix() + "()");
1599*795d594fSAndroid Build Coastguard Worker 
1600*795d594fSAndroid Build Coastguard Worker   // Here, we just call the method incorrectly; we should catch that too.
1601*795d594fSAndroid Build Coastguard Worker   env_->CallStaticObjectMethod(jklass_, jmethod_);
1602*795d594fSAndroid Build Coastguard Worker   check_jni_abort_catcher.Check(std::string() + "attempt to return an instance " +
1603*795d594fSAndroid Build Coastguard Worker                                     "of java.lang.String from java.lang.Class " +
1604*795d594fSAndroid Build Coastguard Worker                                     "MyClassNatives.staticMethodThatShouldReturnClass" +
1605*795d594fSAndroid Build Coastguard Worker                                     CurrentJniStringSuffix() + "()");
1606*795d594fSAndroid Build Coastguard Worker   env_->CallObjectMethod(jobj_, jmethod_);
1607*795d594fSAndroid Build Coastguard Worker   check_jni_abort_catcher.Check(std::string() + "calling static method " +
1608*795d594fSAndroid Build Coastguard Worker                                     "java.lang.Class " +
1609*795d594fSAndroid Build Coastguard Worker                                     "MyClassNatives.staticMethodThatShouldReturnClass" +
1610*795d594fSAndroid Build Coastguard Worker                                     CurrentJniStringSuffix() + "() with CallObjectMethodV");
1611*795d594fSAndroid Build Coastguard Worker }
1612*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(UpcallReturnTypeChecking_Static)1613*795d594fSAndroid Build Coastguard Worker JNI_TEST(UpcallReturnTypeChecking_Static)
1614*795d594fSAndroid Build Coastguard Worker 
1615*795d594fSAndroid Build Coastguard Worker // This should take jclass, but we're imitating a bug pattern.
1616*795d594fSAndroid Build Coastguard Worker void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
1617*795d594fSAndroid Build Coastguard Worker }
1618*795d594fSAndroid Build Coastguard Worker 
1619*795d594fSAndroid Build Coastguard Worker // This should take jclass, but we're imitating a bug pattern.
Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv *,jclass,jclass)1620*795d594fSAndroid Build Coastguard Worker void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
1621*795d594fSAndroid Build Coastguard Worker }
1622*795d594fSAndroid Build Coastguard Worker 
UpcallArgumentTypeChecking_InstanceImpl()1623*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::UpcallArgumentTypeChecking_InstanceImpl() {
1624*795d594fSAndroid Build Coastguard Worker   // This will lead to error messages in the log.
1625*795d594fSAndroid Build Coastguard Worker   ScopedLogSeverity sls(LogSeverity::FATAL);
1626*795d594fSAndroid Build Coastguard Worker 
1627*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
1628*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_instanceMethodThatShouldTakeClass));
1629*795d594fSAndroid Build Coastguard Worker 
1630*795d594fSAndroid Build Coastguard Worker   CheckJniAbortCatcher check_jni_abort_catcher;
1631*795d594fSAndroid Build Coastguard Worker   // We deliberately pass a bad second argument here.
1632*795d594fSAndroid Build Coastguard Worker   env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
1633*795d594fSAndroid Build Coastguard Worker   check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1634*795d594fSAndroid Build Coastguard Worker                                     "MyClassNatives.instanceMethodThatShouldTakeClass" +
1635*795d594fSAndroid Build Coastguard Worker                                     CurrentJniStringSuffix() + "(int, java.lang.Class)");
1636*795d594fSAndroid Build Coastguard Worker }
1637*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(UpcallArgumentTypeChecking_Instance)1638*795d594fSAndroid Build Coastguard Worker JNI_TEST(UpcallArgumentTypeChecking_Instance)
1639*795d594fSAndroid Build Coastguard Worker 
1640*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::UpcallArgumentTypeChecking_StaticImpl() {
1641*795d594fSAndroid Build Coastguard Worker   // This will lead to error messages in the log.
1642*795d594fSAndroid Build Coastguard Worker   ScopedLogSeverity sls(LogSeverity::FATAL);
1643*795d594fSAndroid Build Coastguard Worker 
1644*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
1645*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_staticMethodThatShouldTakeClass));
1646*795d594fSAndroid Build Coastguard Worker 
1647*795d594fSAndroid Build Coastguard Worker   CheckJniAbortCatcher check_jni_abort_catcher;
1648*795d594fSAndroid Build Coastguard Worker   // We deliberately pass a bad second argument here.
1649*795d594fSAndroid Build Coastguard Worker   env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
1650*795d594fSAndroid Build Coastguard Worker   check_jni_abort_catcher.Check(std::string() + "bad arguments passed to void " +
1651*795d594fSAndroid Build Coastguard Worker                                     "MyClassNatives.staticMethodThatShouldTakeClass" +
1652*795d594fSAndroid Build Coastguard Worker                                     CurrentJniStringSuffix() + "(int, java.lang.Class)");
1653*795d594fSAndroid Build Coastguard Worker }
1654*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(UpcallArgumentTypeChecking_Static)1655*795d594fSAndroid Build Coastguard Worker JNI_TEST(UpcallArgumentTypeChecking_Static)
1656*795d594fSAndroid Build Coastguard Worker 
1657*795d594fSAndroid Build Coastguard Worker jfloat Java_MyClassNatives_checkFloats(JNIEnv*, jobject, jfloat f1, jfloat f2) {
1658*795d594fSAndroid Build Coastguard Worker   return f1 - f2;  // non-commutative operator
1659*795d594fSAndroid Build Coastguard Worker }
1660*795d594fSAndroid Build Coastguard Worker 
CompileAndRunFloatFloatMethodImpl()1661*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CompileAndRunFloatFloatMethodImpl() {
1662*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "checkFloats", "(FF)F",
1663*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkFloats));
1664*795d594fSAndroid Build Coastguard Worker 
1665*795d594fSAndroid Build Coastguard Worker   jfloat result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_,
1666*795d594fSAndroid Build Coastguard Worker                                                     99.0F, 10.0F);
1667*795d594fSAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(99.0F - 10.0F, result);
1668*795d594fSAndroid Build Coastguard Worker   jfloat a = 3.14159F;
1669*795d594fSAndroid Build Coastguard Worker   jfloat b = 0.69314F;
1670*795d594fSAndroid Build Coastguard Worker   result = env_->CallNonvirtualFloatMethod(jobj_, jklass_, jmethod_, a, b);
1671*795d594fSAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(a - b, result);
1672*795d594fSAndroid Build Coastguard Worker }
1673*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(CompileAndRunFloatFloatMethod)1674*795d594fSAndroid Build Coastguard Worker JNI_TEST(CompileAndRunFloatFloatMethod)
1675*795d594fSAndroid Build Coastguard Worker 
1676*795d594fSAndroid Build Coastguard Worker void Java_MyClassNatives_checkParameterAlign([[maybe_unused]] JNIEnv* env,
1677*795d594fSAndroid Build Coastguard Worker                                              [[maybe_unused]] jobject thisObj,
1678*795d594fSAndroid Build Coastguard Worker                                              jint i1,
1679*795d594fSAndroid Build Coastguard Worker                                              jlong l1) {
1680*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i1, 1234);
1681*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(l1, INT64_C(0x12345678ABCDEF0));
1682*795d594fSAndroid Build Coastguard Worker }
1683*795d594fSAndroid Build Coastguard Worker 
CheckParameterAlignImpl()1684*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CheckParameterAlignImpl() {
1685*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "checkParameterAlign", "(IJ)V",
1686*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_checkParameterAlign));
1687*795d594fSAndroid Build Coastguard Worker 
1688*795d594fSAndroid Build Coastguard Worker   env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_, 1234, INT64_C(0x12345678ABCDEF0));
1689*795d594fSAndroid Build Coastguard Worker }
1690*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(CheckParameterAlign)1691*795d594fSAndroid Build Coastguard Worker JNI_TEST(CheckParameterAlign)
1692*795d594fSAndroid Build Coastguard Worker 
1693*795d594fSAndroid Build Coastguard Worker void Java_MyClassNatives_maxParamNumber(JNIEnv* env, jobject,
1694*795d594fSAndroid Build Coastguard Worker     jobject o0, jobject o1, jobject o2, jobject o3, jobject o4, jobject o5, jobject o6, jobject o7,
1695*795d594fSAndroid Build Coastguard Worker     jobject o8, jobject o9, jobject o10, jobject o11, jobject o12, jobject o13, jobject o14, jobject o15,
1696*795d594fSAndroid Build Coastguard Worker     jobject o16, jobject o17, jobject o18, jobject o19, jobject o20, jobject o21, jobject o22, jobject o23,
1697*795d594fSAndroid Build Coastguard Worker     jobject o24, jobject o25, jobject o26, jobject o27, jobject o28, jobject o29, jobject o30, jobject o31,
1698*795d594fSAndroid Build Coastguard Worker     jobject o32, jobject o33, jobject o34, jobject o35, jobject o36, jobject o37, jobject o38, jobject o39,
1699*795d594fSAndroid Build Coastguard Worker     jobject o40, jobject o41, jobject o42, jobject o43, jobject o44, jobject o45, jobject o46, jobject o47,
1700*795d594fSAndroid Build Coastguard Worker     jobject o48, jobject o49, jobject o50, jobject o51, jobject o52, jobject o53, jobject o54, jobject o55,
1701*795d594fSAndroid Build Coastguard Worker     jobject o56, jobject o57, jobject o58, jobject o59, jobject o60, jobject o61, jobject o62, jobject o63,
1702*795d594fSAndroid Build Coastguard Worker     jobject o64, jobject o65, jobject o66, jobject o67, jobject o68, jobject o69, jobject o70, jobject o71,
1703*795d594fSAndroid Build Coastguard Worker     jobject o72, jobject o73, jobject o74, jobject o75, jobject o76, jobject o77, jobject o78, jobject o79,
1704*795d594fSAndroid Build Coastguard Worker     jobject o80, jobject o81, jobject o82, jobject o83, jobject o84, jobject o85, jobject o86, jobject o87,
1705*795d594fSAndroid Build Coastguard Worker     jobject o88, jobject o89, jobject o90, jobject o91, jobject o92, jobject o93, jobject o94, jobject o95,
1706*795d594fSAndroid Build Coastguard Worker     jobject o96, jobject o97, jobject o98, jobject o99, jobject o100, jobject o101, jobject o102, jobject o103,
1707*795d594fSAndroid Build Coastguard Worker     jobject o104, jobject o105, jobject o106, jobject o107, jobject o108, jobject o109, jobject o110, jobject o111,
1708*795d594fSAndroid Build Coastguard Worker     jobject o112, jobject o113, jobject o114, jobject o115, jobject o116, jobject o117, jobject o118, jobject o119,
1709*795d594fSAndroid Build Coastguard Worker     jobject o120, jobject o121, jobject o122, jobject o123, jobject o124, jobject o125, jobject o126, jobject o127,
1710*795d594fSAndroid Build Coastguard Worker     jobject o128, jobject o129, jobject o130, jobject o131, jobject o132, jobject o133, jobject o134, jobject o135,
1711*795d594fSAndroid Build Coastguard Worker     jobject o136, jobject o137, jobject o138, jobject o139, jobject o140, jobject o141, jobject o142, jobject o143,
1712*795d594fSAndroid Build Coastguard Worker     jobject o144, jobject o145, jobject o146, jobject o147, jobject o148, jobject o149, jobject o150, jobject o151,
1713*795d594fSAndroid Build Coastguard Worker     jobject o152, jobject o153, jobject o154, jobject o155, jobject o156, jobject o157, jobject o158, jobject o159,
1714*795d594fSAndroid Build Coastguard Worker     jobject o160, jobject o161, jobject o162, jobject o163, jobject o164, jobject o165, jobject o166, jobject o167,
1715*795d594fSAndroid Build Coastguard Worker     jobject o168, jobject o169, jobject o170, jobject o171, jobject o172, jobject o173, jobject o174, jobject o175,
1716*795d594fSAndroid Build Coastguard Worker     jobject o176, jobject o177, jobject o178, jobject o179, jobject o180, jobject o181, jobject o182, jobject o183,
1717*795d594fSAndroid Build Coastguard Worker     jobject o184, jobject o185, jobject o186, jobject o187, jobject o188, jobject o189, jobject o190, jobject o191,
1718*795d594fSAndroid Build Coastguard Worker     jobject o192, jobject o193, jobject o194, jobject o195, jobject o196, jobject o197, jobject o198, jobject o199,
1719*795d594fSAndroid Build Coastguard Worker     jobject o200, jobject o201, jobject o202, jobject o203, jobject o204, jobject o205, jobject o206, jobject o207,
1720*795d594fSAndroid Build Coastguard Worker     jobject o208, jobject o209, jobject o210, jobject o211, jobject o212, jobject o213, jobject o214, jobject o215,
1721*795d594fSAndroid Build Coastguard Worker     jobject o216, jobject o217, jobject o218, jobject o219, jobject o220, jobject o221, jobject o222, jobject o223,
1722*795d594fSAndroid Build Coastguard Worker     jobject o224, jobject o225, jobject o226, jobject o227, jobject o228, jobject o229, jobject o230, jobject o231,
1723*795d594fSAndroid Build Coastguard Worker     jobject o232, jobject o233, jobject o234, jobject o235, jobject o236, jobject o237, jobject o238, jobject o239,
1724*795d594fSAndroid Build Coastguard Worker     jobject o240, jobject o241, jobject o242, jobject o243, jobject o244, jobject o245, jobject o246, jobject o247,
1725*795d594fSAndroid Build Coastguard Worker     jobject o248, jobject o249, jobject o250, jobject o251, jobject o252, jobject o253) {
1726*795d594fSAndroid Build Coastguard Worker   // two tests possible
1727*795d594fSAndroid Build Coastguard Worker   if (o0 == nullptr) {
1728*795d594fSAndroid Build Coastguard Worker     // 1) everything is null
1729*795d594fSAndroid Build Coastguard Worker     EXPECT_TRUE(o0 == nullptr && o1 == nullptr && o2 == nullptr && o3 == nullptr && o4 == nullptr
1730*795d594fSAndroid Build Coastguard Worker         && o5 == nullptr && o6 == nullptr && o7 == nullptr && o8 == nullptr && o9 == nullptr
1731*795d594fSAndroid Build Coastguard Worker         && o10 == nullptr && o11 == nullptr && o12 == nullptr && o13 == nullptr && o14 == nullptr
1732*795d594fSAndroid Build Coastguard Worker         && o15 == nullptr && o16 == nullptr && o17 == nullptr && o18 == nullptr && o19 == nullptr
1733*795d594fSAndroid Build Coastguard Worker         && o20 == nullptr && o21 == nullptr && o22 == nullptr && o23 == nullptr && o24 == nullptr
1734*795d594fSAndroid Build Coastguard Worker         && o25 == nullptr && o26 == nullptr && o27 == nullptr && o28 == nullptr && o29 == nullptr
1735*795d594fSAndroid Build Coastguard Worker         && o30 == nullptr && o31 == nullptr && o32 == nullptr && o33 == nullptr && o34 == nullptr
1736*795d594fSAndroid Build Coastguard Worker         && o35 == nullptr && o36 == nullptr && o37 == nullptr && o38 == nullptr && o39 == nullptr
1737*795d594fSAndroid Build Coastguard Worker         && o40 == nullptr && o41 == nullptr && o42 == nullptr && o43 == nullptr && o44 == nullptr
1738*795d594fSAndroid Build Coastguard Worker         && o45 == nullptr && o46 == nullptr && o47 == nullptr && o48 == nullptr && o49 == nullptr
1739*795d594fSAndroid Build Coastguard Worker         && o50 == nullptr && o51 == nullptr && o52 == nullptr && o53 == nullptr && o54 == nullptr
1740*795d594fSAndroid Build Coastguard Worker         && o55 == nullptr && o56 == nullptr && o57 == nullptr && o58 == nullptr && o59 == nullptr
1741*795d594fSAndroid Build Coastguard Worker         && o60 == nullptr && o61 == nullptr && o62 == nullptr && o63 == nullptr && o64 == nullptr
1742*795d594fSAndroid Build Coastguard Worker         && o65 == nullptr && o66 == nullptr && o67 == nullptr && o68 == nullptr && o69 == nullptr
1743*795d594fSAndroid Build Coastguard Worker         && o70 == nullptr && o71 == nullptr && o72 == nullptr && o73 == nullptr && o74 == nullptr
1744*795d594fSAndroid Build Coastguard Worker         && o75 == nullptr && o76 == nullptr && o77 == nullptr && o78 == nullptr && o79 == nullptr
1745*795d594fSAndroid Build Coastguard Worker         && o80 == nullptr && o81 == nullptr && o82 == nullptr && o83 == nullptr && o84 == nullptr
1746*795d594fSAndroid Build Coastguard Worker         && o85 == nullptr && o86 == nullptr && o87 == nullptr && o88 == nullptr && o89 == nullptr
1747*795d594fSAndroid Build Coastguard Worker         && o90 == nullptr && o91 == nullptr && o92 == nullptr && o93 == nullptr && o94 == nullptr
1748*795d594fSAndroid Build Coastguard Worker         && o95 == nullptr && o96 == nullptr && o97 == nullptr && o98 == nullptr && o99 == nullptr
1749*795d594fSAndroid Build Coastguard Worker         && o100 == nullptr && o101 == nullptr && o102 == nullptr && o103 == nullptr && o104 == nullptr
1750*795d594fSAndroid Build Coastguard Worker         && o105 == nullptr && o106 == nullptr && o107 == nullptr && o108 == nullptr && o109 == nullptr
1751*795d594fSAndroid Build Coastguard Worker         && o110 == nullptr && o111 == nullptr && o112 == nullptr && o113 == nullptr && o114 == nullptr
1752*795d594fSAndroid Build Coastguard Worker         && o115 == nullptr && o116 == nullptr && o117 == nullptr && o118 == nullptr && o119 == nullptr
1753*795d594fSAndroid Build Coastguard Worker         && o120 == nullptr && o121 == nullptr && o122 == nullptr && o123 == nullptr && o124 == nullptr
1754*795d594fSAndroid Build Coastguard Worker         && o125 == nullptr && o126 == nullptr && o127 == nullptr && o128 == nullptr && o129 == nullptr
1755*795d594fSAndroid Build Coastguard Worker         && o130 == nullptr && o131 == nullptr && o132 == nullptr && o133 == nullptr && o134 == nullptr
1756*795d594fSAndroid Build Coastguard Worker         && o135 == nullptr && o136 == nullptr && o137 == nullptr && o138 == nullptr && o139 == nullptr
1757*795d594fSAndroid Build Coastguard Worker         && o140 == nullptr && o141 == nullptr && o142 == nullptr && o143 == nullptr && o144 == nullptr
1758*795d594fSAndroid Build Coastguard Worker         && o145 == nullptr && o146 == nullptr && o147 == nullptr && o148 == nullptr && o149 == nullptr
1759*795d594fSAndroid Build Coastguard Worker         && o150 == nullptr && o151 == nullptr && o152 == nullptr && o153 == nullptr && o154 == nullptr
1760*795d594fSAndroid Build Coastguard Worker         && o155 == nullptr && o156 == nullptr && o157 == nullptr && o158 == nullptr && o159 == nullptr
1761*795d594fSAndroid Build Coastguard Worker         && o160 == nullptr && o161 == nullptr && o162 == nullptr && o163 == nullptr && o164 == nullptr
1762*795d594fSAndroid Build Coastguard Worker         && o165 == nullptr && o166 == nullptr && o167 == nullptr && o168 == nullptr && o169 == nullptr
1763*795d594fSAndroid Build Coastguard Worker         && o170 == nullptr && o171 == nullptr && o172 == nullptr && o173 == nullptr && o174 == nullptr
1764*795d594fSAndroid Build Coastguard Worker         && o175 == nullptr && o176 == nullptr && o177 == nullptr && o178 == nullptr && o179 == nullptr
1765*795d594fSAndroid Build Coastguard Worker         && o180 == nullptr && o181 == nullptr && o182 == nullptr && o183 == nullptr && o184 == nullptr
1766*795d594fSAndroid Build Coastguard Worker         && o185 == nullptr && o186 == nullptr && o187 == nullptr && o188 == nullptr && o189 == nullptr
1767*795d594fSAndroid Build Coastguard Worker         && o190 == nullptr && o191 == nullptr && o192 == nullptr && o193 == nullptr && o194 == nullptr
1768*795d594fSAndroid Build Coastguard Worker         && o195 == nullptr && o196 == nullptr && o197 == nullptr && o198 == nullptr && o199 == nullptr
1769*795d594fSAndroid Build Coastguard Worker         && o200 == nullptr && o201 == nullptr && o202 == nullptr && o203 == nullptr && o204 == nullptr
1770*795d594fSAndroid Build Coastguard Worker         && o205 == nullptr && o206 == nullptr && o207 == nullptr && o208 == nullptr && o209 == nullptr
1771*795d594fSAndroid Build Coastguard Worker         && o210 == nullptr && o211 == nullptr && o212 == nullptr && o213 == nullptr && o214 == nullptr
1772*795d594fSAndroid Build Coastguard Worker         && o215 == nullptr && o216 == nullptr && o217 == nullptr && o218 == nullptr && o219 == nullptr
1773*795d594fSAndroid Build Coastguard Worker         && o220 == nullptr && o221 == nullptr && o222 == nullptr && o223 == nullptr && o224 == nullptr
1774*795d594fSAndroid Build Coastguard Worker         && o225 == nullptr && o226 == nullptr && o227 == nullptr && o228 == nullptr && o229 == nullptr
1775*795d594fSAndroid Build Coastguard Worker         && o230 == nullptr && o231 == nullptr && o232 == nullptr && o233 == nullptr && o234 == nullptr
1776*795d594fSAndroid Build Coastguard Worker         && o235 == nullptr && o236 == nullptr && o237 == nullptr && o238 == nullptr && o239 == nullptr
1777*795d594fSAndroid Build Coastguard Worker         && o240 == nullptr && o241 == nullptr && o242 == nullptr && o243 == nullptr && o244 == nullptr
1778*795d594fSAndroid Build Coastguard Worker         && o245 == nullptr && o246 == nullptr && o247 == nullptr && o248 == nullptr && o249 == nullptr
1779*795d594fSAndroid Build Coastguard Worker         && o250 == nullptr && o251 == nullptr && o252 == nullptr && o253 == nullptr);
1780*795d594fSAndroid Build Coastguard Worker   } else {
1781*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(0, env->GetArrayLength(reinterpret_cast<jarray>(o0)));
1782*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(1, env->GetArrayLength(reinterpret_cast<jarray>(o1)));
1783*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(2, env->GetArrayLength(reinterpret_cast<jarray>(o2)));
1784*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(3, env->GetArrayLength(reinterpret_cast<jarray>(o3)));
1785*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(4, env->GetArrayLength(reinterpret_cast<jarray>(o4)));
1786*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(5, env->GetArrayLength(reinterpret_cast<jarray>(o5)));
1787*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(6, env->GetArrayLength(reinterpret_cast<jarray>(o6)));
1788*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(7, env->GetArrayLength(reinterpret_cast<jarray>(o7)));
1789*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(8, env->GetArrayLength(reinterpret_cast<jarray>(o8)));
1790*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(9, env->GetArrayLength(reinterpret_cast<jarray>(o9)));
1791*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(10, env->GetArrayLength(reinterpret_cast<jarray>(o10)));
1792*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(11, env->GetArrayLength(reinterpret_cast<jarray>(o11)));
1793*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(12, env->GetArrayLength(reinterpret_cast<jarray>(o12)));
1794*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(13, env->GetArrayLength(reinterpret_cast<jarray>(o13)));
1795*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(14, env->GetArrayLength(reinterpret_cast<jarray>(o14)));
1796*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(15, env->GetArrayLength(reinterpret_cast<jarray>(o15)));
1797*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(16, env->GetArrayLength(reinterpret_cast<jarray>(o16)));
1798*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(17, env->GetArrayLength(reinterpret_cast<jarray>(o17)));
1799*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(18, env->GetArrayLength(reinterpret_cast<jarray>(o18)));
1800*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(19, env->GetArrayLength(reinterpret_cast<jarray>(o19)));
1801*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(20, env->GetArrayLength(reinterpret_cast<jarray>(o20)));
1802*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(21, env->GetArrayLength(reinterpret_cast<jarray>(o21)));
1803*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(22, env->GetArrayLength(reinterpret_cast<jarray>(o22)));
1804*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(23, env->GetArrayLength(reinterpret_cast<jarray>(o23)));
1805*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(24, env->GetArrayLength(reinterpret_cast<jarray>(o24)));
1806*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(25, env->GetArrayLength(reinterpret_cast<jarray>(o25)));
1807*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(26, env->GetArrayLength(reinterpret_cast<jarray>(o26)));
1808*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(27, env->GetArrayLength(reinterpret_cast<jarray>(o27)));
1809*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(28, env->GetArrayLength(reinterpret_cast<jarray>(o28)));
1810*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(29, env->GetArrayLength(reinterpret_cast<jarray>(o29)));
1811*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(30, env->GetArrayLength(reinterpret_cast<jarray>(o30)));
1812*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(31, env->GetArrayLength(reinterpret_cast<jarray>(o31)));
1813*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(32, env->GetArrayLength(reinterpret_cast<jarray>(o32)));
1814*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(33, env->GetArrayLength(reinterpret_cast<jarray>(o33)));
1815*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(34, env->GetArrayLength(reinterpret_cast<jarray>(o34)));
1816*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(35, env->GetArrayLength(reinterpret_cast<jarray>(o35)));
1817*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(36, env->GetArrayLength(reinterpret_cast<jarray>(o36)));
1818*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(37, env->GetArrayLength(reinterpret_cast<jarray>(o37)));
1819*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(38, env->GetArrayLength(reinterpret_cast<jarray>(o38)));
1820*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(39, env->GetArrayLength(reinterpret_cast<jarray>(o39)));
1821*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(40, env->GetArrayLength(reinterpret_cast<jarray>(o40)));
1822*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(41, env->GetArrayLength(reinterpret_cast<jarray>(o41)));
1823*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(42, env->GetArrayLength(reinterpret_cast<jarray>(o42)));
1824*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(43, env->GetArrayLength(reinterpret_cast<jarray>(o43)));
1825*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(44, env->GetArrayLength(reinterpret_cast<jarray>(o44)));
1826*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(45, env->GetArrayLength(reinterpret_cast<jarray>(o45)));
1827*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(46, env->GetArrayLength(reinterpret_cast<jarray>(o46)));
1828*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(47, env->GetArrayLength(reinterpret_cast<jarray>(o47)));
1829*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(48, env->GetArrayLength(reinterpret_cast<jarray>(o48)));
1830*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(49, env->GetArrayLength(reinterpret_cast<jarray>(o49)));
1831*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(50, env->GetArrayLength(reinterpret_cast<jarray>(o50)));
1832*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(51, env->GetArrayLength(reinterpret_cast<jarray>(o51)));
1833*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(52, env->GetArrayLength(reinterpret_cast<jarray>(o52)));
1834*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(53, env->GetArrayLength(reinterpret_cast<jarray>(o53)));
1835*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(54, env->GetArrayLength(reinterpret_cast<jarray>(o54)));
1836*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(55, env->GetArrayLength(reinterpret_cast<jarray>(o55)));
1837*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(56, env->GetArrayLength(reinterpret_cast<jarray>(o56)));
1838*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(57, env->GetArrayLength(reinterpret_cast<jarray>(o57)));
1839*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(58, env->GetArrayLength(reinterpret_cast<jarray>(o58)));
1840*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(59, env->GetArrayLength(reinterpret_cast<jarray>(o59)));
1841*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(60, env->GetArrayLength(reinterpret_cast<jarray>(o60)));
1842*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(61, env->GetArrayLength(reinterpret_cast<jarray>(o61)));
1843*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(62, env->GetArrayLength(reinterpret_cast<jarray>(o62)));
1844*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(63, env->GetArrayLength(reinterpret_cast<jarray>(o63)));
1845*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(64, env->GetArrayLength(reinterpret_cast<jarray>(o64)));
1846*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(65, env->GetArrayLength(reinterpret_cast<jarray>(o65)));
1847*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(66, env->GetArrayLength(reinterpret_cast<jarray>(o66)));
1848*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(67, env->GetArrayLength(reinterpret_cast<jarray>(o67)));
1849*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(68, env->GetArrayLength(reinterpret_cast<jarray>(o68)));
1850*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(69, env->GetArrayLength(reinterpret_cast<jarray>(o69)));
1851*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(70, env->GetArrayLength(reinterpret_cast<jarray>(o70)));
1852*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(71, env->GetArrayLength(reinterpret_cast<jarray>(o71)));
1853*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(72, env->GetArrayLength(reinterpret_cast<jarray>(o72)));
1854*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(73, env->GetArrayLength(reinterpret_cast<jarray>(o73)));
1855*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(74, env->GetArrayLength(reinterpret_cast<jarray>(o74)));
1856*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(75, env->GetArrayLength(reinterpret_cast<jarray>(o75)));
1857*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(76, env->GetArrayLength(reinterpret_cast<jarray>(o76)));
1858*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(77, env->GetArrayLength(reinterpret_cast<jarray>(o77)));
1859*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(78, env->GetArrayLength(reinterpret_cast<jarray>(o78)));
1860*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(79, env->GetArrayLength(reinterpret_cast<jarray>(o79)));
1861*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(80, env->GetArrayLength(reinterpret_cast<jarray>(o80)));
1862*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(81, env->GetArrayLength(reinterpret_cast<jarray>(o81)));
1863*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(82, env->GetArrayLength(reinterpret_cast<jarray>(o82)));
1864*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(83, env->GetArrayLength(reinterpret_cast<jarray>(o83)));
1865*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(84, env->GetArrayLength(reinterpret_cast<jarray>(o84)));
1866*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(85, env->GetArrayLength(reinterpret_cast<jarray>(o85)));
1867*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(86, env->GetArrayLength(reinterpret_cast<jarray>(o86)));
1868*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(87, env->GetArrayLength(reinterpret_cast<jarray>(o87)));
1869*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(88, env->GetArrayLength(reinterpret_cast<jarray>(o88)));
1870*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(89, env->GetArrayLength(reinterpret_cast<jarray>(o89)));
1871*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(90, env->GetArrayLength(reinterpret_cast<jarray>(o90)));
1872*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(91, env->GetArrayLength(reinterpret_cast<jarray>(o91)));
1873*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(92, env->GetArrayLength(reinterpret_cast<jarray>(o92)));
1874*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(93, env->GetArrayLength(reinterpret_cast<jarray>(o93)));
1875*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(94, env->GetArrayLength(reinterpret_cast<jarray>(o94)));
1876*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(95, env->GetArrayLength(reinterpret_cast<jarray>(o95)));
1877*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(96, env->GetArrayLength(reinterpret_cast<jarray>(o96)));
1878*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(97, env->GetArrayLength(reinterpret_cast<jarray>(o97)));
1879*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(98, env->GetArrayLength(reinterpret_cast<jarray>(o98)));
1880*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(99, env->GetArrayLength(reinterpret_cast<jarray>(o99)));
1881*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(100, env->GetArrayLength(reinterpret_cast<jarray>(o100)));
1882*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(101, env->GetArrayLength(reinterpret_cast<jarray>(o101)));
1883*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(102, env->GetArrayLength(reinterpret_cast<jarray>(o102)));
1884*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(103, env->GetArrayLength(reinterpret_cast<jarray>(o103)));
1885*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(104, env->GetArrayLength(reinterpret_cast<jarray>(o104)));
1886*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(105, env->GetArrayLength(reinterpret_cast<jarray>(o105)));
1887*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(106, env->GetArrayLength(reinterpret_cast<jarray>(o106)));
1888*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(107, env->GetArrayLength(reinterpret_cast<jarray>(o107)));
1889*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(108, env->GetArrayLength(reinterpret_cast<jarray>(o108)));
1890*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(109, env->GetArrayLength(reinterpret_cast<jarray>(o109)));
1891*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(110, env->GetArrayLength(reinterpret_cast<jarray>(o110)));
1892*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(111, env->GetArrayLength(reinterpret_cast<jarray>(o111)));
1893*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(112, env->GetArrayLength(reinterpret_cast<jarray>(o112)));
1894*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(113, env->GetArrayLength(reinterpret_cast<jarray>(o113)));
1895*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(114, env->GetArrayLength(reinterpret_cast<jarray>(o114)));
1896*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(115, env->GetArrayLength(reinterpret_cast<jarray>(o115)));
1897*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(116, env->GetArrayLength(reinterpret_cast<jarray>(o116)));
1898*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(117, env->GetArrayLength(reinterpret_cast<jarray>(o117)));
1899*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(118, env->GetArrayLength(reinterpret_cast<jarray>(o118)));
1900*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(119, env->GetArrayLength(reinterpret_cast<jarray>(o119)));
1901*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(120, env->GetArrayLength(reinterpret_cast<jarray>(o120)));
1902*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(121, env->GetArrayLength(reinterpret_cast<jarray>(o121)));
1903*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(122, env->GetArrayLength(reinterpret_cast<jarray>(o122)));
1904*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(123, env->GetArrayLength(reinterpret_cast<jarray>(o123)));
1905*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(124, env->GetArrayLength(reinterpret_cast<jarray>(o124)));
1906*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(125, env->GetArrayLength(reinterpret_cast<jarray>(o125)));
1907*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(126, env->GetArrayLength(reinterpret_cast<jarray>(o126)));
1908*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(127, env->GetArrayLength(reinterpret_cast<jarray>(o127)));
1909*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(128, env->GetArrayLength(reinterpret_cast<jarray>(o128)));
1910*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(129, env->GetArrayLength(reinterpret_cast<jarray>(o129)));
1911*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(130, env->GetArrayLength(reinterpret_cast<jarray>(o130)));
1912*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(131, env->GetArrayLength(reinterpret_cast<jarray>(o131)));
1913*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(132, env->GetArrayLength(reinterpret_cast<jarray>(o132)));
1914*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(133, env->GetArrayLength(reinterpret_cast<jarray>(o133)));
1915*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(134, env->GetArrayLength(reinterpret_cast<jarray>(o134)));
1916*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(135, env->GetArrayLength(reinterpret_cast<jarray>(o135)));
1917*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(136, env->GetArrayLength(reinterpret_cast<jarray>(o136)));
1918*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(137, env->GetArrayLength(reinterpret_cast<jarray>(o137)));
1919*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(138, env->GetArrayLength(reinterpret_cast<jarray>(o138)));
1920*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(139, env->GetArrayLength(reinterpret_cast<jarray>(o139)));
1921*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(140, env->GetArrayLength(reinterpret_cast<jarray>(o140)));
1922*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(141, env->GetArrayLength(reinterpret_cast<jarray>(o141)));
1923*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(142, env->GetArrayLength(reinterpret_cast<jarray>(o142)));
1924*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(143, env->GetArrayLength(reinterpret_cast<jarray>(o143)));
1925*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(144, env->GetArrayLength(reinterpret_cast<jarray>(o144)));
1926*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(145, env->GetArrayLength(reinterpret_cast<jarray>(o145)));
1927*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(146, env->GetArrayLength(reinterpret_cast<jarray>(o146)));
1928*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(147, env->GetArrayLength(reinterpret_cast<jarray>(o147)));
1929*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(148, env->GetArrayLength(reinterpret_cast<jarray>(o148)));
1930*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(149, env->GetArrayLength(reinterpret_cast<jarray>(o149)));
1931*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(150, env->GetArrayLength(reinterpret_cast<jarray>(o150)));
1932*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(151, env->GetArrayLength(reinterpret_cast<jarray>(o151)));
1933*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(152, env->GetArrayLength(reinterpret_cast<jarray>(o152)));
1934*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(153, env->GetArrayLength(reinterpret_cast<jarray>(o153)));
1935*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(154, env->GetArrayLength(reinterpret_cast<jarray>(o154)));
1936*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(155, env->GetArrayLength(reinterpret_cast<jarray>(o155)));
1937*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(156, env->GetArrayLength(reinterpret_cast<jarray>(o156)));
1938*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(157, env->GetArrayLength(reinterpret_cast<jarray>(o157)));
1939*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(158, env->GetArrayLength(reinterpret_cast<jarray>(o158)));
1940*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(159, env->GetArrayLength(reinterpret_cast<jarray>(o159)));
1941*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(160, env->GetArrayLength(reinterpret_cast<jarray>(o160)));
1942*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(161, env->GetArrayLength(reinterpret_cast<jarray>(o161)));
1943*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(162, env->GetArrayLength(reinterpret_cast<jarray>(o162)));
1944*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(163, env->GetArrayLength(reinterpret_cast<jarray>(o163)));
1945*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(164, env->GetArrayLength(reinterpret_cast<jarray>(o164)));
1946*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(165, env->GetArrayLength(reinterpret_cast<jarray>(o165)));
1947*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(166, env->GetArrayLength(reinterpret_cast<jarray>(o166)));
1948*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(167, env->GetArrayLength(reinterpret_cast<jarray>(o167)));
1949*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(168, env->GetArrayLength(reinterpret_cast<jarray>(o168)));
1950*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(169, env->GetArrayLength(reinterpret_cast<jarray>(o169)));
1951*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(170, env->GetArrayLength(reinterpret_cast<jarray>(o170)));
1952*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(171, env->GetArrayLength(reinterpret_cast<jarray>(o171)));
1953*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(172, env->GetArrayLength(reinterpret_cast<jarray>(o172)));
1954*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(173, env->GetArrayLength(reinterpret_cast<jarray>(o173)));
1955*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(174, env->GetArrayLength(reinterpret_cast<jarray>(o174)));
1956*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(175, env->GetArrayLength(reinterpret_cast<jarray>(o175)));
1957*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(176, env->GetArrayLength(reinterpret_cast<jarray>(o176)));
1958*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(177, env->GetArrayLength(reinterpret_cast<jarray>(o177)));
1959*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(178, env->GetArrayLength(reinterpret_cast<jarray>(o178)));
1960*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(179, env->GetArrayLength(reinterpret_cast<jarray>(o179)));
1961*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(180, env->GetArrayLength(reinterpret_cast<jarray>(o180)));
1962*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(181, env->GetArrayLength(reinterpret_cast<jarray>(o181)));
1963*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(182, env->GetArrayLength(reinterpret_cast<jarray>(o182)));
1964*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(183, env->GetArrayLength(reinterpret_cast<jarray>(o183)));
1965*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(184, env->GetArrayLength(reinterpret_cast<jarray>(o184)));
1966*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(185, env->GetArrayLength(reinterpret_cast<jarray>(o185)));
1967*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(186, env->GetArrayLength(reinterpret_cast<jarray>(o186)));
1968*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(187, env->GetArrayLength(reinterpret_cast<jarray>(o187)));
1969*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(188, env->GetArrayLength(reinterpret_cast<jarray>(o188)));
1970*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(189, env->GetArrayLength(reinterpret_cast<jarray>(o189)));
1971*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(190, env->GetArrayLength(reinterpret_cast<jarray>(o190)));
1972*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(191, env->GetArrayLength(reinterpret_cast<jarray>(o191)));
1973*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(192, env->GetArrayLength(reinterpret_cast<jarray>(o192)));
1974*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(193, env->GetArrayLength(reinterpret_cast<jarray>(o193)));
1975*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(194, env->GetArrayLength(reinterpret_cast<jarray>(o194)));
1976*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(195, env->GetArrayLength(reinterpret_cast<jarray>(o195)));
1977*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(196, env->GetArrayLength(reinterpret_cast<jarray>(o196)));
1978*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(197, env->GetArrayLength(reinterpret_cast<jarray>(o197)));
1979*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(198, env->GetArrayLength(reinterpret_cast<jarray>(o198)));
1980*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(199, env->GetArrayLength(reinterpret_cast<jarray>(o199)));
1981*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(200, env->GetArrayLength(reinterpret_cast<jarray>(o200)));
1982*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(201, env->GetArrayLength(reinterpret_cast<jarray>(o201)));
1983*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(202, env->GetArrayLength(reinterpret_cast<jarray>(o202)));
1984*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(203, env->GetArrayLength(reinterpret_cast<jarray>(o203)));
1985*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(204, env->GetArrayLength(reinterpret_cast<jarray>(o204)));
1986*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(205, env->GetArrayLength(reinterpret_cast<jarray>(o205)));
1987*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(206, env->GetArrayLength(reinterpret_cast<jarray>(o206)));
1988*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(207, env->GetArrayLength(reinterpret_cast<jarray>(o207)));
1989*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(208, env->GetArrayLength(reinterpret_cast<jarray>(o208)));
1990*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(209, env->GetArrayLength(reinterpret_cast<jarray>(o209)));
1991*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(210, env->GetArrayLength(reinterpret_cast<jarray>(o210)));
1992*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(211, env->GetArrayLength(reinterpret_cast<jarray>(o211)));
1993*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(212, env->GetArrayLength(reinterpret_cast<jarray>(o212)));
1994*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(213, env->GetArrayLength(reinterpret_cast<jarray>(o213)));
1995*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(214, env->GetArrayLength(reinterpret_cast<jarray>(o214)));
1996*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(215, env->GetArrayLength(reinterpret_cast<jarray>(o215)));
1997*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(216, env->GetArrayLength(reinterpret_cast<jarray>(o216)));
1998*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(217, env->GetArrayLength(reinterpret_cast<jarray>(o217)));
1999*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(218, env->GetArrayLength(reinterpret_cast<jarray>(o218)));
2000*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(219, env->GetArrayLength(reinterpret_cast<jarray>(o219)));
2001*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(220, env->GetArrayLength(reinterpret_cast<jarray>(o220)));
2002*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(221, env->GetArrayLength(reinterpret_cast<jarray>(o221)));
2003*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(222, env->GetArrayLength(reinterpret_cast<jarray>(o222)));
2004*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(223, env->GetArrayLength(reinterpret_cast<jarray>(o223)));
2005*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(224, env->GetArrayLength(reinterpret_cast<jarray>(o224)));
2006*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(225, env->GetArrayLength(reinterpret_cast<jarray>(o225)));
2007*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(226, env->GetArrayLength(reinterpret_cast<jarray>(o226)));
2008*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(227, env->GetArrayLength(reinterpret_cast<jarray>(o227)));
2009*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(228, env->GetArrayLength(reinterpret_cast<jarray>(o228)));
2010*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(229, env->GetArrayLength(reinterpret_cast<jarray>(o229)));
2011*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(230, env->GetArrayLength(reinterpret_cast<jarray>(o230)));
2012*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(231, env->GetArrayLength(reinterpret_cast<jarray>(o231)));
2013*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(232, env->GetArrayLength(reinterpret_cast<jarray>(o232)));
2014*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(233, env->GetArrayLength(reinterpret_cast<jarray>(o233)));
2015*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(234, env->GetArrayLength(reinterpret_cast<jarray>(o234)));
2016*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(235, env->GetArrayLength(reinterpret_cast<jarray>(o235)));
2017*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(236, env->GetArrayLength(reinterpret_cast<jarray>(o236)));
2018*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(237, env->GetArrayLength(reinterpret_cast<jarray>(o237)));
2019*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(238, env->GetArrayLength(reinterpret_cast<jarray>(o238)));
2020*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(239, env->GetArrayLength(reinterpret_cast<jarray>(o239)));
2021*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(240, env->GetArrayLength(reinterpret_cast<jarray>(o240)));
2022*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(241, env->GetArrayLength(reinterpret_cast<jarray>(o241)));
2023*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(242, env->GetArrayLength(reinterpret_cast<jarray>(o242)));
2024*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(243, env->GetArrayLength(reinterpret_cast<jarray>(o243)));
2025*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(244, env->GetArrayLength(reinterpret_cast<jarray>(o244)));
2026*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(245, env->GetArrayLength(reinterpret_cast<jarray>(o245)));
2027*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(246, env->GetArrayLength(reinterpret_cast<jarray>(o246)));
2028*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(247, env->GetArrayLength(reinterpret_cast<jarray>(o247)));
2029*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(248, env->GetArrayLength(reinterpret_cast<jarray>(o248)));
2030*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(249, env->GetArrayLength(reinterpret_cast<jarray>(o249)));
2031*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(250, env->GetArrayLength(reinterpret_cast<jarray>(o250)));
2032*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(251, env->GetArrayLength(reinterpret_cast<jarray>(o251)));
2033*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(252, env->GetArrayLength(reinterpret_cast<jarray>(o252)));
2034*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(253, env->GetArrayLength(reinterpret_cast<jarray>(o253)));
2035*795d594fSAndroid Build Coastguard Worker   }
2036*795d594fSAndroid Build Coastguard Worker }
2037*795d594fSAndroid Build Coastguard Worker 
2038*795d594fSAndroid Build Coastguard Worker const char* longSig =
2039*795d594fSAndroid Build Coastguard Worker     "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2040*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2041*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2042*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2043*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2044*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2045*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2046*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2047*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2048*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2049*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2050*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2051*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2052*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2053*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2054*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2055*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2056*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2057*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2058*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2059*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2060*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2061*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2062*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2063*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2064*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2065*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2066*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2067*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2068*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2069*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2070*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2071*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2072*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2073*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2074*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2075*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2076*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2077*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2078*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2079*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2080*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2081*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2082*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2083*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2084*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2085*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2086*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2087*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2088*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;"
2089*795d594fSAndroid Build Coastguard Worker     "Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V";
2090*795d594fSAndroid Build Coastguard Worker 
MaxParamNumberImpl()2091*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::MaxParamNumberImpl() {
2092*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "maxParamNumber", longSig,
2093*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_maxParamNumber));
2094*795d594fSAndroid Build Coastguard Worker 
2095*795d594fSAndroid Build Coastguard Worker   jvalue args[254];
2096*795d594fSAndroid Build Coastguard Worker 
2097*795d594fSAndroid Build Coastguard Worker   // First test: test with all arguments null.
2098*795d594fSAndroid Build Coastguard Worker   for (int i = 0; i < 254; ++i) {
2099*795d594fSAndroid Build Coastguard Worker     args[i].l = nullptr;
2100*795d594fSAndroid Build Coastguard Worker   }
2101*795d594fSAndroid Build Coastguard Worker 
2102*795d594fSAndroid Build Coastguard Worker   env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
2103*795d594fSAndroid Build Coastguard Worker 
2104*795d594fSAndroid Build Coastguard Worker   // Second test: test with int[] objects with increasing lengths
2105*795d594fSAndroid Build Coastguard Worker   for (int i = 0; i < 254; ++i) {
2106*795d594fSAndroid Build Coastguard Worker     jintArray tmp = env_->NewIntArray(i);
2107*795d594fSAndroid Build Coastguard Worker     args[i].l = tmp;
2108*795d594fSAndroid Build Coastguard Worker     EXPECT_NE(args[i].l, nullptr);
2109*795d594fSAndroid Build Coastguard Worker   }
2110*795d594fSAndroid Build Coastguard Worker 
2111*795d594fSAndroid Build Coastguard Worker   env_->CallNonvirtualVoidMethodA(jobj_, jklass_, jmethod_, args);
2112*795d594fSAndroid Build Coastguard Worker }
2113*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(MaxParamNumber)2114*795d594fSAndroid Build Coastguard Worker JNI_TEST(MaxParamNumber)
2115*795d594fSAndroid Build Coastguard Worker 
2116*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::WithoutImplementationImpl() {
2117*795d594fSAndroid Build Coastguard Worker   // This will lead to error messages in the log.
2118*795d594fSAndroid Build Coastguard Worker   ScopedLogSeverity sls(LogSeverity::FATAL);
2119*795d594fSAndroid Build Coastguard Worker 
2120*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false, "withoutImplementation", "()V", NORMAL_OR_FAST_JNI_ONLY_NULLPTR);
2121*795d594fSAndroid Build Coastguard Worker 
2122*795d594fSAndroid Build Coastguard Worker   env_->CallVoidMethod(jobj_, jmethod_);
2123*795d594fSAndroid Build Coastguard Worker 
2124*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Thread::Current()->IsExceptionPending());
2125*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
2126*795d594fSAndroid Build Coastguard Worker }
2127*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(WithoutImplementation)2128*795d594fSAndroid Build Coastguard Worker JNI_TEST(WithoutImplementation)
2129*795d594fSAndroid Build Coastguard Worker 
2130*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::WithoutImplementationRefReturnImpl() {
2131*795d594fSAndroid Build Coastguard Worker   // This will lead to error messages in the log.
2132*795d594fSAndroid Build Coastguard Worker   ScopedLogSeverity sls(LogSeverity::FATAL);
2133*795d594fSAndroid Build Coastguard Worker 
2134*795d594fSAndroid Build Coastguard Worker   SetUpForTest(false,
2135*795d594fSAndroid Build Coastguard Worker                "withoutImplementationRefReturn",
2136*795d594fSAndroid Build Coastguard Worker                "()Ljava/lang/Object;",
2137*795d594fSAndroid Build Coastguard Worker                NORMAL_OR_FAST_JNI_ONLY_NULLPTR);
2138*795d594fSAndroid Build Coastguard Worker 
2139*795d594fSAndroid Build Coastguard Worker   env_->CallObjectMethod(jobj_, jmethod_);
2140*795d594fSAndroid Build Coastguard Worker 
2141*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Thread::Current()->IsExceptionPending());
2142*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
2143*795d594fSAndroid Build Coastguard Worker }
2144*795d594fSAndroid Build Coastguard Worker 
JNI_TEST(WithoutImplementationRefReturn)2145*795d594fSAndroid Build Coastguard Worker JNI_TEST(WithoutImplementationRefReturn)
2146*795d594fSAndroid Build Coastguard Worker 
2147*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::StaticWithoutImplementationImpl() {
2148*795d594fSAndroid Build Coastguard Worker   // This will lead to error messages in the log.
2149*795d594fSAndroid Build Coastguard Worker   ScopedLogSeverity sls(LogSeverity::FATAL);
2150*795d594fSAndroid Build Coastguard Worker 
2151*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "staticWithoutImplementation", "()V", nullptr);
2152*795d594fSAndroid Build Coastguard Worker 
2153*795d594fSAndroid Build Coastguard Worker   env_->CallStaticVoidMethod(jklass_, jmethod_);
2154*795d594fSAndroid Build Coastguard Worker 
2155*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Thread::Current()->IsExceptionPending());
2156*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(env_->ExceptionCheck() == JNI_TRUE);
2157*795d594fSAndroid Build Coastguard Worker }
2158*795d594fSAndroid Build Coastguard Worker 
JNI_TEST_CRITICAL(StaticWithoutImplementation)2159*795d594fSAndroid Build Coastguard Worker JNI_TEST_CRITICAL(StaticWithoutImplementation)
2160*795d594fSAndroid Build Coastguard Worker 
2161*795d594fSAndroid Build Coastguard Worker void Java_MyClassNatives_stackArgsIntsFirst(JNIEnv*, jclass, jint i1, jint i2, jint i3,
2162*795d594fSAndroid Build Coastguard Worker                                             jint i4, jint i5, jint i6, jint i7, jint i8, jint i9,
2163*795d594fSAndroid Build Coastguard Worker                                             jint i10, jfloat f1, jfloat f2, jfloat f3, jfloat f4,
2164*795d594fSAndroid Build Coastguard Worker                                             jfloat f5, jfloat f6, jfloat f7, jfloat f8, jfloat f9,
2165*795d594fSAndroid Build Coastguard Worker                                             jfloat f10) {
2166*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i1, 1);
2167*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i2, 2);
2168*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i3, 3);
2169*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i4, 4);
2170*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i5, 5);
2171*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i6, 6);
2172*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i7, 7);
2173*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i8, 8);
2174*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i9, 9);
2175*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i10, 10);
2176*795d594fSAndroid Build Coastguard Worker 
2177*795d594fSAndroid Build Coastguard Worker   jint i11 = bit_cast<jint, jfloat>(f1);
2178*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i11, 11);
2179*795d594fSAndroid Build Coastguard Worker   jint i12 = bit_cast<jint, jfloat>(f2);
2180*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i12, 12);
2181*795d594fSAndroid Build Coastguard Worker   jint i13 = bit_cast<jint, jfloat>(f3);
2182*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i13, 13);
2183*795d594fSAndroid Build Coastguard Worker   jint i14 = bit_cast<jint, jfloat>(f4);
2184*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i14, 14);
2185*795d594fSAndroid Build Coastguard Worker   jint i15 = bit_cast<jint, jfloat>(f5);
2186*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i15, 15);
2187*795d594fSAndroid Build Coastguard Worker   jint i16 = bit_cast<jint, jfloat>(f6);
2188*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i16, 16);
2189*795d594fSAndroid Build Coastguard Worker   jint i17 = bit_cast<jint, jfloat>(f7);
2190*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i17, 17);
2191*795d594fSAndroid Build Coastguard Worker   jint i18 = bit_cast<jint, jfloat>(f8);
2192*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i18, 18);
2193*795d594fSAndroid Build Coastguard Worker   jint i19 = bit_cast<jint, jfloat>(f9);
2194*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i19, 19);
2195*795d594fSAndroid Build Coastguard Worker   jint i20 = bit_cast<jint, jfloat>(f10);
2196*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i20, 20);
2197*795d594fSAndroid Build Coastguard Worker }
2198*795d594fSAndroid Build Coastguard Worker 
StackArgsIntsFirstImpl()2199*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::StackArgsIntsFirstImpl() {
2200*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "stackArgsIntsFirst", "(IIIIIIIIIIFFFFFFFFFF)V",
2201*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsIntsFirst));
2202*795d594fSAndroid Build Coastguard Worker 
2203*795d594fSAndroid Build Coastguard Worker   jint i1 = 1;
2204*795d594fSAndroid Build Coastguard Worker   jint i2 = 2;
2205*795d594fSAndroid Build Coastguard Worker   jint i3 = 3;
2206*795d594fSAndroid Build Coastguard Worker   jint i4 = 4;
2207*795d594fSAndroid Build Coastguard Worker   jint i5 = 5;
2208*795d594fSAndroid Build Coastguard Worker   jint i6 = 6;
2209*795d594fSAndroid Build Coastguard Worker   jint i7 = 7;
2210*795d594fSAndroid Build Coastguard Worker   jint i8 = 8;
2211*795d594fSAndroid Build Coastguard Worker   jint i9 = 9;
2212*795d594fSAndroid Build Coastguard Worker   jint i10 = 10;
2213*795d594fSAndroid Build Coastguard Worker 
2214*795d594fSAndroid Build Coastguard Worker   jfloat f1 = bit_cast<jfloat, jint>(11);
2215*795d594fSAndroid Build Coastguard Worker   jfloat f2 = bit_cast<jfloat, jint>(12);
2216*795d594fSAndroid Build Coastguard Worker   jfloat f3 = bit_cast<jfloat, jint>(13);
2217*795d594fSAndroid Build Coastguard Worker   jfloat f4 = bit_cast<jfloat, jint>(14);
2218*795d594fSAndroid Build Coastguard Worker   jfloat f5 = bit_cast<jfloat, jint>(15);
2219*795d594fSAndroid Build Coastguard Worker   jfloat f6 = bit_cast<jfloat, jint>(16);
2220*795d594fSAndroid Build Coastguard Worker   jfloat f7 = bit_cast<jfloat, jint>(17);
2221*795d594fSAndroid Build Coastguard Worker   jfloat f8 = bit_cast<jfloat, jint>(18);
2222*795d594fSAndroid Build Coastguard Worker   jfloat f9 = bit_cast<jfloat, jint>(19);
2223*795d594fSAndroid Build Coastguard Worker   jfloat f10 = bit_cast<jfloat, jint>(20);
2224*795d594fSAndroid Build Coastguard Worker 
2225*795d594fSAndroid Build Coastguard Worker   env_->CallStaticVoidMethod(jklass_, jmethod_, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, f1, f2,
2226*795d594fSAndroid Build Coastguard Worker                              f3, f4, f5, f6, f7, f8, f9, f10);
2227*795d594fSAndroid Build Coastguard Worker }
2228*795d594fSAndroid Build Coastguard Worker 
JNI_TEST_CRITICAL(StackArgsIntsFirst)2229*795d594fSAndroid Build Coastguard Worker JNI_TEST_CRITICAL(StackArgsIntsFirst)
2230*795d594fSAndroid Build Coastguard Worker 
2231*795d594fSAndroid Build Coastguard Worker void Java_MyClassNatives_stackArgsFloatsFirst(JNIEnv*, jclass, jfloat f1, jfloat f2,
2232*795d594fSAndroid Build Coastguard Worker                                               jfloat f3, jfloat f4, jfloat f5, jfloat f6, jfloat f7,
2233*795d594fSAndroid Build Coastguard Worker                                               jfloat f8, jfloat f9, jfloat f10, jint i1, jint i2,
2234*795d594fSAndroid Build Coastguard Worker                                               jint i3, jint i4, jint i5, jint i6, jint i7, jint i8,
2235*795d594fSAndroid Build Coastguard Worker                                               jint i9, jint i10) {
2236*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i1, 1);
2237*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i2, 2);
2238*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i3, 3);
2239*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i4, 4);
2240*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i5, 5);
2241*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i6, 6);
2242*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i7, 7);
2243*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i8, 8);
2244*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i9, 9);
2245*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i10, 10);
2246*795d594fSAndroid Build Coastguard Worker 
2247*795d594fSAndroid Build Coastguard Worker   jint i11 = bit_cast<jint, jfloat>(f1);
2248*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i11, 11);
2249*795d594fSAndroid Build Coastguard Worker   jint i12 = bit_cast<jint, jfloat>(f2);
2250*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i12, 12);
2251*795d594fSAndroid Build Coastguard Worker   jint i13 = bit_cast<jint, jfloat>(f3);
2252*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i13, 13);
2253*795d594fSAndroid Build Coastguard Worker   jint i14 = bit_cast<jint, jfloat>(f4);
2254*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i14, 14);
2255*795d594fSAndroid Build Coastguard Worker   jint i15 = bit_cast<jint, jfloat>(f5);
2256*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i15, 15);
2257*795d594fSAndroid Build Coastguard Worker   jint i16 = bit_cast<jint, jfloat>(f6);
2258*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i16, 16);
2259*795d594fSAndroid Build Coastguard Worker   jint i17 = bit_cast<jint, jfloat>(f7);
2260*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i17, 17);
2261*795d594fSAndroid Build Coastguard Worker   jint i18 = bit_cast<jint, jfloat>(f8);
2262*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i18, 18);
2263*795d594fSAndroid Build Coastguard Worker   jint i19 = bit_cast<jint, jfloat>(f9);
2264*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i19, 19);
2265*795d594fSAndroid Build Coastguard Worker   jint i20 = bit_cast<jint, jfloat>(f10);
2266*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i20, 20);
2267*795d594fSAndroid Build Coastguard Worker }
2268*795d594fSAndroid Build Coastguard Worker 
StackArgsFloatsFirstImpl()2269*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::StackArgsFloatsFirstImpl() {
2270*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "stackArgsFloatsFirst", "(FFFFFFFFFFIIIIIIIIII)V",
2271*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsFloatsFirst));
2272*795d594fSAndroid Build Coastguard Worker 
2273*795d594fSAndroid Build Coastguard Worker   jint i1 = 1;
2274*795d594fSAndroid Build Coastguard Worker   jint i2 = 2;
2275*795d594fSAndroid Build Coastguard Worker   jint i3 = 3;
2276*795d594fSAndroid Build Coastguard Worker   jint i4 = 4;
2277*795d594fSAndroid Build Coastguard Worker   jint i5 = 5;
2278*795d594fSAndroid Build Coastguard Worker   jint i6 = 6;
2279*795d594fSAndroid Build Coastguard Worker   jint i7 = 7;
2280*795d594fSAndroid Build Coastguard Worker   jint i8 = 8;
2281*795d594fSAndroid Build Coastguard Worker   jint i9 = 9;
2282*795d594fSAndroid Build Coastguard Worker   jint i10 = 10;
2283*795d594fSAndroid Build Coastguard Worker 
2284*795d594fSAndroid Build Coastguard Worker   jfloat f1 = bit_cast<jfloat, jint>(11);
2285*795d594fSAndroid Build Coastguard Worker   jfloat f2 = bit_cast<jfloat, jint>(12);
2286*795d594fSAndroid Build Coastguard Worker   jfloat f3 = bit_cast<jfloat, jint>(13);
2287*795d594fSAndroid Build Coastguard Worker   jfloat f4 = bit_cast<jfloat, jint>(14);
2288*795d594fSAndroid Build Coastguard Worker   jfloat f5 = bit_cast<jfloat, jint>(15);
2289*795d594fSAndroid Build Coastguard Worker   jfloat f6 = bit_cast<jfloat, jint>(16);
2290*795d594fSAndroid Build Coastguard Worker   jfloat f7 = bit_cast<jfloat, jint>(17);
2291*795d594fSAndroid Build Coastguard Worker   jfloat f8 = bit_cast<jfloat, jint>(18);
2292*795d594fSAndroid Build Coastguard Worker   jfloat f9 = bit_cast<jfloat, jint>(19);
2293*795d594fSAndroid Build Coastguard Worker   jfloat f10 = bit_cast<jfloat, jint>(20);
2294*795d594fSAndroid Build Coastguard Worker 
2295*795d594fSAndroid Build Coastguard Worker   env_->CallStaticVoidMethod(jklass_, jmethod_, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, i1, i2, i3,
2296*795d594fSAndroid Build Coastguard Worker                              i4, i5, i6, i7, i8, i9, i10);
2297*795d594fSAndroid Build Coastguard Worker }
2298*795d594fSAndroid Build Coastguard Worker 
JNI_TEST_CRITICAL(StackArgsFloatsFirst)2299*795d594fSAndroid Build Coastguard Worker JNI_TEST_CRITICAL(StackArgsFloatsFirst)
2300*795d594fSAndroid Build Coastguard Worker 
2301*795d594fSAndroid Build Coastguard Worker void Java_MyClassNatives_stackArgsMixed(JNIEnv*, jclass, jint i1, jfloat f1, jint i2,
2302*795d594fSAndroid Build Coastguard Worker                                         jfloat f2, jint i3, jfloat f3, jint i4, jfloat f4, jint i5,
2303*795d594fSAndroid Build Coastguard Worker                                         jfloat f5, jint i6, jfloat f6, jint i7, jfloat f7, jint i8,
2304*795d594fSAndroid Build Coastguard Worker                                         jfloat f8, jint i9, jfloat f9, jint i10, jfloat f10) {
2305*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i1, 1);
2306*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i2, 2);
2307*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i3, 3);
2308*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i4, 4);
2309*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i5, 5);
2310*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i6, 6);
2311*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i7, 7);
2312*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i8, 8);
2313*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i9, 9);
2314*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i10, 10);
2315*795d594fSAndroid Build Coastguard Worker 
2316*795d594fSAndroid Build Coastguard Worker   jint i11 = bit_cast<jint, jfloat>(f1);
2317*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i11, 11);
2318*795d594fSAndroid Build Coastguard Worker   jint i12 = bit_cast<jint, jfloat>(f2);
2319*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i12, 12);
2320*795d594fSAndroid Build Coastguard Worker   jint i13 = bit_cast<jint, jfloat>(f3);
2321*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i13, 13);
2322*795d594fSAndroid Build Coastguard Worker   jint i14 = bit_cast<jint, jfloat>(f4);
2323*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i14, 14);
2324*795d594fSAndroid Build Coastguard Worker   jint i15 = bit_cast<jint, jfloat>(f5);
2325*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i15, 15);
2326*795d594fSAndroid Build Coastguard Worker   jint i16 = bit_cast<jint, jfloat>(f6);
2327*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i16, 16);
2328*795d594fSAndroid Build Coastguard Worker   jint i17 = bit_cast<jint, jfloat>(f7);
2329*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i17, 17);
2330*795d594fSAndroid Build Coastguard Worker   jint i18 = bit_cast<jint, jfloat>(f8);
2331*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i18, 18);
2332*795d594fSAndroid Build Coastguard Worker   jint i19 = bit_cast<jint, jfloat>(f9);
2333*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i19, 19);
2334*795d594fSAndroid Build Coastguard Worker   jint i20 = bit_cast<jint, jfloat>(f10);
2335*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(i20, 20);
2336*795d594fSAndroid Build Coastguard Worker }
2337*795d594fSAndroid Build Coastguard Worker 
StackArgsMixedImpl()2338*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::StackArgsMixedImpl() {
2339*795d594fSAndroid Build Coastguard Worker   SetUpForTest(true, "stackArgsMixed", "(IFIFIFIFIFIFIFIFIFIF)V",
2340*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_stackArgsMixed));
2341*795d594fSAndroid Build Coastguard Worker 
2342*795d594fSAndroid Build Coastguard Worker   jint i1 = 1;
2343*795d594fSAndroid Build Coastguard Worker   jint i2 = 2;
2344*795d594fSAndroid Build Coastguard Worker   jint i3 = 3;
2345*795d594fSAndroid Build Coastguard Worker   jint i4 = 4;
2346*795d594fSAndroid Build Coastguard Worker   jint i5 = 5;
2347*795d594fSAndroid Build Coastguard Worker   jint i6 = 6;
2348*795d594fSAndroid Build Coastguard Worker   jint i7 = 7;
2349*795d594fSAndroid Build Coastguard Worker   jint i8 = 8;
2350*795d594fSAndroid Build Coastguard Worker   jint i9 = 9;
2351*795d594fSAndroid Build Coastguard Worker   jint i10 = 10;
2352*795d594fSAndroid Build Coastguard Worker 
2353*795d594fSAndroid Build Coastguard Worker   jfloat f1 = bit_cast<jfloat, jint>(11);
2354*795d594fSAndroid Build Coastguard Worker   jfloat f2 = bit_cast<jfloat, jint>(12);
2355*795d594fSAndroid Build Coastguard Worker   jfloat f3 = bit_cast<jfloat, jint>(13);
2356*795d594fSAndroid Build Coastguard Worker   jfloat f4 = bit_cast<jfloat, jint>(14);
2357*795d594fSAndroid Build Coastguard Worker   jfloat f5 = bit_cast<jfloat, jint>(15);
2358*795d594fSAndroid Build Coastguard Worker   jfloat f6 = bit_cast<jfloat, jint>(16);
2359*795d594fSAndroid Build Coastguard Worker   jfloat f7 = bit_cast<jfloat, jint>(17);
2360*795d594fSAndroid Build Coastguard Worker   jfloat f8 = bit_cast<jfloat, jint>(18);
2361*795d594fSAndroid Build Coastguard Worker   jfloat f9 = bit_cast<jfloat, jint>(19);
2362*795d594fSAndroid Build Coastguard Worker   jfloat f10 = bit_cast<jfloat, jint>(20);
2363*795d594fSAndroid Build Coastguard Worker 
2364*795d594fSAndroid Build Coastguard Worker   env_->CallStaticVoidMethod(jklass_, jmethod_, i1, f1, i2, f2, i3, f3, i4, f4, i5, f5, i6, f6, i7,
2365*795d594fSAndroid Build Coastguard Worker                              f7, i8, f8, i9, f9, i10, f10);
2366*795d594fSAndroid Build Coastguard Worker }
2367*795d594fSAndroid Build Coastguard Worker 
JNI_TEST_CRITICAL(StackArgsMixed)2368*795d594fSAndroid Build Coastguard Worker JNI_TEST_CRITICAL(StackArgsMixed)
2369*795d594fSAndroid Build Coastguard Worker 
2370*795d594fSAndroid Build Coastguard Worker void Java_MyClassNatives_normalNative(JNIEnv*, jclass) {
2371*795d594fSAndroid Build Coastguard Worker   // Intentionally left empty.
2372*795d594fSAndroid Build Coastguard Worker }
2373*795d594fSAndroid Build Coastguard Worker 
2374*795d594fSAndroid Build Coastguard Worker // Methods not annotated with anything are not considered "fast native"
2375*795d594fSAndroid Build Coastguard Worker // -- Check that the annotation lookup does not find it.
NormalNativeImpl()2376*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::NormalNativeImpl() {
2377*795d594fSAndroid Build Coastguard Worker   SetUpForTest(/* direct= */ true,
2378*795d594fSAndroid Build Coastguard Worker                "normalNative",
2379*795d594fSAndroid Build Coastguard Worker                "()V",
2380*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_normalNative));
2381*795d594fSAndroid Build Coastguard Worker 
2382*795d594fSAndroid Build Coastguard Worker   ArtMethod* method = jni::DecodeArtMethod(jmethod_);
2383*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(method != nullptr);
2384*795d594fSAndroid Build Coastguard Worker 
2385*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(method->IsCriticalNative());
2386*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(method->IsFastNative());
2387*795d594fSAndroid Build Coastguard Worker }
2388*795d594fSAndroid Build Coastguard Worker 
2389*795d594fSAndroid Build Coastguard Worker // TODO: just rename the java functions  to the standard convention and remove duplicated tests
JNI_TEST_NORMAL_ONLY(NormalNative)2390*795d594fSAndroid Build Coastguard Worker JNI_TEST_NORMAL_ONLY(NormalNative)
2391*795d594fSAndroid Build Coastguard Worker 
2392*795d594fSAndroid Build Coastguard Worker // Methods annotated with @FastNative are considered "fast native"
2393*795d594fSAndroid Build Coastguard Worker // -- Check that the annotation lookup succeeds.
2394*795d594fSAndroid Build Coastguard Worker void Java_MyClassNatives_fastNative(JNIEnv*, jclass) {
2395*795d594fSAndroid Build Coastguard Worker   // Intentionally left empty.
2396*795d594fSAndroid Build Coastguard Worker }
2397*795d594fSAndroid Build Coastguard Worker 
FastNativeImpl()2398*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::FastNativeImpl() {
2399*795d594fSAndroid Build Coastguard Worker   SetUpForTest(/* direct= */ true,
2400*795d594fSAndroid Build Coastguard Worker                "fastNative",
2401*795d594fSAndroid Build Coastguard Worker                "()V",
2402*795d594fSAndroid Build Coastguard Worker                CURRENT_JNI_WRAPPER(Java_MyClassNatives_fastNative));
2403*795d594fSAndroid Build Coastguard Worker 
2404*795d594fSAndroid Build Coastguard Worker   ArtMethod* method = jni::DecodeArtMethod(jmethod_);
2405*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(method != nullptr);
2406*795d594fSAndroid Build Coastguard Worker 
2407*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(method->IsCriticalNative());
2408*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(method->IsFastNative());
2409*795d594fSAndroid Build Coastguard Worker }
2410*795d594fSAndroid Build Coastguard Worker 
2411*795d594fSAndroid Build Coastguard Worker // TODO: just rename the java functions  to the standard convention and remove duplicated tests
2412*795d594fSAndroid Build Coastguard Worker JNI_TEST_NORMAL_ONLY(FastNative)
2413*795d594fSAndroid Build Coastguard Worker 
2414*795d594fSAndroid Build Coastguard Worker int gJava_myClassNatives_criticalNative_calls[kJniKindCount] = {};
2415*795d594fSAndroid Build Coastguard Worker // Methods annotated with @CriticalNative are considered "critical native"
2416*795d594fSAndroid Build Coastguard Worker // -- Check that the annotation lookup succeeds.
Java_MyClassNatives_criticalNative()2417*795d594fSAndroid Build Coastguard Worker void Java_MyClassNatives_criticalNative() {
2418*795d594fSAndroid Build Coastguard Worker   gJava_myClassNatives_criticalNative_calls[gCurrentJni]++;
2419*795d594fSAndroid Build Coastguard Worker }
2420*795d594fSAndroid Build Coastguard Worker 
CriticalNativeImpl()2421*795d594fSAndroid Build Coastguard Worker void JniCompilerTest::CriticalNativeImpl() {
2422*795d594fSAndroid Build Coastguard Worker   SetUpForTest(/* direct= */ true,
2423*795d594fSAndroid Build Coastguard Worker                // Important: Don't change the "current jni" yet to avoid a method name suffix.
2424*795d594fSAndroid Build Coastguard Worker                "criticalNative",
2425*795d594fSAndroid Build Coastguard Worker                "()V",
2426*795d594fSAndroid Build Coastguard Worker                // TODO: Use CURRENT_JNI_WRAPPER instead which is more generic.
2427*795d594fSAndroid Build Coastguard Worker                reinterpret_cast<void*>(&Java_MyClassNatives_criticalNative));
2428*795d594fSAndroid Build Coastguard Worker 
2429*795d594fSAndroid Build Coastguard Worker   // TODO: remove this manual updating of the current JNI. Merge with the other tests.
2430*795d594fSAndroid Build Coastguard Worker   UpdateCurrentJni(JniKind::kCritical);
2431*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(IsCurrentJniCritical());
2432*795d594fSAndroid Build Coastguard Worker 
2433*795d594fSAndroid Build Coastguard Worker   ArtMethod* method = jni::DecodeArtMethod(jmethod_);
2434*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(method != nullptr);
2435*795d594fSAndroid Build Coastguard Worker 
2436*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(method->IsCriticalNative());
2437*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(method->IsFastNative());
2438*795d594fSAndroid Build Coastguard Worker 
2439*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2440*795d594fSAndroid Build Coastguard Worker   env_->CallStaticVoidMethod(jklass_, jmethod_);
2441*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1, gJava_myClassNatives_criticalNative_calls[gCurrentJni]);
2442*795d594fSAndroid Build Coastguard Worker 
2443*795d594fSAndroid Build Coastguard Worker   gJava_myClassNatives_criticalNative_calls[gCurrentJni] = 0;
2444*795d594fSAndroid Build Coastguard Worker }
2445*795d594fSAndroid Build Coastguard Worker 
2446*795d594fSAndroid Build Coastguard Worker // TODO: just rename the java functions  to the standard convention and remove duplicated tests
2447*795d594fSAndroid Build Coastguard Worker JNI_TEST_NORMAL_ONLY(CriticalNative)
2448*795d594fSAndroid Build Coastguard Worker 
2449*795d594fSAndroid Build Coastguard Worker }  // namespace art
2450