xref: /aosp_15_r20/cts/tests/tests/jni/libjnitest/macroized_tests.c (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
1*b7c941bbSAndroid Build Coastguard Worker /*
2*b7c941bbSAndroid Build Coastguard Worker  * Copyright (C) 2009 The Android Open Source Project
3*b7c941bbSAndroid Build Coastguard Worker  *
4*b7c941bbSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*b7c941bbSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*b7c941bbSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*b7c941bbSAndroid Build Coastguard Worker  *
8*b7c941bbSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*b7c941bbSAndroid Build Coastguard Worker  *
10*b7c941bbSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*b7c941bbSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*b7c941bbSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*b7c941bbSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*b7c941bbSAndroid Build Coastguard Worker  * limitations under the License.
15*b7c941bbSAndroid Build Coastguard Worker  */
16*b7c941bbSAndroid Build Coastguard Worker 
17*b7c941bbSAndroid Build Coastguard Worker /*
18*b7c941bbSAndroid Build Coastguard Worker  * These are all tests of JNI, but where the JNI calls themselves are
19*b7c941bbSAndroid Build Coastguard Worker  * represented as macro invocations. There are both C and C++ files which
20*b7c941bbSAndroid Build Coastguard Worker  * include this file. A #if at the top of this file (immediately below)
21*b7c941bbSAndroid Build Coastguard Worker  * detects which language is being used and defines macros accordingly.
22*b7c941bbSAndroid Build Coastguard Worker  *
23*b7c941bbSAndroid Build Coastguard Worker  * This file also defines a static method called runAllTests(), which
24*b7c941bbSAndroid Build Coastguard Worker  * does what it says.
25*b7c941bbSAndroid Build Coastguard Worker  */
26*b7c941bbSAndroid Build Coastguard Worker 
27*b7c941bbSAndroid Build Coastguard Worker #ifndef INCLUDED_FROM_WRAPPER
28*b7c941bbSAndroid Build Coastguard Worker #error "This file should only be compiled by including it from a wrapper file."
29*b7c941bbSAndroid Build Coastguard Worker #endif
30*b7c941bbSAndroid Build Coastguard Worker 
31*b7c941bbSAndroid Build Coastguard Worker #include "helper.h"
32*b7c941bbSAndroid Build Coastguard Worker #include <inttypes.h>
33*b7c941bbSAndroid Build Coastguard Worker #include <stdbool.h>
34*b7c941bbSAndroid Build Coastguard Worker #include <stdlib.h>
35*b7c941bbSAndroid Build Coastguard Worker #include <string.h>
36*b7c941bbSAndroid Build Coastguard Worker 
37*b7c941bbSAndroid Build Coastguard Worker 
38*b7c941bbSAndroid Build Coastguard Worker /** reference to test class {@code InstanceFromNative} */
39*b7c941bbSAndroid Build Coastguard Worker static jclass InstanceFromNative;
40*b7c941bbSAndroid Build Coastguard Worker 
41*b7c941bbSAndroid Build Coastguard Worker /** reference to test class {@code StaticFromNative} */
42*b7c941bbSAndroid Build Coastguard Worker static jclass StaticFromNative;
43*b7c941bbSAndroid Build Coastguard Worker 
44*b7c941bbSAndroid Build Coastguard Worker /** reference to field {@code InstanceFromNative.theOne} */
45*b7c941bbSAndroid Build Coastguard Worker static jfieldID InstanceFromNative_theOne;
46*b7c941bbSAndroid Build Coastguard Worker 
47*b7c941bbSAndroid Build Coastguard Worker /** reference to string {@code "biscuits"} */
48*b7c941bbSAndroid Build Coastguard Worker static jstring biscuits;
49*b7c941bbSAndroid Build Coastguard Worker 
50*b7c941bbSAndroid Build Coastguard Worker /**
51*b7c941bbSAndroid Build Coastguard Worker  * how to call a method: (virtual, direct, static) x (standard, array of
52*b7c941bbSAndroid Build Coastguard Worker  * args, va_list) */
53*b7c941bbSAndroid Build Coastguard Worker typedef enum {
54*b7c941bbSAndroid Build Coastguard Worker     VIRTUAL_PLAIN, VIRTUAL_ARRAY, VIRTUAL_VA,
55*b7c941bbSAndroid Build Coastguard Worker     DIRECT_PLAIN, DIRECT_ARRAY, DIRECT_VA,
56*b7c941bbSAndroid Build Coastguard Worker     STATIC_PLAIN, STATIC_ARRAY, STATIC_VA,
57*b7c941bbSAndroid Build Coastguard Worker } callType;
58*b7c941bbSAndroid Build Coastguard Worker 
59*b7c941bbSAndroid Build Coastguard Worker /*
60*b7c941bbSAndroid Build Coastguard Worker  * CALL() calls the JNI function with the given name, using a JNIEnv
61*b7c941bbSAndroid Build Coastguard Worker  * pointer named "env", and passing along any other arguments given.
62*b7c941bbSAndroid Build Coastguard Worker  */
63*b7c941bbSAndroid Build Coastguard Worker #ifdef __cplusplus
64*b7c941bbSAndroid Build Coastguard Worker #define CALL(name, args...) env->name(args)
65*b7c941bbSAndroid Build Coastguard Worker #else
66*b7c941bbSAndroid Build Coastguard Worker /*
67*b7c941bbSAndroid Build Coastguard Worker  * Note: The space before the comma below is significant with respect to
68*b7c941bbSAndroid Build Coastguard Worker  * the processing of the ## operator.
69*b7c941bbSAndroid Build Coastguard Worker  */
70*b7c941bbSAndroid Build Coastguard Worker #define CALL(name, args...) (*env)->name(env , ## args)
71*b7c941bbSAndroid Build Coastguard Worker #endif
72*b7c941bbSAndroid Build Coastguard Worker 
73*b7c941bbSAndroid Build Coastguard Worker 
74*b7c941bbSAndroid Build Coastguard Worker /**
75*b7c941bbSAndroid Build Coastguard Worker  * Simple assert-like macro which returns NULL if the two values are
76*b7c941bbSAndroid Build Coastguard Worker  * equal, or an error message if they aren't.
77*b7c941bbSAndroid Build Coastguard Worker  */
78*b7c941bbSAndroid Build Coastguard Worker #define FAIL_IF_UNEQUAL(printfType, expected, actual)          \
79*b7c941bbSAndroid Build Coastguard Worker     ((expected) == (actual)) ? NULL :                          \
80*b7c941bbSAndroid Build Coastguard Worker         failure("expected " printfType " but got " printfType, \
81*b7c941bbSAndroid Build Coastguard Worker                 expected, actual);
82*b7c941bbSAndroid Build Coastguard Worker 
83*b7c941bbSAndroid Build Coastguard Worker 
84*b7c941bbSAndroid Build Coastguard Worker /**
85*b7c941bbSAndroid Build Coastguard Worker  * Initializes the static variables. Returns NULL on success or an
86*b7c941bbSAndroid Build Coastguard Worker  * error string on failure.
87*b7c941bbSAndroid Build Coastguard Worker  */
initializeVariables(JNIEnv * env)88*b7c941bbSAndroid Build Coastguard Worker static char *initializeVariables(JNIEnv *env) {
89*b7c941bbSAndroid Build Coastguard Worker     jclass clazz;
90*b7c941bbSAndroid Build Coastguard Worker     jfieldID field;
91*b7c941bbSAndroid Build Coastguard Worker 
92*b7c941bbSAndroid Build Coastguard Worker     clazz = CALL(FindClass, "android/jni/cts/StaticFromNative");
93*b7c941bbSAndroid Build Coastguard Worker     if (clazz == NULL) {
94*b7c941bbSAndroid Build Coastguard Worker         return failure("could not find StaticFromNative");
95*b7c941bbSAndroid Build Coastguard Worker     }
96*b7c941bbSAndroid Build Coastguard Worker 
97*b7c941bbSAndroid Build Coastguard Worker     StaticFromNative = (jclass) CALL(NewGlobalRef, clazz);
98*b7c941bbSAndroid Build Coastguard Worker 
99*b7c941bbSAndroid Build Coastguard Worker     clazz = CALL(FindClass, "android/jni/cts/InstanceFromNative");
100*b7c941bbSAndroid Build Coastguard Worker     if (clazz == NULL) {
101*b7c941bbSAndroid Build Coastguard Worker         return failure("could not find InstanceFromNative");
102*b7c941bbSAndroid Build Coastguard Worker     }
103*b7c941bbSAndroid Build Coastguard Worker 
104*b7c941bbSAndroid Build Coastguard Worker     InstanceFromNative = (jclass) CALL(NewGlobalRef, clazz);
105*b7c941bbSAndroid Build Coastguard Worker 
106*b7c941bbSAndroid Build Coastguard Worker     field = CALL(GetStaticFieldID, InstanceFromNative, "theOne",
107*b7c941bbSAndroid Build Coastguard Worker             "Landroid/jni/cts/InstanceFromNative;");
108*b7c941bbSAndroid Build Coastguard Worker     if (field == NULL) {
109*b7c941bbSAndroid Build Coastguard Worker         return failure("could not find InstanceFromNative.theOne");
110*b7c941bbSAndroid Build Coastguard Worker     }
111*b7c941bbSAndroid Build Coastguard Worker 
112*b7c941bbSAndroid Build Coastguard Worker     InstanceFromNative_theOne = field;
113*b7c941bbSAndroid Build Coastguard Worker 
114*b7c941bbSAndroid Build Coastguard Worker     biscuits = CALL(NewStringUTF, "biscuits");
115*b7c941bbSAndroid Build Coastguard Worker     if (biscuits == NULL) {
116*b7c941bbSAndroid Build Coastguard Worker         return failure("could not construct string");
117*b7c941bbSAndroid Build Coastguard Worker     }
118*b7c941bbSAndroid Build Coastguard Worker 
119*b7c941bbSAndroid Build Coastguard Worker     biscuits = (jstring) CALL(NewGlobalRef, biscuits);
120*b7c941bbSAndroid Build Coastguard Worker 
121*b7c941bbSAndroid Build Coastguard Worker     return NULL;
122*b7c941bbSAndroid Build Coastguard Worker }
123*b7c941bbSAndroid Build Coastguard Worker 
124*b7c941bbSAndroid Build Coastguard Worker /**
125*b7c941bbSAndroid Build Coastguard Worker  * Gets the standard instance of InstanceFromNative.
126*b7c941bbSAndroid Build Coastguard Worker  */
getStandardInstance(JNIEnv * env)127*b7c941bbSAndroid Build Coastguard Worker static jobject getStandardInstance(JNIEnv *env) {
128*b7c941bbSAndroid Build Coastguard Worker     return CALL(GetStaticObjectField, InstanceFromNative,
129*b7c941bbSAndroid Build Coastguard Worker             InstanceFromNative_theOne);
130*b7c941bbSAndroid Build Coastguard Worker }
131*b7c941bbSAndroid Build Coastguard Worker 
132*b7c941bbSAndroid Build Coastguard Worker /**
133*b7c941bbSAndroid Build Coastguard Worker  * Looks up a static method on StaticFromNative.
134*b7c941bbSAndroid Build Coastguard Worker  */
findStaticMethod(JNIEnv * env,char ** errorMsg,const char * name,const char * sig)135*b7c941bbSAndroid Build Coastguard Worker static jmethodID findStaticMethod(JNIEnv *env, char **errorMsg,
136*b7c941bbSAndroid Build Coastguard Worker         const char *name, const char *sig) {
137*b7c941bbSAndroid Build Coastguard Worker     jmethodID result = CALL(GetStaticMethodID, StaticFromNative,
138*b7c941bbSAndroid Build Coastguard Worker             name, sig);
139*b7c941bbSAndroid Build Coastguard Worker 
140*b7c941bbSAndroid Build Coastguard Worker     if (result == NULL) {
141*b7c941bbSAndroid Build Coastguard Worker         *errorMsg = failure("could not find static test method %s:%s",
142*b7c941bbSAndroid Build Coastguard Worker                 name, sig);
143*b7c941bbSAndroid Build Coastguard Worker     }
144*b7c941bbSAndroid Build Coastguard Worker 
145*b7c941bbSAndroid Build Coastguard Worker     return result;
146*b7c941bbSAndroid Build Coastguard Worker }
147*b7c941bbSAndroid Build Coastguard Worker 
148*b7c941bbSAndroid Build Coastguard Worker /**
149*b7c941bbSAndroid Build Coastguard Worker  * Looks up an instance method on InstanceFromNative.
150*b7c941bbSAndroid Build Coastguard Worker  */
findInstanceMethod(JNIEnv * env,char ** errorMsg,const char * name,const char * sig)151*b7c941bbSAndroid Build Coastguard Worker static jmethodID findInstanceMethod(JNIEnv *env, char **errorMsg,
152*b7c941bbSAndroid Build Coastguard Worker         const char *name, const char *sig) {
153*b7c941bbSAndroid Build Coastguard Worker     jmethodID result = CALL(GetMethodID, InstanceFromNative, name, sig);
154*b7c941bbSAndroid Build Coastguard Worker 
155*b7c941bbSAndroid Build Coastguard Worker     if (result == NULL) {
156*b7c941bbSAndroid Build Coastguard Worker         *errorMsg = failure("could not find instance test method %s:%s",
157*b7c941bbSAndroid Build Coastguard Worker                 name, sig);
158*b7c941bbSAndroid Build Coastguard Worker     }
159*b7c941bbSAndroid Build Coastguard Worker 
160*b7c941bbSAndroid Build Coastguard Worker     return result;
161*b7c941bbSAndroid Build Coastguard Worker }
162*b7c941bbSAndroid Build Coastguard Worker 
163*b7c941bbSAndroid Build Coastguard Worker /**
164*b7c941bbSAndroid Build Coastguard Worker  * Looks up either an instance method on InstanceFromNative or a
165*b7c941bbSAndroid Build Coastguard Worker  * static method on StaticFromNative, depending on the given
166*b7c941bbSAndroid Build Coastguard Worker  * call type.
167*b7c941bbSAndroid Build Coastguard Worker  */
findAppropriateMethod(JNIEnv * env,char ** errorMsg,callType ct,const char * name,const char * sig)168*b7c941bbSAndroid Build Coastguard Worker static jmethodID findAppropriateMethod(JNIEnv *env, char **errorMsg,
169*b7c941bbSAndroid Build Coastguard Worker         callType ct, const char *name, const char *sig) {
170*b7c941bbSAndroid Build Coastguard Worker     if ((ct == STATIC_PLAIN) || (ct == STATIC_ARRAY) ||
171*b7c941bbSAndroid Build Coastguard Worker             (ct == STATIC_VA)) {
172*b7c941bbSAndroid Build Coastguard Worker         return findStaticMethod(env, errorMsg, name, sig);
173*b7c941bbSAndroid Build Coastguard Worker     } else {
174*b7c941bbSAndroid Build Coastguard Worker         return findInstanceMethod(env, errorMsg, name, sig);
175*b7c941bbSAndroid Build Coastguard Worker     }
176*b7c941bbSAndroid Build Coastguard Worker }
177*b7c941bbSAndroid Build Coastguard Worker 
178*b7c941bbSAndroid Build Coastguard Worker 
179*b7c941bbSAndroid Build Coastguard Worker /*
180*b7c941bbSAndroid Build Coastguard Worker  * The tests.
181*b7c941bbSAndroid Build Coastguard Worker  */
182*b7c941bbSAndroid Build Coastguard Worker 
183*b7c941bbSAndroid Build Coastguard Worker // TODO: Missing functions:
184*b7c941bbSAndroid Build Coastguard Worker //   AllocObject
185*b7c941bbSAndroid Build Coastguard Worker 
help_CallBooleanMethod(JNIEnv * env,int ct,...)186*b7c941bbSAndroid Build Coastguard Worker static char *help_CallBooleanMethod(JNIEnv *env, int ct, ...) {
187*b7c941bbSAndroid Build Coastguard Worker     va_list args;
188*b7c941bbSAndroid Build Coastguard Worker     va_start(args, ct);
189*b7c941bbSAndroid Build Coastguard Worker 
190*b7c941bbSAndroid Build Coastguard Worker     char *msg;
191*b7c941bbSAndroid Build Coastguard Worker     jobject o = getStandardInstance(env);
192*b7c941bbSAndroid Build Coastguard Worker     jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
193*b7c941bbSAndroid Build Coastguard Worker             "returnBoolean", "()Z");
194*b7c941bbSAndroid Build Coastguard Worker 
195*b7c941bbSAndroid Build Coastguard Worker     if (method == NULL) {
196*b7c941bbSAndroid Build Coastguard Worker         va_end(args);
197*b7c941bbSAndroid Build Coastguard Worker         return msg;
198*b7c941bbSAndroid Build Coastguard Worker     }
199*b7c941bbSAndroid Build Coastguard Worker 
200*b7c941bbSAndroid Build Coastguard Worker     jboolean result;
201*b7c941bbSAndroid Build Coastguard Worker 
202*b7c941bbSAndroid Build Coastguard Worker     switch (ct) {
203*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_PLAIN: {
204*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallBooleanMethod, o, method);
205*b7c941bbSAndroid Build Coastguard Worker             break;
206*b7c941bbSAndroid Build Coastguard Worker         }
207*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_ARRAY: {
208*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallBooleanMethodA, o, method, NULL);
209*b7c941bbSAndroid Build Coastguard Worker             break;
210*b7c941bbSAndroid Build Coastguard Worker         }
211*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_VA: {
212*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallBooleanMethodV, o, method, args);
213*b7c941bbSAndroid Build Coastguard Worker             break;
214*b7c941bbSAndroid Build Coastguard Worker         }
215*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_PLAIN: {
216*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualBooleanMethod, o, InstanceFromNative,
217*b7c941bbSAndroid Build Coastguard Worker                     method);
218*b7c941bbSAndroid Build Coastguard Worker             break;
219*b7c941bbSAndroid Build Coastguard Worker         }
220*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_ARRAY: {
221*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualBooleanMethodA, o, InstanceFromNative,
222*b7c941bbSAndroid Build Coastguard Worker                     method, NULL);
223*b7c941bbSAndroid Build Coastguard Worker             break;
224*b7c941bbSAndroid Build Coastguard Worker         }
225*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_VA: {
226*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualBooleanMethodV, o, InstanceFromNative,
227*b7c941bbSAndroid Build Coastguard Worker                     method, args);
228*b7c941bbSAndroid Build Coastguard Worker             break;
229*b7c941bbSAndroid Build Coastguard Worker         }
230*b7c941bbSAndroid Build Coastguard Worker         case STATIC_PLAIN: {
231*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticBooleanMethod, StaticFromNative, method);
232*b7c941bbSAndroid Build Coastguard Worker             break;
233*b7c941bbSAndroid Build Coastguard Worker         }
234*b7c941bbSAndroid Build Coastguard Worker         case STATIC_ARRAY: {
235*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticBooleanMethodA, StaticFromNative, method,
236*b7c941bbSAndroid Build Coastguard Worker                     NULL);
237*b7c941bbSAndroid Build Coastguard Worker             break;
238*b7c941bbSAndroid Build Coastguard Worker         }
239*b7c941bbSAndroid Build Coastguard Worker         case STATIC_VA: {
240*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticBooleanMethodV, StaticFromNative, method,
241*b7c941bbSAndroid Build Coastguard Worker                     args);
242*b7c941bbSAndroid Build Coastguard Worker             break;
243*b7c941bbSAndroid Build Coastguard Worker         }
244*b7c941bbSAndroid Build Coastguard Worker         default: {
245*b7c941bbSAndroid Build Coastguard Worker             va_end(args);
246*b7c941bbSAndroid Build Coastguard Worker             return failure("shouldn't happen");
247*b7c941bbSAndroid Build Coastguard Worker         }
248*b7c941bbSAndroid Build Coastguard Worker     }
249*b7c941bbSAndroid Build Coastguard Worker 
250*b7c941bbSAndroid Build Coastguard Worker     va_end(args);
251*b7c941bbSAndroid Build Coastguard Worker 
252*b7c941bbSAndroid Build Coastguard Worker     return FAIL_IF_UNEQUAL("%d", true, result);
253*b7c941bbSAndroid Build Coastguard Worker }
254*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallBooleanMethod)255*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallBooleanMethod) {
256*b7c941bbSAndroid Build Coastguard Worker     return help_CallBooleanMethod(env, VIRTUAL_PLAIN);
257*b7c941bbSAndroid Build Coastguard Worker }
258*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallBooleanMethodA)259*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallBooleanMethodA) {
260*b7c941bbSAndroid Build Coastguard Worker     return help_CallBooleanMethod(env, VIRTUAL_ARRAY);
261*b7c941bbSAndroid Build Coastguard Worker }
262*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallBooleanMethodV)263*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallBooleanMethodV) {
264*b7c941bbSAndroid Build Coastguard Worker     return help_CallBooleanMethod(env, VIRTUAL_VA);
265*b7c941bbSAndroid Build Coastguard Worker }
266*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualBooleanMethod)267*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualBooleanMethod) {
268*b7c941bbSAndroid Build Coastguard Worker     return help_CallBooleanMethod(env, DIRECT_PLAIN);
269*b7c941bbSAndroid Build Coastguard Worker }
270*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualBooleanMethodA)271*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualBooleanMethodA) {
272*b7c941bbSAndroid Build Coastguard Worker     return help_CallBooleanMethod(env, DIRECT_ARRAY);
273*b7c941bbSAndroid Build Coastguard Worker }
274*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualBooleanMethodV)275*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualBooleanMethodV) {
276*b7c941bbSAndroid Build Coastguard Worker     return help_CallBooleanMethod(env, DIRECT_VA);
277*b7c941bbSAndroid Build Coastguard Worker }
278*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticBooleanMethod)279*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticBooleanMethod) {
280*b7c941bbSAndroid Build Coastguard Worker     return help_CallBooleanMethod(env, STATIC_PLAIN);
281*b7c941bbSAndroid Build Coastguard Worker }
282*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticBooleanMethodA)283*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticBooleanMethodA) {
284*b7c941bbSAndroid Build Coastguard Worker     return help_CallBooleanMethod(env, STATIC_ARRAY);
285*b7c941bbSAndroid Build Coastguard Worker }
286*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticBooleanMethodV)287*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticBooleanMethodV) {
288*b7c941bbSAndroid Build Coastguard Worker     return help_CallBooleanMethod(env, STATIC_VA);
289*b7c941bbSAndroid Build Coastguard Worker }
290*b7c941bbSAndroid Build Coastguard Worker 
help_CallByteMethod(JNIEnv * env,int ct,...)291*b7c941bbSAndroid Build Coastguard Worker static char *help_CallByteMethod(JNIEnv *env, int ct, ...) {
292*b7c941bbSAndroid Build Coastguard Worker     va_list args;
293*b7c941bbSAndroid Build Coastguard Worker     va_start(args, ct);
294*b7c941bbSAndroid Build Coastguard Worker 
295*b7c941bbSAndroid Build Coastguard Worker     char *msg;
296*b7c941bbSAndroid Build Coastguard Worker     jobject o = getStandardInstance(env);
297*b7c941bbSAndroid Build Coastguard Worker     jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
298*b7c941bbSAndroid Build Coastguard Worker             "returnByte", "()B");
299*b7c941bbSAndroid Build Coastguard Worker 
300*b7c941bbSAndroid Build Coastguard Worker     if (method == NULL) {
301*b7c941bbSAndroid Build Coastguard Worker         va_end(args);
302*b7c941bbSAndroid Build Coastguard Worker         return msg;
303*b7c941bbSAndroid Build Coastguard Worker     }
304*b7c941bbSAndroid Build Coastguard Worker 
305*b7c941bbSAndroid Build Coastguard Worker     jbyte result;
306*b7c941bbSAndroid Build Coastguard Worker 
307*b7c941bbSAndroid Build Coastguard Worker     switch (ct) {
308*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_PLAIN: {
309*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallByteMethod, o, method);
310*b7c941bbSAndroid Build Coastguard Worker             break;
311*b7c941bbSAndroid Build Coastguard Worker         }
312*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_ARRAY: {
313*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallByteMethodA, o, method, NULL);
314*b7c941bbSAndroid Build Coastguard Worker             break;
315*b7c941bbSAndroid Build Coastguard Worker         }
316*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_VA: {
317*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallByteMethodV, o, method, args);
318*b7c941bbSAndroid Build Coastguard Worker             break;
319*b7c941bbSAndroid Build Coastguard Worker         }
320*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_PLAIN: {
321*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualByteMethod, o, InstanceFromNative,
322*b7c941bbSAndroid Build Coastguard Worker                     method);
323*b7c941bbSAndroid Build Coastguard Worker             break;
324*b7c941bbSAndroid Build Coastguard Worker         }
325*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_ARRAY: {
326*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualByteMethodA, o, InstanceFromNative,
327*b7c941bbSAndroid Build Coastguard Worker                     method, NULL);
328*b7c941bbSAndroid Build Coastguard Worker             break;
329*b7c941bbSAndroid Build Coastguard Worker         }
330*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_VA: {
331*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualByteMethodV, o, InstanceFromNative,
332*b7c941bbSAndroid Build Coastguard Worker                     method, args);
333*b7c941bbSAndroid Build Coastguard Worker             break;
334*b7c941bbSAndroid Build Coastguard Worker         }
335*b7c941bbSAndroid Build Coastguard Worker         case STATIC_PLAIN: {
336*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticByteMethod, StaticFromNative, method);
337*b7c941bbSAndroid Build Coastguard Worker             break;
338*b7c941bbSAndroid Build Coastguard Worker         }
339*b7c941bbSAndroid Build Coastguard Worker         case STATIC_ARRAY: {
340*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticByteMethodA, StaticFromNative, method,
341*b7c941bbSAndroid Build Coastguard Worker                     NULL);
342*b7c941bbSAndroid Build Coastguard Worker             break;
343*b7c941bbSAndroid Build Coastguard Worker         }
344*b7c941bbSAndroid Build Coastguard Worker         case STATIC_VA: {
345*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticByteMethodV, StaticFromNative, method,
346*b7c941bbSAndroid Build Coastguard Worker                     args);
347*b7c941bbSAndroid Build Coastguard Worker             break;
348*b7c941bbSAndroid Build Coastguard Worker         }
349*b7c941bbSAndroid Build Coastguard Worker         default: {
350*b7c941bbSAndroid Build Coastguard Worker             va_end(args);
351*b7c941bbSAndroid Build Coastguard Worker             return failure("shouldn't happen");
352*b7c941bbSAndroid Build Coastguard Worker         }
353*b7c941bbSAndroid Build Coastguard Worker     }
354*b7c941bbSAndroid Build Coastguard Worker 
355*b7c941bbSAndroid Build Coastguard Worker     va_end(args);
356*b7c941bbSAndroid Build Coastguard Worker 
357*b7c941bbSAndroid Build Coastguard Worker     return FAIL_IF_UNEQUAL("%d", 14, result);
358*b7c941bbSAndroid Build Coastguard Worker }
359*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallByteMethod)360*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallByteMethod) {
361*b7c941bbSAndroid Build Coastguard Worker     return help_CallByteMethod(env, VIRTUAL_PLAIN);
362*b7c941bbSAndroid Build Coastguard Worker }
363*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallByteMethodA)364*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallByteMethodA) {
365*b7c941bbSAndroid Build Coastguard Worker     return help_CallByteMethod(env, VIRTUAL_ARRAY);
366*b7c941bbSAndroid Build Coastguard Worker }
367*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallByteMethodV)368*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallByteMethodV) {
369*b7c941bbSAndroid Build Coastguard Worker     return help_CallByteMethod(env, VIRTUAL_VA);
370*b7c941bbSAndroid Build Coastguard Worker }
371*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualByteMethod)372*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualByteMethod) {
373*b7c941bbSAndroid Build Coastguard Worker     return help_CallByteMethod(env, DIRECT_PLAIN);
374*b7c941bbSAndroid Build Coastguard Worker }
375*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualByteMethodA)376*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualByteMethodA) {
377*b7c941bbSAndroid Build Coastguard Worker     return help_CallByteMethod(env, DIRECT_ARRAY);
378*b7c941bbSAndroid Build Coastguard Worker }
379*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualByteMethodV)380*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualByteMethodV) {
381*b7c941bbSAndroid Build Coastguard Worker     return help_CallByteMethod(env, DIRECT_VA);
382*b7c941bbSAndroid Build Coastguard Worker }
383*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticByteMethod)384*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticByteMethod) {
385*b7c941bbSAndroid Build Coastguard Worker     return help_CallByteMethod(env, STATIC_PLAIN);
386*b7c941bbSAndroid Build Coastguard Worker }
387*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticByteMethodA)388*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticByteMethodA) {
389*b7c941bbSAndroid Build Coastguard Worker     return help_CallByteMethod(env, STATIC_ARRAY);
390*b7c941bbSAndroid Build Coastguard Worker }
391*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticByteMethodV)392*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticByteMethodV) {
393*b7c941bbSAndroid Build Coastguard Worker     return help_CallByteMethod(env, STATIC_VA);
394*b7c941bbSAndroid Build Coastguard Worker }
395*b7c941bbSAndroid Build Coastguard Worker 
help_CallShortMethod(JNIEnv * env,int ct,...)396*b7c941bbSAndroid Build Coastguard Worker static char *help_CallShortMethod(JNIEnv *env, int ct, ...) {
397*b7c941bbSAndroid Build Coastguard Worker     va_list args;
398*b7c941bbSAndroid Build Coastguard Worker     va_start(args, ct);
399*b7c941bbSAndroid Build Coastguard Worker 
400*b7c941bbSAndroid Build Coastguard Worker     char *msg;
401*b7c941bbSAndroid Build Coastguard Worker     jobject o = getStandardInstance(env);
402*b7c941bbSAndroid Build Coastguard Worker     jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
403*b7c941bbSAndroid Build Coastguard Worker             "returnShort", "()S");
404*b7c941bbSAndroid Build Coastguard Worker 
405*b7c941bbSAndroid Build Coastguard Worker     if (method == NULL) {
406*b7c941bbSAndroid Build Coastguard Worker         va_end(args);
407*b7c941bbSAndroid Build Coastguard Worker         return msg;
408*b7c941bbSAndroid Build Coastguard Worker     }
409*b7c941bbSAndroid Build Coastguard Worker 
410*b7c941bbSAndroid Build Coastguard Worker     jshort result;
411*b7c941bbSAndroid Build Coastguard Worker 
412*b7c941bbSAndroid Build Coastguard Worker     switch (ct) {
413*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_PLAIN: {
414*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallShortMethod, o, method);
415*b7c941bbSAndroid Build Coastguard Worker             break;
416*b7c941bbSAndroid Build Coastguard Worker         }
417*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_ARRAY: {
418*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallShortMethodA, o, method, NULL);
419*b7c941bbSAndroid Build Coastguard Worker             break;
420*b7c941bbSAndroid Build Coastguard Worker         }
421*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_VA: {
422*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallShortMethodV, o, method, args);
423*b7c941bbSAndroid Build Coastguard Worker             break;
424*b7c941bbSAndroid Build Coastguard Worker         }
425*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_PLAIN: {
426*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualShortMethod, o, InstanceFromNative,
427*b7c941bbSAndroid Build Coastguard Worker                     method);
428*b7c941bbSAndroid Build Coastguard Worker             break;
429*b7c941bbSAndroid Build Coastguard Worker         }
430*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_ARRAY: {
431*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualShortMethodA, o, InstanceFromNative,
432*b7c941bbSAndroid Build Coastguard Worker                     method, NULL);
433*b7c941bbSAndroid Build Coastguard Worker             break;
434*b7c941bbSAndroid Build Coastguard Worker         }
435*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_VA: {
436*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualShortMethodV, o, InstanceFromNative,
437*b7c941bbSAndroid Build Coastguard Worker                     method, args);
438*b7c941bbSAndroid Build Coastguard Worker             break;
439*b7c941bbSAndroid Build Coastguard Worker         }
440*b7c941bbSAndroid Build Coastguard Worker         case STATIC_PLAIN: {
441*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticShortMethod, StaticFromNative, method);
442*b7c941bbSAndroid Build Coastguard Worker             break;
443*b7c941bbSAndroid Build Coastguard Worker         }
444*b7c941bbSAndroid Build Coastguard Worker         case STATIC_ARRAY: {
445*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticShortMethodA, StaticFromNative, method,
446*b7c941bbSAndroid Build Coastguard Worker                     NULL);
447*b7c941bbSAndroid Build Coastguard Worker             break;
448*b7c941bbSAndroid Build Coastguard Worker         }
449*b7c941bbSAndroid Build Coastguard Worker         case STATIC_VA: {
450*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticShortMethodV, StaticFromNative, method,
451*b7c941bbSAndroid Build Coastguard Worker                     args);
452*b7c941bbSAndroid Build Coastguard Worker             break;
453*b7c941bbSAndroid Build Coastguard Worker         }
454*b7c941bbSAndroid Build Coastguard Worker         default: {
455*b7c941bbSAndroid Build Coastguard Worker             va_end(args);
456*b7c941bbSAndroid Build Coastguard Worker             return failure("shouldn't happen");
457*b7c941bbSAndroid Build Coastguard Worker         }
458*b7c941bbSAndroid Build Coastguard Worker     }
459*b7c941bbSAndroid Build Coastguard Worker 
460*b7c941bbSAndroid Build Coastguard Worker     va_end(args);
461*b7c941bbSAndroid Build Coastguard Worker 
462*b7c941bbSAndroid Build Coastguard Worker     return FAIL_IF_UNEQUAL("%d", -608, result);
463*b7c941bbSAndroid Build Coastguard Worker }
464*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallShortMethod)465*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallShortMethod) {
466*b7c941bbSAndroid Build Coastguard Worker     return help_CallShortMethod(env, VIRTUAL_PLAIN);
467*b7c941bbSAndroid Build Coastguard Worker }
468*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallShortMethodA)469*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallShortMethodA) {
470*b7c941bbSAndroid Build Coastguard Worker     return help_CallShortMethod(env, VIRTUAL_ARRAY);
471*b7c941bbSAndroid Build Coastguard Worker }
472*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallShortMethodV)473*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallShortMethodV) {
474*b7c941bbSAndroid Build Coastguard Worker     return help_CallShortMethod(env, VIRTUAL_VA);
475*b7c941bbSAndroid Build Coastguard Worker }
476*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualShortMethod)477*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualShortMethod) {
478*b7c941bbSAndroid Build Coastguard Worker     return help_CallShortMethod(env, DIRECT_PLAIN);
479*b7c941bbSAndroid Build Coastguard Worker }
480*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualShortMethodA)481*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualShortMethodA) {
482*b7c941bbSAndroid Build Coastguard Worker     return help_CallShortMethod(env, DIRECT_ARRAY);
483*b7c941bbSAndroid Build Coastguard Worker }
484*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualShortMethodV)485*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualShortMethodV) {
486*b7c941bbSAndroid Build Coastguard Worker     return help_CallShortMethod(env, DIRECT_VA);
487*b7c941bbSAndroid Build Coastguard Worker }
488*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticShortMethod)489*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticShortMethod) {
490*b7c941bbSAndroid Build Coastguard Worker     return help_CallShortMethod(env, STATIC_PLAIN);
491*b7c941bbSAndroid Build Coastguard Worker }
492*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticShortMethodA)493*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticShortMethodA) {
494*b7c941bbSAndroid Build Coastguard Worker     return help_CallShortMethod(env, STATIC_ARRAY);
495*b7c941bbSAndroid Build Coastguard Worker }
496*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticShortMethodV)497*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticShortMethodV) {
498*b7c941bbSAndroid Build Coastguard Worker     return help_CallShortMethod(env, STATIC_VA);
499*b7c941bbSAndroid Build Coastguard Worker }
500*b7c941bbSAndroid Build Coastguard Worker 
help_CallCharMethod(JNIEnv * env,int ct,...)501*b7c941bbSAndroid Build Coastguard Worker static char *help_CallCharMethod(JNIEnv *env, int ct, ...) {
502*b7c941bbSAndroid Build Coastguard Worker     va_list args;
503*b7c941bbSAndroid Build Coastguard Worker     va_start(args, ct);
504*b7c941bbSAndroid Build Coastguard Worker 
505*b7c941bbSAndroid Build Coastguard Worker     char *msg;
506*b7c941bbSAndroid Build Coastguard Worker     jobject o = getStandardInstance(env);
507*b7c941bbSAndroid Build Coastguard Worker     jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
508*b7c941bbSAndroid Build Coastguard Worker             "returnChar", "()C");
509*b7c941bbSAndroid Build Coastguard Worker 
510*b7c941bbSAndroid Build Coastguard Worker     if (method == NULL) {
511*b7c941bbSAndroid Build Coastguard Worker         va_end(args);
512*b7c941bbSAndroid Build Coastguard Worker         return msg;
513*b7c941bbSAndroid Build Coastguard Worker     }
514*b7c941bbSAndroid Build Coastguard Worker 
515*b7c941bbSAndroid Build Coastguard Worker     jchar result;
516*b7c941bbSAndroid Build Coastguard Worker 
517*b7c941bbSAndroid Build Coastguard Worker     switch (ct) {
518*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_PLAIN: {
519*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallCharMethod, o, method);
520*b7c941bbSAndroid Build Coastguard Worker             break;
521*b7c941bbSAndroid Build Coastguard Worker         }
522*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_ARRAY: {
523*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallCharMethodA, o, method, NULL);
524*b7c941bbSAndroid Build Coastguard Worker             break;
525*b7c941bbSAndroid Build Coastguard Worker         }
526*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_VA: {
527*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallCharMethodV, o, method, args);
528*b7c941bbSAndroid Build Coastguard Worker             break;
529*b7c941bbSAndroid Build Coastguard Worker         }
530*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_PLAIN: {
531*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualCharMethod, o, InstanceFromNative,
532*b7c941bbSAndroid Build Coastguard Worker                     method);
533*b7c941bbSAndroid Build Coastguard Worker             break;
534*b7c941bbSAndroid Build Coastguard Worker         }
535*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_ARRAY: {
536*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualCharMethodA, o, InstanceFromNative,
537*b7c941bbSAndroid Build Coastguard Worker                     method, NULL);
538*b7c941bbSAndroid Build Coastguard Worker             break;
539*b7c941bbSAndroid Build Coastguard Worker         }
540*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_VA: {
541*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualCharMethodV, o, InstanceFromNative,
542*b7c941bbSAndroid Build Coastguard Worker                     method, args);
543*b7c941bbSAndroid Build Coastguard Worker             break;
544*b7c941bbSAndroid Build Coastguard Worker         }
545*b7c941bbSAndroid Build Coastguard Worker         case STATIC_PLAIN: {
546*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticCharMethod, StaticFromNative, method);
547*b7c941bbSAndroid Build Coastguard Worker             break;
548*b7c941bbSAndroid Build Coastguard Worker         }
549*b7c941bbSAndroid Build Coastguard Worker         case STATIC_ARRAY: {
550*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticCharMethodA, StaticFromNative, method,
551*b7c941bbSAndroid Build Coastguard Worker                     NULL);
552*b7c941bbSAndroid Build Coastguard Worker             break;
553*b7c941bbSAndroid Build Coastguard Worker         }
554*b7c941bbSAndroid Build Coastguard Worker         case STATIC_VA: {
555*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticCharMethodV, StaticFromNative, method,
556*b7c941bbSAndroid Build Coastguard Worker                     args);
557*b7c941bbSAndroid Build Coastguard Worker             break;
558*b7c941bbSAndroid Build Coastguard Worker         }
559*b7c941bbSAndroid Build Coastguard Worker         default: {
560*b7c941bbSAndroid Build Coastguard Worker             va_end(args);
561*b7c941bbSAndroid Build Coastguard Worker             return failure("shouldn't happen");
562*b7c941bbSAndroid Build Coastguard Worker         }
563*b7c941bbSAndroid Build Coastguard Worker     }
564*b7c941bbSAndroid Build Coastguard Worker 
565*b7c941bbSAndroid Build Coastguard Worker     va_end(args);
566*b7c941bbSAndroid Build Coastguard Worker 
567*b7c941bbSAndroid Build Coastguard Worker     return FAIL_IF_UNEQUAL("%d", 9000, result);
568*b7c941bbSAndroid Build Coastguard Worker }
569*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallCharMethod)570*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallCharMethod) {
571*b7c941bbSAndroid Build Coastguard Worker     return help_CallCharMethod(env, VIRTUAL_PLAIN);
572*b7c941bbSAndroid Build Coastguard Worker }
573*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallCharMethodA)574*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallCharMethodA) {
575*b7c941bbSAndroid Build Coastguard Worker     return help_CallCharMethod(env, VIRTUAL_ARRAY);
576*b7c941bbSAndroid Build Coastguard Worker }
577*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallCharMethodV)578*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallCharMethodV) {
579*b7c941bbSAndroid Build Coastguard Worker     return help_CallCharMethod(env, VIRTUAL_VA);
580*b7c941bbSAndroid Build Coastguard Worker }
581*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualCharMethod)582*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualCharMethod) {
583*b7c941bbSAndroid Build Coastguard Worker     return help_CallCharMethod(env, DIRECT_PLAIN);
584*b7c941bbSAndroid Build Coastguard Worker }
585*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualCharMethodA)586*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualCharMethodA) {
587*b7c941bbSAndroid Build Coastguard Worker     return help_CallCharMethod(env, DIRECT_ARRAY);
588*b7c941bbSAndroid Build Coastguard Worker }
589*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualCharMethodV)590*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualCharMethodV) {
591*b7c941bbSAndroid Build Coastguard Worker     return help_CallCharMethod(env, DIRECT_VA);
592*b7c941bbSAndroid Build Coastguard Worker }
593*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticCharMethod)594*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticCharMethod) {
595*b7c941bbSAndroid Build Coastguard Worker     return help_CallCharMethod(env, STATIC_PLAIN);
596*b7c941bbSAndroid Build Coastguard Worker }
597*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticCharMethodA)598*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticCharMethodA) {
599*b7c941bbSAndroid Build Coastguard Worker     return help_CallCharMethod(env, STATIC_ARRAY);
600*b7c941bbSAndroid Build Coastguard Worker }
601*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticCharMethodV)602*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticCharMethodV) {
603*b7c941bbSAndroid Build Coastguard Worker     return help_CallCharMethod(env, STATIC_VA);
604*b7c941bbSAndroid Build Coastguard Worker }
605*b7c941bbSAndroid Build Coastguard Worker 
help_CallIntMethod(JNIEnv * env,int ct,...)606*b7c941bbSAndroid Build Coastguard Worker static char *help_CallIntMethod(JNIEnv *env, int ct, ...) {
607*b7c941bbSAndroid Build Coastguard Worker     va_list args;
608*b7c941bbSAndroid Build Coastguard Worker     va_start(args, ct);
609*b7c941bbSAndroid Build Coastguard Worker 
610*b7c941bbSAndroid Build Coastguard Worker     char *msg;
611*b7c941bbSAndroid Build Coastguard Worker     jobject o = getStandardInstance(env);
612*b7c941bbSAndroid Build Coastguard Worker     jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
613*b7c941bbSAndroid Build Coastguard Worker             "returnInt", "()I");
614*b7c941bbSAndroid Build Coastguard Worker 
615*b7c941bbSAndroid Build Coastguard Worker     if (method == NULL) {
616*b7c941bbSAndroid Build Coastguard Worker         va_end(args);
617*b7c941bbSAndroid Build Coastguard Worker         return msg;
618*b7c941bbSAndroid Build Coastguard Worker     }
619*b7c941bbSAndroid Build Coastguard Worker 
620*b7c941bbSAndroid Build Coastguard Worker     jint result;
621*b7c941bbSAndroid Build Coastguard Worker 
622*b7c941bbSAndroid Build Coastguard Worker     switch (ct) {
623*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_PLAIN: {
624*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallIntMethod, o, method);
625*b7c941bbSAndroid Build Coastguard Worker             break;
626*b7c941bbSAndroid Build Coastguard Worker         }
627*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_ARRAY: {
628*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallIntMethodA, o, method, NULL);
629*b7c941bbSAndroid Build Coastguard Worker             break;
630*b7c941bbSAndroid Build Coastguard Worker         }
631*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_VA: {
632*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallIntMethodV, o, method, args);
633*b7c941bbSAndroid Build Coastguard Worker             break;
634*b7c941bbSAndroid Build Coastguard Worker         }
635*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_PLAIN: {
636*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualIntMethod, o, InstanceFromNative,
637*b7c941bbSAndroid Build Coastguard Worker                     method);
638*b7c941bbSAndroid Build Coastguard Worker             break;
639*b7c941bbSAndroid Build Coastguard Worker         }
640*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_ARRAY: {
641*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualIntMethodA, o, InstanceFromNative,
642*b7c941bbSAndroid Build Coastguard Worker                     method, NULL);
643*b7c941bbSAndroid Build Coastguard Worker             break;
644*b7c941bbSAndroid Build Coastguard Worker         }
645*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_VA: {
646*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualIntMethodV, o, InstanceFromNative,
647*b7c941bbSAndroid Build Coastguard Worker                     method, args);
648*b7c941bbSAndroid Build Coastguard Worker             break;
649*b7c941bbSAndroid Build Coastguard Worker         }
650*b7c941bbSAndroid Build Coastguard Worker         case STATIC_PLAIN: {
651*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticIntMethod, StaticFromNative, method);
652*b7c941bbSAndroid Build Coastguard Worker             break;
653*b7c941bbSAndroid Build Coastguard Worker         }
654*b7c941bbSAndroid Build Coastguard Worker         case STATIC_ARRAY: {
655*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticIntMethodA, StaticFromNative, method,
656*b7c941bbSAndroid Build Coastguard Worker                     NULL);
657*b7c941bbSAndroid Build Coastguard Worker             break;
658*b7c941bbSAndroid Build Coastguard Worker         }
659*b7c941bbSAndroid Build Coastguard Worker         case STATIC_VA: {
660*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticIntMethodV, StaticFromNative, method,
661*b7c941bbSAndroid Build Coastguard Worker                     args);
662*b7c941bbSAndroid Build Coastguard Worker             break;
663*b7c941bbSAndroid Build Coastguard Worker         }
664*b7c941bbSAndroid Build Coastguard Worker         default: {
665*b7c941bbSAndroid Build Coastguard Worker             va_end(args);
666*b7c941bbSAndroid Build Coastguard Worker             return failure("shouldn't happen");
667*b7c941bbSAndroid Build Coastguard Worker         }
668*b7c941bbSAndroid Build Coastguard Worker     }
669*b7c941bbSAndroid Build Coastguard Worker 
670*b7c941bbSAndroid Build Coastguard Worker     va_end(args);
671*b7c941bbSAndroid Build Coastguard Worker 
672*b7c941bbSAndroid Build Coastguard Worker     return FAIL_IF_UNEQUAL("%d", 4004004, result);
673*b7c941bbSAndroid Build Coastguard Worker }
674*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallIntMethod)675*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallIntMethod) {
676*b7c941bbSAndroid Build Coastguard Worker     return help_CallIntMethod(env, VIRTUAL_PLAIN);
677*b7c941bbSAndroid Build Coastguard Worker }
678*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallIntMethodA)679*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallIntMethodA) {
680*b7c941bbSAndroid Build Coastguard Worker     return help_CallIntMethod(env, VIRTUAL_ARRAY);
681*b7c941bbSAndroid Build Coastguard Worker }
682*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallIntMethodV)683*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallIntMethodV) {
684*b7c941bbSAndroid Build Coastguard Worker     return help_CallIntMethod(env, VIRTUAL_VA);
685*b7c941bbSAndroid Build Coastguard Worker }
686*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualIntMethod)687*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualIntMethod) {
688*b7c941bbSAndroid Build Coastguard Worker     return help_CallIntMethod(env, DIRECT_PLAIN);
689*b7c941bbSAndroid Build Coastguard Worker }
690*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualIntMethodA)691*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualIntMethodA) {
692*b7c941bbSAndroid Build Coastguard Worker     return help_CallIntMethod(env, DIRECT_ARRAY);
693*b7c941bbSAndroid Build Coastguard Worker }
694*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualIntMethodV)695*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualIntMethodV) {
696*b7c941bbSAndroid Build Coastguard Worker     return help_CallIntMethod(env, DIRECT_VA);
697*b7c941bbSAndroid Build Coastguard Worker }
698*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticIntMethod)699*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticIntMethod) {
700*b7c941bbSAndroid Build Coastguard Worker     return help_CallIntMethod(env, STATIC_PLAIN);
701*b7c941bbSAndroid Build Coastguard Worker }
702*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticIntMethodA)703*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticIntMethodA) {
704*b7c941bbSAndroid Build Coastguard Worker     return help_CallIntMethod(env, STATIC_ARRAY);
705*b7c941bbSAndroid Build Coastguard Worker }
706*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticIntMethodV)707*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticIntMethodV) {
708*b7c941bbSAndroid Build Coastguard Worker     return help_CallIntMethod(env, STATIC_VA);
709*b7c941bbSAndroid Build Coastguard Worker }
710*b7c941bbSAndroid Build Coastguard Worker 
help_CallLongMethod(JNIEnv * env,int ct,...)711*b7c941bbSAndroid Build Coastguard Worker static char *help_CallLongMethod(JNIEnv *env, int ct, ...) {
712*b7c941bbSAndroid Build Coastguard Worker     va_list args;
713*b7c941bbSAndroid Build Coastguard Worker     va_start(args, ct);
714*b7c941bbSAndroid Build Coastguard Worker 
715*b7c941bbSAndroid Build Coastguard Worker     char *msg;
716*b7c941bbSAndroid Build Coastguard Worker     jobject o = getStandardInstance(env);
717*b7c941bbSAndroid Build Coastguard Worker     jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
718*b7c941bbSAndroid Build Coastguard Worker             "returnLong", "()J");
719*b7c941bbSAndroid Build Coastguard Worker 
720*b7c941bbSAndroid Build Coastguard Worker     if (method == NULL) {
721*b7c941bbSAndroid Build Coastguard Worker         va_end(args);
722*b7c941bbSAndroid Build Coastguard Worker         return msg;
723*b7c941bbSAndroid Build Coastguard Worker     }
724*b7c941bbSAndroid Build Coastguard Worker 
725*b7c941bbSAndroid Build Coastguard Worker     jlong result;
726*b7c941bbSAndroid Build Coastguard Worker 
727*b7c941bbSAndroid Build Coastguard Worker     switch (ct) {
728*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_PLAIN: {
729*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallLongMethod, o, method);
730*b7c941bbSAndroid Build Coastguard Worker             break;
731*b7c941bbSAndroid Build Coastguard Worker         }
732*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_ARRAY: {
733*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallLongMethodA, o, method, NULL);
734*b7c941bbSAndroid Build Coastguard Worker             break;
735*b7c941bbSAndroid Build Coastguard Worker         }
736*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_VA: {
737*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallLongMethodV, o, method, args);
738*b7c941bbSAndroid Build Coastguard Worker             break;
739*b7c941bbSAndroid Build Coastguard Worker         }
740*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_PLAIN: {
741*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualLongMethod, o, InstanceFromNative,
742*b7c941bbSAndroid Build Coastguard Worker                     method);
743*b7c941bbSAndroid Build Coastguard Worker             break;
744*b7c941bbSAndroid Build Coastguard Worker         }
745*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_ARRAY: {
746*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualLongMethodA, o, InstanceFromNative,
747*b7c941bbSAndroid Build Coastguard Worker                     method, NULL);
748*b7c941bbSAndroid Build Coastguard Worker             break;
749*b7c941bbSAndroid Build Coastguard Worker         }
750*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_VA: {
751*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualLongMethodV, o, InstanceFromNative,
752*b7c941bbSAndroid Build Coastguard Worker                     method, args);
753*b7c941bbSAndroid Build Coastguard Worker             break;
754*b7c941bbSAndroid Build Coastguard Worker         }
755*b7c941bbSAndroid Build Coastguard Worker         case STATIC_PLAIN: {
756*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticLongMethod, StaticFromNative, method);
757*b7c941bbSAndroid Build Coastguard Worker             break;
758*b7c941bbSAndroid Build Coastguard Worker         }
759*b7c941bbSAndroid Build Coastguard Worker         case STATIC_ARRAY: {
760*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticLongMethodA, StaticFromNative, method,
761*b7c941bbSAndroid Build Coastguard Worker                     NULL);
762*b7c941bbSAndroid Build Coastguard Worker             break;
763*b7c941bbSAndroid Build Coastguard Worker         }
764*b7c941bbSAndroid Build Coastguard Worker         case STATIC_VA: {
765*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticLongMethodV, StaticFromNative, method,
766*b7c941bbSAndroid Build Coastguard Worker                     args);
767*b7c941bbSAndroid Build Coastguard Worker             break;
768*b7c941bbSAndroid Build Coastguard Worker         }
769*b7c941bbSAndroid Build Coastguard Worker         default: {
770*b7c941bbSAndroid Build Coastguard Worker             va_end(args);
771*b7c941bbSAndroid Build Coastguard Worker             return failure("shouldn't happen");
772*b7c941bbSAndroid Build Coastguard Worker         }
773*b7c941bbSAndroid Build Coastguard Worker     }
774*b7c941bbSAndroid Build Coastguard Worker 
775*b7c941bbSAndroid Build Coastguard Worker     va_end(args);
776*b7c941bbSAndroid Build Coastguard Worker 
777*b7c941bbSAndroid Build Coastguard Worker     return FAIL_IF_UNEQUAL("%" PRId64, -80080080087LL, result);
778*b7c941bbSAndroid Build Coastguard Worker }
779*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallLongMethod)780*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallLongMethod) {
781*b7c941bbSAndroid Build Coastguard Worker     return help_CallLongMethod(env, VIRTUAL_PLAIN);
782*b7c941bbSAndroid Build Coastguard Worker }
783*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallLongMethodA)784*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallLongMethodA) {
785*b7c941bbSAndroid Build Coastguard Worker     return help_CallLongMethod(env, VIRTUAL_ARRAY);
786*b7c941bbSAndroid Build Coastguard Worker }
787*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallLongMethodV)788*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallLongMethodV) {
789*b7c941bbSAndroid Build Coastguard Worker     return help_CallLongMethod(env, VIRTUAL_VA);
790*b7c941bbSAndroid Build Coastguard Worker }
791*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualLongMethod)792*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualLongMethod) {
793*b7c941bbSAndroid Build Coastguard Worker     return help_CallLongMethod(env, DIRECT_PLAIN);
794*b7c941bbSAndroid Build Coastguard Worker }
795*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualLongMethodA)796*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualLongMethodA) {
797*b7c941bbSAndroid Build Coastguard Worker     return help_CallLongMethod(env, DIRECT_ARRAY);
798*b7c941bbSAndroid Build Coastguard Worker }
799*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualLongMethodV)800*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualLongMethodV) {
801*b7c941bbSAndroid Build Coastguard Worker     return help_CallLongMethod(env, DIRECT_VA);
802*b7c941bbSAndroid Build Coastguard Worker }
803*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticLongMethod)804*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticLongMethod) {
805*b7c941bbSAndroid Build Coastguard Worker     return help_CallLongMethod(env, STATIC_PLAIN);
806*b7c941bbSAndroid Build Coastguard Worker }
807*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticLongMethodA)808*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticLongMethodA) {
809*b7c941bbSAndroid Build Coastguard Worker     return help_CallLongMethod(env, STATIC_ARRAY);
810*b7c941bbSAndroid Build Coastguard Worker }
811*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticLongMethodV)812*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticLongMethodV) {
813*b7c941bbSAndroid Build Coastguard Worker     return help_CallLongMethod(env, STATIC_VA);
814*b7c941bbSAndroid Build Coastguard Worker }
815*b7c941bbSAndroid Build Coastguard Worker 
help_CallFloatMethod(JNIEnv * env,int ct,...)816*b7c941bbSAndroid Build Coastguard Worker static char *help_CallFloatMethod(JNIEnv *env, int ct, ...) {
817*b7c941bbSAndroid Build Coastguard Worker     va_list args;
818*b7c941bbSAndroid Build Coastguard Worker     va_start(args, ct);
819*b7c941bbSAndroid Build Coastguard Worker 
820*b7c941bbSAndroid Build Coastguard Worker     char *msg;
821*b7c941bbSAndroid Build Coastguard Worker     jobject o = getStandardInstance(env);
822*b7c941bbSAndroid Build Coastguard Worker     jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
823*b7c941bbSAndroid Build Coastguard Worker             "returnFloat", "()F");
824*b7c941bbSAndroid Build Coastguard Worker 
825*b7c941bbSAndroid Build Coastguard Worker     if (method == NULL) {
826*b7c941bbSAndroid Build Coastguard Worker         va_end(args);
827*b7c941bbSAndroid Build Coastguard Worker         return msg;
828*b7c941bbSAndroid Build Coastguard Worker     }
829*b7c941bbSAndroid Build Coastguard Worker 
830*b7c941bbSAndroid Build Coastguard Worker     jfloat result;
831*b7c941bbSAndroid Build Coastguard Worker 
832*b7c941bbSAndroid Build Coastguard Worker     switch (ct) {
833*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_PLAIN: {
834*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallFloatMethod, o, method);
835*b7c941bbSAndroid Build Coastguard Worker             break;
836*b7c941bbSAndroid Build Coastguard Worker         }
837*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_ARRAY: {
838*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallFloatMethodA, o, method, NULL);
839*b7c941bbSAndroid Build Coastguard Worker             break;
840*b7c941bbSAndroid Build Coastguard Worker         }
841*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_VA: {
842*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallFloatMethodV, o, method, args);
843*b7c941bbSAndroid Build Coastguard Worker             break;
844*b7c941bbSAndroid Build Coastguard Worker         }
845*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_PLAIN: {
846*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualFloatMethod, o, InstanceFromNative,
847*b7c941bbSAndroid Build Coastguard Worker                     method);
848*b7c941bbSAndroid Build Coastguard Worker             break;
849*b7c941bbSAndroid Build Coastguard Worker         }
850*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_ARRAY: {
851*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualFloatMethodA, o, InstanceFromNative,
852*b7c941bbSAndroid Build Coastguard Worker                     method, NULL);
853*b7c941bbSAndroid Build Coastguard Worker             break;
854*b7c941bbSAndroid Build Coastguard Worker         }
855*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_VA: {
856*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualFloatMethodV, o, InstanceFromNative,
857*b7c941bbSAndroid Build Coastguard Worker                     method, args);
858*b7c941bbSAndroid Build Coastguard Worker             break;
859*b7c941bbSAndroid Build Coastguard Worker         }
860*b7c941bbSAndroid Build Coastguard Worker         case STATIC_PLAIN: {
861*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticFloatMethod, StaticFromNative, method);
862*b7c941bbSAndroid Build Coastguard Worker             break;
863*b7c941bbSAndroid Build Coastguard Worker         }
864*b7c941bbSAndroid Build Coastguard Worker         case STATIC_ARRAY: {
865*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticFloatMethodA, StaticFromNative, method,
866*b7c941bbSAndroid Build Coastguard Worker                     NULL);
867*b7c941bbSAndroid Build Coastguard Worker             break;
868*b7c941bbSAndroid Build Coastguard Worker         }
869*b7c941bbSAndroid Build Coastguard Worker         case STATIC_VA: {
870*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticFloatMethodV, StaticFromNative, method,
871*b7c941bbSAndroid Build Coastguard Worker                     args);
872*b7c941bbSAndroid Build Coastguard Worker             break;
873*b7c941bbSAndroid Build Coastguard Worker         }
874*b7c941bbSAndroid Build Coastguard Worker         default: {
875*b7c941bbSAndroid Build Coastguard Worker             va_end(args);
876*b7c941bbSAndroid Build Coastguard Worker             return failure("shouldn't happen");
877*b7c941bbSAndroid Build Coastguard Worker         }
878*b7c941bbSAndroid Build Coastguard Worker     }
879*b7c941bbSAndroid Build Coastguard Worker 
880*b7c941bbSAndroid Build Coastguard Worker     va_end(args);
881*b7c941bbSAndroid Build Coastguard Worker 
882*b7c941bbSAndroid Build Coastguard Worker     return FAIL_IF_UNEQUAL("%g", 2.5e22f, result);
883*b7c941bbSAndroid Build Coastguard Worker }
884*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallFloatMethod)885*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallFloatMethod) {
886*b7c941bbSAndroid Build Coastguard Worker     return help_CallFloatMethod(env, VIRTUAL_PLAIN);
887*b7c941bbSAndroid Build Coastguard Worker }
888*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallFloatMethodA)889*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallFloatMethodA) {
890*b7c941bbSAndroid Build Coastguard Worker     return help_CallFloatMethod(env, VIRTUAL_ARRAY);
891*b7c941bbSAndroid Build Coastguard Worker }
892*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallFloatMethodV)893*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallFloatMethodV) {
894*b7c941bbSAndroid Build Coastguard Worker     return help_CallFloatMethod(env, VIRTUAL_VA);
895*b7c941bbSAndroid Build Coastguard Worker }
896*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualFloatMethod)897*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualFloatMethod) {
898*b7c941bbSAndroid Build Coastguard Worker     return help_CallFloatMethod(env, DIRECT_PLAIN);
899*b7c941bbSAndroid Build Coastguard Worker }
900*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualFloatMethodA)901*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualFloatMethodA) {
902*b7c941bbSAndroid Build Coastguard Worker     return help_CallFloatMethod(env, DIRECT_ARRAY);
903*b7c941bbSAndroid Build Coastguard Worker }
904*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualFloatMethodV)905*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualFloatMethodV) {
906*b7c941bbSAndroid Build Coastguard Worker     return help_CallFloatMethod(env, DIRECT_VA);
907*b7c941bbSAndroid Build Coastguard Worker }
908*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticFloatMethod)909*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticFloatMethod) {
910*b7c941bbSAndroid Build Coastguard Worker     return help_CallFloatMethod(env, STATIC_PLAIN);
911*b7c941bbSAndroid Build Coastguard Worker }
912*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticFloatMethodA)913*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticFloatMethodA) {
914*b7c941bbSAndroid Build Coastguard Worker     return help_CallFloatMethod(env, STATIC_ARRAY);
915*b7c941bbSAndroid Build Coastguard Worker }
916*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticFloatMethodV)917*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticFloatMethodV) {
918*b7c941bbSAndroid Build Coastguard Worker     return help_CallFloatMethod(env, STATIC_VA);
919*b7c941bbSAndroid Build Coastguard Worker }
920*b7c941bbSAndroid Build Coastguard Worker 
help_CallDoubleMethod(JNIEnv * env,int ct,...)921*b7c941bbSAndroid Build Coastguard Worker static char *help_CallDoubleMethod(JNIEnv *env, int ct, ...) {
922*b7c941bbSAndroid Build Coastguard Worker     va_list args;
923*b7c941bbSAndroid Build Coastguard Worker     va_start(args, ct);
924*b7c941bbSAndroid Build Coastguard Worker 
925*b7c941bbSAndroid Build Coastguard Worker     char *msg;
926*b7c941bbSAndroid Build Coastguard Worker     jobject o = getStandardInstance(env);
927*b7c941bbSAndroid Build Coastguard Worker     jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
928*b7c941bbSAndroid Build Coastguard Worker             "returnDouble", "()D");
929*b7c941bbSAndroid Build Coastguard Worker 
930*b7c941bbSAndroid Build Coastguard Worker     if (method == NULL) {
931*b7c941bbSAndroid Build Coastguard Worker         va_end(args);
932*b7c941bbSAndroid Build Coastguard Worker         return msg;
933*b7c941bbSAndroid Build Coastguard Worker     }
934*b7c941bbSAndroid Build Coastguard Worker 
935*b7c941bbSAndroid Build Coastguard Worker     jdouble result;
936*b7c941bbSAndroid Build Coastguard Worker 
937*b7c941bbSAndroid Build Coastguard Worker     switch (ct) {
938*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_PLAIN: {
939*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallDoubleMethod, o, method);
940*b7c941bbSAndroid Build Coastguard Worker             break;
941*b7c941bbSAndroid Build Coastguard Worker         }
942*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_ARRAY: {
943*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallDoubleMethodA, o, method, NULL);
944*b7c941bbSAndroid Build Coastguard Worker             break;
945*b7c941bbSAndroid Build Coastguard Worker         }
946*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_VA: {
947*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallDoubleMethodV, o, method, args);
948*b7c941bbSAndroid Build Coastguard Worker             break;
949*b7c941bbSAndroid Build Coastguard Worker         }
950*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_PLAIN: {
951*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualDoubleMethod, o, InstanceFromNative,
952*b7c941bbSAndroid Build Coastguard Worker                     method);
953*b7c941bbSAndroid Build Coastguard Worker             break;
954*b7c941bbSAndroid Build Coastguard Worker         }
955*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_ARRAY: {
956*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualDoubleMethodA, o, InstanceFromNative,
957*b7c941bbSAndroid Build Coastguard Worker                     method, NULL);
958*b7c941bbSAndroid Build Coastguard Worker             break;
959*b7c941bbSAndroid Build Coastguard Worker         }
960*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_VA: {
961*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualDoubleMethodV, o, InstanceFromNative,
962*b7c941bbSAndroid Build Coastguard Worker                     method, args);
963*b7c941bbSAndroid Build Coastguard Worker             break;
964*b7c941bbSAndroid Build Coastguard Worker         }
965*b7c941bbSAndroid Build Coastguard Worker         case STATIC_PLAIN: {
966*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticDoubleMethod, StaticFromNative, method);
967*b7c941bbSAndroid Build Coastguard Worker             break;
968*b7c941bbSAndroid Build Coastguard Worker         }
969*b7c941bbSAndroid Build Coastguard Worker         case STATIC_ARRAY: {
970*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticDoubleMethodA, StaticFromNative, method,
971*b7c941bbSAndroid Build Coastguard Worker                     NULL);
972*b7c941bbSAndroid Build Coastguard Worker             break;
973*b7c941bbSAndroid Build Coastguard Worker         }
974*b7c941bbSAndroid Build Coastguard Worker         case STATIC_VA: {
975*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticDoubleMethodV, StaticFromNative, method,
976*b7c941bbSAndroid Build Coastguard Worker                     args);
977*b7c941bbSAndroid Build Coastguard Worker             break;
978*b7c941bbSAndroid Build Coastguard Worker         }
979*b7c941bbSAndroid Build Coastguard Worker         default: {
980*b7c941bbSAndroid Build Coastguard Worker             va_end(args);
981*b7c941bbSAndroid Build Coastguard Worker             return failure("shouldn't happen");
982*b7c941bbSAndroid Build Coastguard Worker         }
983*b7c941bbSAndroid Build Coastguard Worker     }
984*b7c941bbSAndroid Build Coastguard Worker 
985*b7c941bbSAndroid Build Coastguard Worker     va_end(args);
986*b7c941bbSAndroid Build Coastguard Worker 
987*b7c941bbSAndroid Build Coastguard Worker     return FAIL_IF_UNEQUAL("%g", 7.503e100, result);
988*b7c941bbSAndroid Build Coastguard Worker }
989*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallDoubleMethod)990*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallDoubleMethod) {
991*b7c941bbSAndroid Build Coastguard Worker     return help_CallDoubleMethod(env, VIRTUAL_PLAIN);
992*b7c941bbSAndroid Build Coastguard Worker }
993*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallDoubleMethodA)994*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallDoubleMethodA) {
995*b7c941bbSAndroid Build Coastguard Worker     return help_CallDoubleMethod(env, VIRTUAL_ARRAY);
996*b7c941bbSAndroid Build Coastguard Worker }
997*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallDoubleMethodV)998*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallDoubleMethodV) {
999*b7c941bbSAndroid Build Coastguard Worker     return help_CallDoubleMethod(env, VIRTUAL_VA);
1000*b7c941bbSAndroid Build Coastguard Worker }
1001*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualDoubleMethod)1002*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualDoubleMethod) {
1003*b7c941bbSAndroid Build Coastguard Worker     return help_CallDoubleMethod(env, DIRECT_PLAIN);
1004*b7c941bbSAndroid Build Coastguard Worker }
1005*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualDoubleMethodA)1006*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualDoubleMethodA) {
1007*b7c941bbSAndroid Build Coastguard Worker     return help_CallDoubleMethod(env, DIRECT_ARRAY);
1008*b7c941bbSAndroid Build Coastguard Worker }
1009*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualDoubleMethodV)1010*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualDoubleMethodV) {
1011*b7c941bbSAndroid Build Coastguard Worker     return help_CallDoubleMethod(env, DIRECT_VA);
1012*b7c941bbSAndroid Build Coastguard Worker }
1013*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticDoubleMethod)1014*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticDoubleMethod) {
1015*b7c941bbSAndroid Build Coastguard Worker     return help_CallDoubleMethod(env, STATIC_PLAIN);
1016*b7c941bbSAndroid Build Coastguard Worker }
1017*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticDoubleMethodA)1018*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticDoubleMethodA) {
1019*b7c941bbSAndroid Build Coastguard Worker     return help_CallDoubleMethod(env, STATIC_ARRAY);
1020*b7c941bbSAndroid Build Coastguard Worker }
1021*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticDoubleMethodV)1022*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticDoubleMethodV) {
1023*b7c941bbSAndroid Build Coastguard Worker     return help_CallDoubleMethod(env, STATIC_VA);
1024*b7c941bbSAndroid Build Coastguard Worker }
1025*b7c941bbSAndroid Build Coastguard Worker 
help_CallVoidMethod(JNIEnv * env,int ct,...)1026*b7c941bbSAndroid Build Coastguard Worker static char *help_CallVoidMethod(JNIEnv *env, int ct, ...) {
1027*b7c941bbSAndroid Build Coastguard Worker     va_list args;
1028*b7c941bbSAndroid Build Coastguard Worker     va_start(args, ct);
1029*b7c941bbSAndroid Build Coastguard Worker 
1030*b7c941bbSAndroid Build Coastguard Worker     char *msg;
1031*b7c941bbSAndroid Build Coastguard Worker     jobject o = getStandardInstance(env);
1032*b7c941bbSAndroid Build Coastguard Worker     jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
1033*b7c941bbSAndroid Build Coastguard Worker             "nop", "()V");
1034*b7c941bbSAndroid Build Coastguard Worker 
1035*b7c941bbSAndroid Build Coastguard Worker     if (method == NULL) {
1036*b7c941bbSAndroid Build Coastguard Worker         va_end(args);
1037*b7c941bbSAndroid Build Coastguard Worker         return msg;
1038*b7c941bbSAndroid Build Coastguard Worker     }
1039*b7c941bbSAndroid Build Coastguard Worker 
1040*b7c941bbSAndroid Build Coastguard Worker     // For these, we simply consider "success" to be "didn't crash."
1041*b7c941bbSAndroid Build Coastguard Worker 
1042*b7c941bbSAndroid Build Coastguard Worker     switch (ct) {
1043*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_PLAIN: {
1044*b7c941bbSAndroid Build Coastguard Worker             CALL(CallVoidMethod, o, method);
1045*b7c941bbSAndroid Build Coastguard Worker             break;
1046*b7c941bbSAndroid Build Coastguard Worker         }
1047*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_ARRAY: {
1048*b7c941bbSAndroid Build Coastguard Worker             CALL(CallVoidMethodA, o, method, NULL);
1049*b7c941bbSAndroid Build Coastguard Worker             break;
1050*b7c941bbSAndroid Build Coastguard Worker         }
1051*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_VA: {
1052*b7c941bbSAndroid Build Coastguard Worker             CALL(CallVoidMethodV, o, method, args);
1053*b7c941bbSAndroid Build Coastguard Worker             break;
1054*b7c941bbSAndroid Build Coastguard Worker         }
1055*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_PLAIN: {
1056*b7c941bbSAndroid Build Coastguard Worker             CALL(CallNonvirtualVoidMethod, o, InstanceFromNative,
1057*b7c941bbSAndroid Build Coastguard Worker                     method);
1058*b7c941bbSAndroid Build Coastguard Worker             break;
1059*b7c941bbSAndroid Build Coastguard Worker         }
1060*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_ARRAY: {
1061*b7c941bbSAndroid Build Coastguard Worker             CALL(CallNonvirtualVoidMethodA, o, InstanceFromNative,
1062*b7c941bbSAndroid Build Coastguard Worker                     method, NULL);
1063*b7c941bbSAndroid Build Coastguard Worker             break;
1064*b7c941bbSAndroid Build Coastguard Worker         }
1065*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_VA: {
1066*b7c941bbSAndroid Build Coastguard Worker             CALL(CallNonvirtualVoidMethodV, o, InstanceFromNative,
1067*b7c941bbSAndroid Build Coastguard Worker                     method, args);
1068*b7c941bbSAndroid Build Coastguard Worker             break;
1069*b7c941bbSAndroid Build Coastguard Worker         }
1070*b7c941bbSAndroid Build Coastguard Worker         case STATIC_PLAIN: {
1071*b7c941bbSAndroid Build Coastguard Worker             CALL(CallStaticVoidMethod, StaticFromNative, method);
1072*b7c941bbSAndroid Build Coastguard Worker             break;
1073*b7c941bbSAndroid Build Coastguard Worker         }
1074*b7c941bbSAndroid Build Coastguard Worker         case STATIC_ARRAY: {
1075*b7c941bbSAndroid Build Coastguard Worker             CALL(CallStaticVoidMethodA, StaticFromNative, method,
1076*b7c941bbSAndroid Build Coastguard Worker                     NULL);
1077*b7c941bbSAndroid Build Coastguard Worker             break;
1078*b7c941bbSAndroid Build Coastguard Worker         }
1079*b7c941bbSAndroid Build Coastguard Worker         case STATIC_VA: {
1080*b7c941bbSAndroid Build Coastguard Worker             CALL(CallStaticVoidMethodV, StaticFromNative, method,
1081*b7c941bbSAndroid Build Coastguard Worker                     args);
1082*b7c941bbSAndroid Build Coastguard Worker             break;
1083*b7c941bbSAndroid Build Coastguard Worker         }
1084*b7c941bbSAndroid Build Coastguard Worker         default: {
1085*b7c941bbSAndroid Build Coastguard Worker             va_end(args);
1086*b7c941bbSAndroid Build Coastguard Worker             return failure("shouldn't happen");
1087*b7c941bbSAndroid Build Coastguard Worker         }
1088*b7c941bbSAndroid Build Coastguard Worker     }
1089*b7c941bbSAndroid Build Coastguard Worker 
1090*b7c941bbSAndroid Build Coastguard Worker     va_end(args);
1091*b7c941bbSAndroid Build Coastguard Worker 
1092*b7c941bbSAndroid Build Coastguard Worker     return NULL;
1093*b7c941bbSAndroid Build Coastguard Worker }
1094*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallVoidMethod)1095*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallVoidMethod) {
1096*b7c941bbSAndroid Build Coastguard Worker     return help_CallVoidMethod(env, VIRTUAL_PLAIN);
1097*b7c941bbSAndroid Build Coastguard Worker }
1098*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallVoidMethodA)1099*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallVoidMethodA) {
1100*b7c941bbSAndroid Build Coastguard Worker     return help_CallVoidMethod(env, VIRTUAL_ARRAY);
1101*b7c941bbSAndroid Build Coastguard Worker }
1102*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallVoidMethodV)1103*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallVoidMethodV) {
1104*b7c941bbSAndroid Build Coastguard Worker     return help_CallVoidMethod(env, VIRTUAL_VA);
1105*b7c941bbSAndroid Build Coastguard Worker }
1106*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualVoidMethod)1107*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualVoidMethod) {
1108*b7c941bbSAndroid Build Coastguard Worker     return help_CallVoidMethod(env, DIRECT_PLAIN);
1109*b7c941bbSAndroid Build Coastguard Worker }
1110*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualVoidMethodA)1111*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualVoidMethodA) {
1112*b7c941bbSAndroid Build Coastguard Worker     return help_CallVoidMethod(env, DIRECT_ARRAY);
1113*b7c941bbSAndroid Build Coastguard Worker }
1114*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualVoidMethodV)1115*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualVoidMethodV) {
1116*b7c941bbSAndroid Build Coastguard Worker     return help_CallVoidMethod(env, DIRECT_VA);
1117*b7c941bbSAndroid Build Coastguard Worker }
1118*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticVoidMethod)1119*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticVoidMethod) {
1120*b7c941bbSAndroid Build Coastguard Worker     return help_CallVoidMethod(env, STATIC_PLAIN);
1121*b7c941bbSAndroid Build Coastguard Worker }
1122*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticVoidMethodA)1123*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticVoidMethodA) {
1124*b7c941bbSAndroid Build Coastguard Worker     return help_CallVoidMethod(env, STATIC_ARRAY);
1125*b7c941bbSAndroid Build Coastguard Worker }
1126*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticVoidMethodV)1127*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticVoidMethodV) {
1128*b7c941bbSAndroid Build Coastguard Worker     return help_CallVoidMethod(env, STATIC_VA);
1129*b7c941bbSAndroid Build Coastguard Worker }
1130*b7c941bbSAndroid Build Coastguard Worker 
help_CallObjectMethod(JNIEnv * env,int ct,...)1131*b7c941bbSAndroid Build Coastguard Worker static char *help_CallObjectMethod(JNIEnv *env, int ct, ...) {
1132*b7c941bbSAndroid Build Coastguard Worker     va_list args;
1133*b7c941bbSAndroid Build Coastguard Worker     va_start(args, ct);
1134*b7c941bbSAndroid Build Coastguard Worker 
1135*b7c941bbSAndroid Build Coastguard Worker     char *msg;
1136*b7c941bbSAndroid Build Coastguard Worker     jobject o = getStandardInstance(env);
1137*b7c941bbSAndroid Build Coastguard Worker     jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
1138*b7c941bbSAndroid Build Coastguard Worker             "returnString", "()Ljava/lang/String;");
1139*b7c941bbSAndroid Build Coastguard Worker 
1140*b7c941bbSAndroid Build Coastguard Worker     if (method == NULL) {
1141*b7c941bbSAndroid Build Coastguard Worker         va_end(args);
1142*b7c941bbSAndroid Build Coastguard Worker         return msg;
1143*b7c941bbSAndroid Build Coastguard Worker     }
1144*b7c941bbSAndroid Build Coastguard Worker 
1145*b7c941bbSAndroid Build Coastguard Worker     jstring result;
1146*b7c941bbSAndroid Build Coastguard Worker 
1147*b7c941bbSAndroid Build Coastguard Worker     switch (ct) {
1148*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_PLAIN: {
1149*b7c941bbSAndroid Build Coastguard Worker             result = (jstring) CALL(CallObjectMethod, o, method);
1150*b7c941bbSAndroid Build Coastguard Worker             break;
1151*b7c941bbSAndroid Build Coastguard Worker         }
1152*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_ARRAY: {
1153*b7c941bbSAndroid Build Coastguard Worker             result = (jstring) CALL(CallObjectMethodA, o, method, NULL);
1154*b7c941bbSAndroid Build Coastguard Worker             break;
1155*b7c941bbSAndroid Build Coastguard Worker         }
1156*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_VA: {
1157*b7c941bbSAndroid Build Coastguard Worker             result = (jstring) CALL(CallObjectMethodV, o, method, args);
1158*b7c941bbSAndroid Build Coastguard Worker             break;
1159*b7c941bbSAndroid Build Coastguard Worker         }
1160*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_PLAIN: {
1161*b7c941bbSAndroid Build Coastguard Worker             result = (jstring)
1162*b7c941bbSAndroid Build Coastguard Worker                 CALL(CallNonvirtualObjectMethod, o, InstanceFromNative,
1163*b7c941bbSAndroid Build Coastguard Worker                         method);
1164*b7c941bbSAndroid Build Coastguard Worker             break;
1165*b7c941bbSAndroid Build Coastguard Worker         }
1166*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_ARRAY: {
1167*b7c941bbSAndroid Build Coastguard Worker             result = (jstring)
1168*b7c941bbSAndroid Build Coastguard Worker                 CALL(CallNonvirtualObjectMethodA, o, InstanceFromNative,
1169*b7c941bbSAndroid Build Coastguard Worker                         method, NULL);
1170*b7c941bbSAndroid Build Coastguard Worker             break;
1171*b7c941bbSAndroid Build Coastguard Worker         }
1172*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_VA: {
1173*b7c941bbSAndroid Build Coastguard Worker             result = (jstring)
1174*b7c941bbSAndroid Build Coastguard Worker                 CALL(CallNonvirtualObjectMethodV, o, InstanceFromNative,
1175*b7c941bbSAndroid Build Coastguard Worker                         method, args);
1176*b7c941bbSAndroid Build Coastguard Worker             break;
1177*b7c941bbSAndroid Build Coastguard Worker         }
1178*b7c941bbSAndroid Build Coastguard Worker         case STATIC_PLAIN: {
1179*b7c941bbSAndroid Build Coastguard Worker             result = (jstring)
1180*b7c941bbSAndroid Build Coastguard Worker                 CALL(CallStaticObjectMethod, StaticFromNative, method);
1181*b7c941bbSAndroid Build Coastguard Worker             break;
1182*b7c941bbSAndroid Build Coastguard Worker         }
1183*b7c941bbSAndroid Build Coastguard Worker         case STATIC_ARRAY: {
1184*b7c941bbSAndroid Build Coastguard Worker             result = (jstring)
1185*b7c941bbSAndroid Build Coastguard Worker                 CALL(CallStaticObjectMethodA, StaticFromNative, method, NULL);
1186*b7c941bbSAndroid Build Coastguard Worker             break;
1187*b7c941bbSAndroid Build Coastguard Worker         }
1188*b7c941bbSAndroid Build Coastguard Worker         case STATIC_VA: {
1189*b7c941bbSAndroid Build Coastguard Worker             result = (jstring)
1190*b7c941bbSAndroid Build Coastguard Worker                 CALL(CallStaticObjectMethodV, StaticFromNative, method, args);
1191*b7c941bbSAndroid Build Coastguard Worker             break;
1192*b7c941bbSAndroid Build Coastguard Worker         }
1193*b7c941bbSAndroid Build Coastguard Worker         default: {
1194*b7c941bbSAndroid Build Coastguard Worker             va_end(args);
1195*b7c941bbSAndroid Build Coastguard Worker             return failure("shouldn't happen");
1196*b7c941bbSAndroid Build Coastguard Worker         }
1197*b7c941bbSAndroid Build Coastguard Worker     }
1198*b7c941bbSAndroid Build Coastguard Worker 
1199*b7c941bbSAndroid Build Coastguard Worker     va_end(args);
1200*b7c941bbSAndroid Build Coastguard Worker 
1201*b7c941bbSAndroid Build Coastguard Worker     if (result == NULL) {
1202*b7c941bbSAndroid Build Coastguard Worker         return failure("got null from call");
1203*b7c941bbSAndroid Build Coastguard Worker     }
1204*b7c941bbSAndroid Build Coastguard Worker 
1205*b7c941bbSAndroid Build Coastguard Worker     const char *utf = CALL(GetStringUTFChars, result, NULL);
1206*b7c941bbSAndroid Build Coastguard Worker 
1207*b7c941bbSAndroid Build Coastguard Worker     if (strcmp(utf, "muffins") == 0) {
1208*b7c941bbSAndroid Build Coastguard Worker         msg = NULL;
1209*b7c941bbSAndroid Build Coastguard Worker     } else {
1210*b7c941bbSAndroid Build Coastguard Worker         msg = failure("unexpected string: %s", utf);
1211*b7c941bbSAndroid Build Coastguard Worker     }
1212*b7c941bbSAndroid Build Coastguard Worker 
1213*b7c941bbSAndroid Build Coastguard Worker     CALL(ReleaseStringUTFChars, result, utf);
1214*b7c941bbSAndroid Build Coastguard Worker 
1215*b7c941bbSAndroid Build Coastguard Worker     return msg;
1216*b7c941bbSAndroid Build Coastguard Worker }
1217*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallObjectMethod)1218*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallObjectMethod) {
1219*b7c941bbSAndroid Build Coastguard Worker     return help_CallObjectMethod(env, VIRTUAL_PLAIN);
1220*b7c941bbSAndroid Build Coastguard Worker }
1221*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallObjectMethodA)1222*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallObjectMethodA) {
1223*b7c941bbSAndroid Build Coastguard Worker     return help_CallObjectMethod(env, VIRTUAL_ARRAY);
1224*b7c941bbSAndroid Build Coastguard Worker }
1225*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallObjectMethodV)1226*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallObjectMethodV) {
1227*b7c941bbSAndroid Build Coastguard Worker     return help_CallObjectMethod(env, VIRTUAL_VA);
1228*b7c941bbSAndroid Build Coastguard Worker }
1229*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualObjectMethod)1230*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualObjectMethod) {
1231*b7c941bbSAndroid Build Coastguard Worker     return help_CallObjectMethod(env, DIRECT_PLAIN);
1232*b7c941bbSAndroid Build Coastguard Worker }
1233*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualObjectMethodA)1234*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualObjectMethodA) {
1235*b7c941bbSAndroid Build Coastguard Worker     return help_CallObjectMethod(env, DIRECT_ARRAY);
1236*b7c941bbSAndroid Build Coastguard Worker }
1237*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallNonvirtualObjectMethodV)1238*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallNonvirtualObjectMethodV) {
1239*b7c941bbSAndroid Build Coastguard Worker     return help_CallObjectMethod(env, DIRECT_VA);
1240*b7c941bbSAndroid Build Coastguard Worker }
1241*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticObjectMethod)1242*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticObjectMethod) {
1243*b7c941bbSAndroid Build Coastguard Worker     return help_CallObjectMethod(env, STATIC_PLAIN);
1244*b7c941bbSAndroid Build Coastguard Worker }
1245*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticObjectMethodA)1246*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticObjectMethodA) {
1247*b7c941bbSAndroid Build Coastguard Worker     return help_CallObjectMethod(env, STATIC_ARRAY);
1248*b7c941bbSAndroid Build Coastguard Worker }
1249*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(CallStaticObjectMethodV)1250*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(CallStaticObjectMethodV) {
1251*b7c941bbSAndroid Build Coastguard Worker     return help_CallObjectMethod(env, STATIC_VA);
1252*b7c941bbSAndroid Build Coastguard Worker }
1253*b7c941bbSAndroid Build Coastguard Worker 
help_TakeOneOfEach(JNIEnv * env,int ct,...)1254*b7c941bbSAndroid Build Coastguard Worker static char *help_TakeOneOfEach(JNIEnv *env, int ct, ...) {
1255*b7c941bbSAndroid Build Coastguard Worker     va_list args;
1256*b7c941bbSAndroid Build Coastguard Worker     va_start(args, ct);
1257*b7c941bbSAndroid Build Coastguard Worker 
1258*b7c941bbSAndroid Build Coastguard Worker     char *msg;
1259*b7c941bbSAndroid Build Coastguard Worker     jobject o = getStandardInstance(env);
1260*b7c941bbSAndroid Build Coastguard Worker     jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
1261*b7c941bbSAndroid Build Coastguard Worker             "takeOneOfEach", "(DFJICSBZLjava/lang/String;)Z");
1262*b7c941bbSAndroid Build Coastguard Worker 
1263*b7c941bbSAndroid Build Coastguard Worker     if (method == NULL) {
1264*b7c941bbSAndroid Build Coastguard Worker         va_end(args);
1265*b7c941bbSAndroid Build Coastguard Worker         return msg;
1266*b7c941bbSAndroid Build Coastguard Worker     }
1267*b7c941bbSAndroid Build Coastguard Worker 
1268*b7c941bbSAndroid Build Coastguard Worker     jvalue jargs[] = {
1269*b7c941bbSAndroid Build Coastguard Worker         {.d = 0.0}, {.f = 1.0f}, {.j = 2LL}, {.i = 3}, {.c = 4}, {.s = 5},
1270*b7c941bbSAndroid Build Coastguard Worker         {.b = 6}, {.z = true}, {.l = biscuits}
1271*b7c941bbSAndroid Build Coastguard Worker     };
1272*b7c941bbSAndroid Build Coastguard Worker 
1273*b7c941bbSAndroid Build Coastguard Worker     jboolean result;
1274*b7c941bbSAndroid Build Coastguard Worker 
1275*b7c941bbSAndroid Build Coastguard Worker     switch (ct) {
1276*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_PLAIN: {
1277*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallBooleanMethod, o, method,
1278*b7c941bbSAndroid Build Coastguard Worker                     0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
1279*b7c941bbSAndroid Build Coastguard Worker                     (jboolean) true, biscuits);
1280*b7c941bbSAndroid Build Coastguard Worker             break;
1281*b7c941bbSAndroid Build Coastguard Worker         }
1282*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_ARRAY: {
1283*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallBooleanMethodA, o, method, jargs);
1284*b7c941bbSAndroid Build Coastguard Worker             break;
1285*b7c941bbSAndroid Build Coastguard Worker         }
1286*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_VA: {
1287*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallBooleanMethodV, o, method, args);
1288*b7c941bbSAndroid Build Coastguard Worker             break;
1289*b7c941bbSAndroid Build Coastguard Worker         }
1290*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_PLAIN: {
1291*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualBooleanMethod, o, InstanceFromNative,
1292*b7c941bbSAndroid Build Coastguard Worker                     method,
1293*b7c941bbSAndroid Build Coastguard Worker                     0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
1294*b7c941bbSAndroid Build Coastguard Worker                     (jboolean) true, biscuits);
1295*b7c941bbSAndroid Build Coastguard Worker             break;
1296*b7c941bbSAndroid Build Coastguard Worker         }
1297*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_ARRAY: {
1298*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualBooleanMethodA, o, InstanceFromNative,
1299*b7c941bbSAndroid Build Coastguard Worker                     method, jargs);
1300*b7c941bbSAndroid Build Coastguard Worker             break;
1301*b7c941bbSAndroid Build Coastguard Worker         }
1302*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_VA: {
1303*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualBooleanMethodV, o, InstanceFromNative,
1304*b7c941bbSAndroid Build Coastguard Worker                     method, args);
1305*b7c941bbSAndroid Build Coastguard Worker             break;
1306*b7c941bbSAndroid Build Coastguard Worker         }
1307*b7c941bbSAndroid Build Coastguard Worker         case STATIC_PLAIN: {
1308*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticBooleanMethod, StaticFromNative, method,
1309*b7c941bbSAndroid Build Coastguard Worker                     0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
1310*b7c941bbSAndroid Build Coastguard Worker                     (jboolean) true, biscuits);
1311*b7c941bbSAndroid Build Coastguard Worker             break;
1312*b7c941bbSAndroid Build Coastguard Worker         }
1313*b7c941bbSAndroid Build Coastguard Worker         case STATIC_ARRAY: {
1314*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticBooleanMethodA, StaticFromNative, method,
1315*b7c941bbSAndroid Build Coastguard Worker                     jargs);
1316*b7c941bbSAndroid Build Coastguard Worker             break;
1317*b7c941bbSAndroid Build Coastguard Worker         }
1318*b7c941bbSAndroid Build Coastguard Worker         case STATIC_VA: {
1319*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticBooleanMethodV, StaticFromNative, method,
1320*b7c941bbSAndroid Build Coastguard Worker                     args);
1321*b7c941bbSAndroid Build Coastguard Worker             break;
1322*b7c941bbSAndroid Build Coastguard Worker         }
1323*b7c941bbSAndroid Build Coastguard Worker         default: {
1324*b7c941bbSAndroid Build Coastguard Worker             va_end(args);
1325*b7c941bbSAndroid Build Coastguard Worker             return failure("shouldn't happen");
1326*b7c941bbSAndroid Build Coastguard Worker         }
1327*b7c941bbSAndroid Build Coastguard Worker     }
1328*b7c941bbSAndroid Build Coastguard Worker 
1329*b7c941bbSAndroid Build Coastguard Worker     va_end(args);
1330*b7c941bbSAndroid Build Coastguard Worker 
1331*b7c941bbSAndroid Build Coastguard Worker     return FAIL_IF_UNEQUAL("%d", true, result);
1332*b7c941bbSAndroid Build Coastguard Worker }
1333*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(TakeOneOfEach)1334*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(TakeOneOfEach) {
1335*b7c941bbSAndroid Build Coastguard Worker     return help_TakeOneOfEach(env, VIRTUAL_PLAIN);
1336*b7c941bbSAndroid Build Coastguard Worker }
1337*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(TakeOneOfEachA)1338*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(TakeOneOfEachA) {
1339*b7c941bbSAndroid Build Coastguard Worker     return help_TakeOneOfEach(env, VIRTUAL_ARRAY);
1340*b7c941bbSAndroid Build Coastguard Worker }
1341*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(TakeOneOfEachV)1342*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(TakeOneOfEachV) {
1343*b7c941bbSAndroid Build Coastguard Worker     return help_TakeOneOfEach(env, VIRTUAL_VA,
1344*b7c941bbSAndroid Build Coastguard Worker             0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
1345*b7c941bbSAndroid Build Coastguard Worker             (jboolean) true, biscuits);
1346*b7c941bbSAndroid Build Coastguard Worker }
1347*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(NonvirtualTakeOneOfEach)1348*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(NonvirtualTakeOneOfEach) {
1349*b7c941bbSAndroid Build Coastguard Worker     return help_TakeOneOfEach(env, DIRECT_PLAIN);
1350*b7c941bbSAndroid Build Coastguard Worker }
1351*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(NonvirtualTakeOneOfEachA)1352*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(NonvirtualTakeOneOfEachA) {
1353*b7c941bbSAndroid Build Coastguard Worker     return help_TakeOneOfEach(env, DIRECT_ARRAY);
1354*b7c941bbSAndroid Build Coastguard Worker }
1355*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(NonvirtualTakeOneOfEachV)1356*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(NonvirtualTakeOneOfEachV) {
1357*b7c941bbSAndroid Build Coastguard Worker     return help_TakeOneOfEach(env, DIRECT_VA,
1358*b7c941bbSAndroid Build Coastguard Worker             0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
1359*b7c941bbSAndroid Build Coastguard Worker             (jboolean) true, biscuits);
1360*b7c941bbSAndroid Build Coastguard Worker }
1361*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(StaticTakeOneOfEach)1362*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(StaticTakeOneOfEach) {
1363*b7c941bbSAndroid Build Coastguard Worker     return help_TakeOneOfEach(env, STATIC_PLAIN);
1364*b7c941bbSAndroid Build Coastguard Worker }
1365*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(StaticTakeOneOfEachA)1366*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(StaticTakeOneOfEachA) {
1367*b7c941bbSAndroid Build Coastguard Worker     return help_TakeOneOfEach(env, STATIC_ARRAY);
1368*b7c941bbSAndroid Build Coastguard Worker }
1369*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(StaticTakeOneOfEachV)1370*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(StaticTakeOneOfEachV) {
1371*b7c941bbSAndroid Build Coastguard Worker     return help_TakeOneOfEach(env, STATIC_VA,
1372*b7c941bbSAndroid Build Coastguard Worker             0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
1373*b7c941bbSAndroid Build Coastguard Worker             (jboolean) true, biscuits);
1374*b7c941bbSAndroid Build Coastguard Worker }
1375*b7c941bbSAndroid Build Coastguard Worker 
help_TakeCoolHandLuke(JNIEnv * env,int ct,...)1376*b7c941bbSAndroid Build Coastguard Worker static char *help_TakeCoolHandLuke(JNIEnv *env, int ct, ...) {
1377*b7c941bbSAndroid Build Coastguard Worker     va_list args;
1378*b7c941bbSAndroid Build Coastguard Worker     va_start(args, ct);
1379*b7c941bbSAndroid Build Coastguard Worker 
1380*b7c941bbSAndroid Build Coastguard Worker     char *msg;
1381*b7c941bbSAndroid Build Coastguard Worker     jobject o = getStandardInstance(env);
1382*b7c941bbSAndroid Build Coastguard Worker     jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
1383*b7c941bbSAndroid Build Coastguard Worker             "takeCoolHandLuke",
1384*b7c941bbSAndroid Build Coastguard Worker             "(IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII)Z");
1385*b7c941bbSAndroid Build Coastguard Worker 
1386*b7c941bbSAndroid Build Coastguard Worker     if (method == NULL) {
1387*b7c941bbSAndroid Build Coastguard Worker         va_end(args);
1388*b7c941bbSAndroid Build Coastguard Worker         return msg;
1389*b7c941bbSAndroid Build Coastguard Worker     }
1390*b7c941bbSAndroid Build Coastguard Worker 
1391*b7c941bbSAndroid Build Coastguard Worker     jvalue jargs[] = {
1392*b7c941bbSAndroid Build Coastguard Worker         {.i = 1}, {.i = 2}, {.i = 3}, {.i = 4},
1393*b7c941bbSAndroid Build Coastguard Worker         {.i = 5}, {.i = 6}, {.i = 7}, {.i = 8}, {.i = 9},
1394*b7c941bbSAndroid Build Coastguard Worker         {.i = 10}, {.i = 11}, {.i = 12}, {.i = 13}, {.i = 14},
1395*b7c941bbSAndroid Build Coastguard Worker         {.i = 15}, {.i = 16}, {.i = 17}, {.i = 18}, {.i = 19},
1396*b7c941bbSAndroid Build Coastguard Worker         {.i = 20}, {.i = 21}, {.i = 22}, {.i = 23}, {.i = 24},
1397*b7c941bbSAndroid Build Coastguard Worker         {.i = 25}, {.i = 26}, {.i = 27}, {.i = 28}, {.i = 29},
1398*b7c941bbSAndroid Build Coastguard Worker         {.i = 30}, {.i = 31}, {.i = 32}, {.i = 33}, {.i = 34},
1399*b7c941bbSAndroid Build Coastguard Worker         {.i = 35}, {.i = 36}, {.i = 37}, {.i = 38}, {.i = 39},
1400*b7c941bbSAndroid Build Coastguard Worker         {.i = 40}, {.i = 41}, {.i = 42}, {.i = 43}, {.i = 44},
1401*b7c941bbSAndroid Build Coastguard Worker         {.i = 45}, {.i = 46}, {.i = 47}, {.i = 48}, {.i = 49},
1402*b7c941bbSAndroid Build Coastguard Worker         {.i = 50}
1403*b7c941bbSAndroid Build Coastguard Worker     };
1404*b7c941bbSAndroid Build Coastguard Worker 
1405*b7c941bbSAndroid Build Coastguard Worker     jboolean result;
1406*b7c941bbSAndroid Build Coastguard Worker 
1407*b7c941bbSAndroid Build Coastguard Worker     switch (ct) {
1408*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_PLAIN: {
1409*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallBooleanMethod, o, method,
1410*b7c941bbSAndroid Build Coastguard Worker                     1, 2, 3, 4, 5, 6, 7, 8, 9,
1411*b7c941bbSAndroid Build Coastguard Worker                     10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
1412*b7c941bbSAndroid Build Coastguard Worker                     20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
1413*b7c941bbSAndroid Build Coastguard Worker                     30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
1414*b7c941bbSAndroid Build Coastguard Worker                     40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
1415*b7c941bbSAndroid Build Coastguard Worker                     50);
1416*b7c941bbSAndroid Build Coastguard Worker             break;
1417*b7c941bbSAndroid Build Coastguard Worker         }
1418*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_ARRAY: {
1419*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallBooleanMethodA, o, method, jargs);
1420*b7c941bbSAndroid Build Coastguard Worker             break;
1421*b7c941bbSAndroid Build Coastguard Worker         }
1422*b7c941bbSAndroid Build Coastguard Worker         case VIRTUAL_VA: {
1423*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallBooleanMethodV, o, method, args);
1424*b7c941bbSAndroid Build Coastguard Worker             break;
1425*b7c941bbSAndroid Build Coastguard Worker         }
1426*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_PLAIN: {
1427*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualBooleanMethod, o, InstanceFromNative,
1428*b7c941bbSAndroid Build Coastguard Worker                     method,
1429*b7c941bbSAndroid Build Coastguard Worker                     1, 2, 3, 4, 5, 6, 7, 8, 9,
1430*b7c941bbSAndroid Build Coastguard Worker                     10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
1431*b7c941bbSAndroid Build Coastguard Worker                     20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
1432*b7c941bbSAndroid Build Coastguard Worker                     30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
1433*b7c941bbSAndroid Build Coastguard Worker                     40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
1434*b7c941bbSAndroid Build Coastguard Worker                     50);
1435*b7c941bbSAndroid Build Coastguard Worker             break;
1436*b7c941bbSAndroid Build Coastguard Worker         }
1437*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_ARRAY: {
1438*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualBooleanMethodA, o, InstanceFromNative,
1439*b7c941bbSAndroid Build Coastguard Worker                     method, jargs);
1440*b7c941bbSAndroid Build Coastguard Worker             break;
1441*b7c941bbSAndroid Build Coastguard Worker         }
1442*b7c941bbSAndroid Build Coastguard Worker         case DIRECT_VA: {
1443*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallNonvirtualBooleanMethodV, o, InstanceFromNative,
1444*b7c941bbSAndroid Build Coastguard Worker                     method, args);
1445*b7c941bbSAndroid Build Coastguard Worker             break;
1446*b7c941bbSAndroid Build Coastguard Worker         }
1447*b7c941bbSAndroid Build Coastguard Worker         case STATIC_PLAIN: {
1448*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticBooleanMethod, StaticFromNative, method,
1449*b7c941bbSAndroid Build Coastguard Worker                     1, 2, 3, 4, 5, 6, 7, 8, 9,
1450*b7c941bbSAndroid Build Coastguard Worker                     10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
1451*b7c941bbSAndroid Build Coastguard Worker                     20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
1452*b7c941bbSAndroid Build Coastguard Worker                     30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
1453*b7c941bbSAndroid Build Coastguard Worker                     40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
1454*b7c941bbSAndroid Build Coastguard Worker                     50);
1455*b7c941bbSAndroid Build Coastguard Worker             break;
1456*b7c941bbSAndroid Build Coastguard Worker         }
1457*b7c941bbSAndroid Build Coastguard Worker         case STATIC_ARRAY: {
1458*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticBooleanMethodA, StaticFromNative, method,
1459*b7c941bbSAndroid Build Coastguard Worker                     jargs);
1460*b7c941bbSAndroid Build Coastguard Worker             break;
1461*b7c941bbSAndroid Build Coastguard Worker         }
1462*b7c941bbSAndroid Build Coastguard Worker         case STATIC_VA: {
1463*b7c941bbSAndroid Build Coastguard Worker             result = CALL(CallStaticBooleanMethodV, StaticFromNative, method,
1464*b7c941bbSAndroid Build Coastguard Worker                     args);
1465*b7c941bbSAndroid Build Coastguard Worker             break;
1466*b7c941bbSAndroid Build Coastguard Worker         }
1467*b7c941bbSAndroid Build Coastguard Worker         default: {
1468*b7c941bbSAndroid Build Coastguard Worker             va_end(args);
1469*b7c941bbSAndroid Build Coastguard Worker             return failure("shouldn't happen");
1470*b7c941bbSAndroid Build Coastguard Worker         }
1471*b7c941bbSAndroid Build Coastguard Worker     }
1472*b7c941bbSAndroid Build Coastguard Worker 
1473*b7c941bbSAndroid Build Coastguard Worker     va_end(args);
1474*b7c941bbSAndroid Build Coastguard Worker 
1475*b7c941bbSAndroid Build Coastguard Worker     return FAIL_IF_UNEQUAL("%d", true, result);
1476*b7c941bbSAndroid Build Coastguard Worker }
1477*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(TakeCoolHandLuke)1478*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(TakeCoolHandLuke) {
1479*b7c941bbSAndroid Build Coastguard Worker     return help_TakeCoolHandLuke(env, VIRTUAL_PLAIN);
1480*b7c941bbSAndroid Build Coastguard Worker }
1481*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(TakeCoolHandLukeA)1482*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(TakeCoolHandLukeA) {
1483*b7c941bbSAndroid Build Coastguard Worker     return help_TakeCoolHandLuke(env, VIRTUAL_ARRAY);
1484*b7c941bbSAndroid Build Coastguard Worker }
1485*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(TakeCoolHandLukeV)1486*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(TakeCoolHandLukeV) {
1487*b7c941bbSAndroid Build Coastguard Worker     return help_TakeCoolHandLuke(env, VIRTUAL_VA,
1488*b7c941bbSAndroid Build Coastguard Worker             1, 2, 3, 4, 5, 6, 7, 8, 9,
1489*b7c941bbSAndroid Build Coastguard Worker             10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
1490*b7c941bbSAndroid Build Coastguard Worker             20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
1491*b7c941bbSAndroid Build Coastguard Worker             30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
1492*b7c941bbSAndroid Build Coastguard Worker             40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
1493*b7c941bbSAndroid Build Coastguard Worker             50);
1494*b7c941bbSAndroid Build Coastguard Worker }
1495*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(NonvirtualTakeCoolHandLuke)1496*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(NonvirtualTakeCoolHandLuke) {
1497*b7c941bbSAndroid Build Coastguard Worker     return help_TakeCoolHandLuke(env, DIRECT_PLAIN);
1498*b7c941bbSAndroid Build Coastguard Worker }
1499*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(NonvirtualTakeCoolHandLukeA)1500*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(NonvirtualTakeCoolHandLukeA) {
1501*b7c941bbSAndroid Build Coastguard Worker     return help_TakeCoolHandLuke(env, DIRECT_ARRAY);
1502*b7c941bbSAndroid Build Coastguard Worker }
1503*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(NonvirtualTakeCoolHandLukeV)1504*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(NonvirtualTakeCoolHandLukeV) {
1505*b7c941bbSAndroid Build Coastguard Worker     return help_TakeCoolHandLuke(env, DIRECT_VA,
1506*b7c941bbSAndroid Build Coastguard Worker             1, 2, 3, 4, 5, 6, 7, 8, 9,
1507*b7c941bbSAndroid Build Coastguard Worker             10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
1508*b7c941bbSAndroid Build Coastguard Worker             20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
1509*b7c941bbSAndroid Build Coastguard Worker             30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
1510*b7c941bbSAndroid Build Coastguard Worker             40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
1511*b7c941bbSAndroid Build Coastguard Worker             50);
1512*b7c941bbSAndroid Build Coastguard Worker }
1513*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(StaticTakeCoolHandLuke)1514*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(StaticTakeCoolHandLuke) {
1515*b7c941bbSAndroid Build Coastguard Worker     return help_TakeCoolHandLuke(env, STATIC_PLAIN);
1516*b7c941bbSAndroid Build Coastguard Worker }
1517*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(StaticTakeCoolHandLukeA)1518*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(StaticTakeCoolHandLukeA) {
1519*b7c941bbSAndroid Build Coastguard Worker     return help_TakeCoolHandLuke(env, STATIC_ARRAY);
1520*b7c941bbSAndroid Build Coastguard Worker }
1521*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(StaticTakeCoolHandLukeV)1522*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(StaticTakeCoolHandLukeV) {
1523*b7c941bbSAndroid Build Coastguard Worker     return help_TakeCoolHandLuke(env, STATIC_VA,
1524*b7c941bbSAndroid Build Coastguard Worker             1, 2, 3, 4, 5, 6, 7, 8, 9,
1525*b7c941bbSAndroid Build Coastguard Worker             10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
1526*b7c941bbSAndroid Build Coastguard Worker             20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
1527*b7c941bbSAndroid Build Coastguard Worker             30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
1528*b7c941bbSAndroid Build Coastguard Worker             40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
1529*b7c941bbSAndroid Build Coastguard Worker             50);
1530*b7c941bbSAndroid Build Coastguard Worker }
1531*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(DefineClass)1532*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(DefineClass) {
1533*b7c941bbSAndroid Build Coastguard Worker     // Android implementations should always return NULL.
1534*b7c941bbSAndroid Build Coastguard Worker     jclass clazz = CALL(DefineClass, "foo", NULL, NULL, 0);
1535*b7c941bbSAndroid Build Coastguard Worker 
1536*b7c941bbSAndroid Build Coastguard Worker     if (clazz != NULL) {
1537*b7c941bbSAndroid Build Coastguard Worker         return failure("Expected NULL but got %p", clazz);
1538*b7c941bbSAndroid Build Coastguard Worker     }
1539*b7c941bbSAndroid Build Coastguard Worker 
1540*b7c941bbSAndroid Build Coastguard Worker     return NULL;
1541*b7c941bbSAndroid Build Coastguard Worker }
1542*b7c941bbSAndroid Build Coastguard Worker 
1543*b7c941bbSAndroid Build Coastguard Worker // TODO: Missing functions:
1544*b7c941bbSAndroid Build Coastguard Worker //   DeleteLocalRef
1545*b7c941bbSAndroid Build Coastguard Worker //   DeleteWeakGlobalRef
1546*b7c941bbSAndroid Build Coastguard Worker //   EnsureLocalCapacity
1547*b7c941bbSAndroid Build Coastguard Worker //   ExceptionCheck
1548*b7c941bbSAndroid Build Coastguard Worker //   ExceptionClear
1549*b7c941bbSAndroid Build Coastguard Worker //   ExceptionDescribe
1550*b7c941bbSAndroid Build Coastguard Worker //   ExceptionOccurred
1551*b7c941bbSAndroid Build Coastguard Worker //   FatalError (Note: impossible to test in this framework)
1552*b7c941bbSAndroid Build Coastguard Worker //   FindClass
1553*b7c941bbSAndroid Build Coastguard Worker //   FromReflectedField
1554*b7c941bbSAndroid Build Coastguard Worker //   FromReflectedMethod
1555*b7c941bbSAndroid Build Coastguard Worker //   GetArrayLength
1556*b7c941bbSAndroid Build Coastguard Worker //   GetBooleanArrayElements
1557*b7c941bbSAndroid Build Coastguard Worker //   GetBooleanArrayRegion
1558*b7c941bbSAndroid Build Coastguard Worker //   GetBooleanField
1559*b7c941bbSAndroid Build Coastguard Worker //   GetByteArrayElements
1560*b7c941bbSAndroid Build Coastguard Worker //   GetByteArrayRegion
1561*b7c941bbSAndroid Build Coastguard Worker //   GetByteField
1562*b7c941bbSAndroid Build Coastguard Worker //   GetCharArrayElements
1563*b7c941bbSAndroid Build Coastguard Worker //   GetCharArrayRegion
1564*b7c941bbSAndroid Build Coastguard Worker //   GetCharField
1565*b7c941bbSAndroid Build Coastguard Worker //   GetDirectBufferAddress
1566*b7c941bbSAndroid Build Coastguard Worker //   GetDirectBufferCapacity
1567*b7c941bbSAndroid Build Coastguard Worker //   GetDoubleArrayElements
1568*b7c941bbSAndroid Build Coastguard Worker //   GetDoubleArrayRegion
1569*b7c941bbSAndroid Build Coastguard Worker //   GetDoubleField
1570*b7c941bbSAndroid Build Coastguard Worker //   GetFieldID
1571*b7c941bbSAndroid Build Coastguard Worker //   GetFloatArrayElements
1572*b7c941bbSAndroid Build Coastguard Worker //   GetFloatArrayRegion
1573*b7c941bbSAndroid Build Coastguard Worker //   GetFloatField
1574*b7c941bbSAndroid Build Coastguard Worker //   GetIntArrayElements
1575*b7c941bbSAndroid Build Coastguard Worker //   GetIntArrayRegion
1576*b7c941bbSAndroid Build Coastguard Worker //   GetIntField
1577*b7c941bbSAndroid Build Coastguard Worker //   GetJavaVM
1578*b7c941bbSAndroid Build Coastguard Worker //   GetLongArrayElements
1579*b7c941bbSAndroid Build Coastguard Worker //   GetLongArrayRegion
1580*b7c941bbSAndroid Build Coastguard Worker //   GetLongField
1581*b7c941bbSAndroid Build Coastguard Worker //   GetMethodID
1582*b7c941bbSAndroid Build Coastguard Worker //   GetObjectArrayElement
1583*b7c941bbSAndroid Build Coastguard Worker //   GetObjectClass
1584*b7c941bbSAndroid Build Coastguard Worker //   GetObjectField
1585*b7c941bbSAndroid Build Coastguard Worker //   GetObjectRefType (since 1.6)
1586*b7c941bbSAndroid Build Coastguard Worker //   GetPrimitiveArrayCritical
1587*b7c941bbSAndroid Build Coastguard Worker //   GetShortArrayElements
1588*b7c941bbSAndroid Build Coastguard Worker //   GetShortArrayRegion
1589*b7c941bbSAndroid Build Coastguard Worker //   GetShortField
1590*b7c941bbSAndroid Build Coastguard Worker //   GetStaticBooleanField
1591*b7c941bbSAndroid Build Coastguard Worker //   GetStaticByteField
1592*b7c941bbSAndroid Build Coastguard Worker //   GetStaticCharField
1593*b7c941bbSAndroid Build Coastguard Worker //   GetStaticDoubleField
1594*b7c941bbSAndroid Build Coastguard Worker //   GetStaticFieldID
1595*b7c941bbSAndroid Build Coastguard Worker //   GetStaticFloatField
1596*b7c941bbSAndroid Build Coastguard Worker //   GetStaticIntField
1597*b7c941bbSAndroid Build Coastguard Worker //   GetStaticLongField
1598*b7c941bbSAndroid Build Coastguard Worker //   GetStaticMethodID
1599*b7c941bbSAndroid Build Coastguard Worker //   GetStaticObjectField
1600*b7c941bbSAndroid Build Coastguard Worker //   GetStaticShortField
1601*b7c941bbSAndroid Build Coastguard Worker //   GetStringChars
1602*b7c941bbSAndroid Build Coastguard Worker //   GetStringCritical
1603*b7c941bbSAndroid Build Coastguard Worker //   GetStringLength
1604*b7c941bbSAndroid Build Coastguard Worker //   GetStringRegion
1605*b7c941bbSAndroid Build Coastguard Worker //   GetStringUTFChars
1606*b7c941bbSAndroid Build Coastguard Worker //   GetStringUTFLength
1607*b7c941bbSAndroid Build Coastguard Worker //   GetStringUTFRegion
1608*b7c941bbSAndroid Build Coastguard Worker //   GetSuperclass
1609*b7c941bbSAndroid Build Coastguard Worker 
TEST_DECLARATION(GetVersion)1610*b7c941bbSAndroid Build Coastguard Worker TEST_DECLARATION(GetVersion) {
1611*b7c941bbSAndroid Build Coastguard Worker     // Android implementations should all be at version 1.6.
1612*b7c941bbSAndroid Build Coastguard Worker     jint version = CALL(GetVersion);
1613*b7c941bbSAndroid Build Coastguard Worker 
1614*b7c941bbSAndroid Build Coastguard Worker     if (version != JNI_VERSION_1_6) {
1615*b7c941bbSAndroid Build Coastguard Worker         return failure("Expected JNI_VERSION_1_6 but got 0x%x", version);
1616*b7c941bbSAndroid Build Coastguard Worker     }
1617*b7c941bbSAndroid Build Coastguard Worker 
1618*b7c941bbSAndroid Build Coastguard Worker     return NULL;
1619*b7c941bbSAndroid Build Coastguard Worker }
1620*b7c941bbSAndroid Build Coastguard Worker 
1621*b7c941bbSAndroid Build Coastguard Worker // TODO: Missing functions:
1622*b7c941bbSAndroid Build Coastguard Worker //   IsAssignableFrom
1623*b7c941bbSAndroid Build Coastguard Worker //   IsInstanceOf
1624*b7c941bbSAndroid Build Coastguard Worker //   IsSameObject
1625*b7c941bbSAndroid Build Coastguard Worker //   MonitorEnter
1626*b7c941bbSAndroid Build Coastguard Worker //   MonitorExit
1627*b7c941bbSAndroid Build Coastguard Worker //   NewBooleanArray
1628*b7c941bbSAndroid Build Coastguard Worker //   NewByteArray
1629*b7c941bbSAndroid Build Coastguard Worker //   NewCharArray
1630*b7c941bbSAndroid Build Coastguard Worker //   NewDirectByteBuffer
1631*b7c941bbSAndroid Build Coastguard Worker //   NewDoubleArray
1632*b7c941bbSAndroid Build Coastguard Worker //   NewFloatArray
1633*b7c941bbSAndroid Build Coastguard Worker //   NewGlobalRef
1634*b7c941bbSAndroid Build Coastguard Worker //   NewIntArray
1635*b7c941bbSAndroid Build Coastguard Worker //   NewLocalRef
1636*b7c941bbSAndroid Build Coastguard Worker //   NewLongArray
1637*b7c941bbSAndroid Build Coastguard Worker //   NewObject
1638*b7c941bbSAndroid Build Coastguard Worker //   NewObjectA
1639*b7c941bbSAndroid Build Coastguard Worker //   NewObjectArray
1640*b7c941bbSAndroid Build Coastguard Worker //   NewObjectV
1641*b7c941bbSAndroid Build Coastguard Worker //   NewShortArray
1642*b7c941bbSAndroid Build Coastguard Worker //   NewString
1643*b7c941bbSAndroid Build Coastguard Worker //   NewStringUTF
1644*b7c941bbSAndroid Build Coastguard Worker //   NewWeakGlobalRef
1645*b7c941bbSAndroid Build Coastguard Worker //   PopLocalFrame
1646*b7c941bbSAndroid Build Coastguard Worker //   PushLocalFrame
1647*b7c941bbSAndroid Build Coastguard Worker //   RegisterNatives
1648*b7c941bbSAndroid Build Coastguard Worker //   ReleaseBooleanArrayElements
1649*b7c941bbSAndroid Build Coastguard Worker //   ReleaseByteArrayElements
1650*b7c941bbSAndroid Build Coastguard Worker //   ReleaseCharArrayElements
1651*b7c941bbSAndroid Build Coastguard Worker //   ReleaseDoubleArrayElements
1652*b7c941bbSAndroid Build Coastguard Worker //   ReleaseFloatArrayElements
1653*b7c941bbSAndroid Build Coastguard Worker //   ReleaseIntArrayElements
1654*b7c941bbSAndroid Build Coastguard Worker //   ReleaseLongArrayElements
1655*b7c941bbSAndroid Build Coastguard Worker //   ReleasePrimitiveArrayCritical
1656*b7c941bbSAndroid Build Coastguard Worker //   ReleaseShortArrayElements
1657*b7c941bbSAndroid Build Coastguard Worker //   ReleaseStringChars
1658*b7c941bbSAndroid Build Coastguard Worker //   ReleaseStringCritical
1659*b7c941bbSAndroid Build Coastguard Worker //   ReleaseStringUTFChars
1660*b7c941bbSAndroid Build Coastguard Worker //   SetBooleanArrayRegion
1661*b7c941bbSAndroid Build Coastguard Worker //   SetBooleanField
1662*b7c941bbSAndroid Build Coastguard Worker //   SetByteArrayRegion
1663*b7c941bbSAndroid Build Coastguard Worker //   SetByteField
1664*b7c941bbSAndroid Build Coastguard Worker //   SetCharArrayRegion
1665*b7c941bbSAndroid Build Coastguard Worker //   SetCharField
1666*b7c941bbSAndroid Build Coastguard Worker //   SetDoubleArrayRegion
1667*b7c941bbSAndroid Build Coastguard Worker //   SetDoubleField
1668*b7c941bbSAndroid Build Coastguard Worker //   SetFloatArrayRegion
1669*b7c941bbSAndroid Build Coastguard Worker //   SetFloatField
1670*b7c941bbSAndroid Build Coastguard Worker //   SetIntArrayRegion
1671*b7c941bbSAndroid Build Coastguard Worker //   SetIntField
1672*b7c941bbSAndroid Build Coastguard Worker //   SetLongArrayRegion
1673*b7c941bbSAndroid Build Coastguard Worker //   SetLongField
1674*b7c941bbSAndroid Build Coastguard Worker //   SetObjectArrayElement
1675*b7c941bbSAndroid Build Coastguard Worker //   SetObjectField
1676*b7c941bbSAndroid Build Coastguard Worker //   SetShortArrayRegion
1677*b7c941bbSAndroid Build Coastguard Worker //   SetShortField
1678*b7c941bbSAndroid Build Coastguard Worker //   SetStaticBooleanField
1679*b7c941bbSAndroid Build Coastguard Worker //   SetStaticByteField
1680*b7c941bbSAndroid Build Coastguard Worker //   SetStaticCharField
1681*b7c941bbSAndroid Build Coastguard Worker //   SetStaticDoubleField
1682*b7c941bbSAndroid Build Coastguard Worker //   SetStaticFloatField
1683*b7c941bbSAndroid Build Coastguard Worker //   SetStaticIntField
1684*b7c941bbSAndroid Build Coastguard Worker //   SetStaticLongField
1685*b7c941bbSAndroid Build Coastguard Worker //   SetStaticObjectField
1686*b7c941bbSAndroid Build Coastguard Worker //   SetStaticShortField
1687*b7c941bbSAndroid Build Coastguard Worker //   Throw
1688*b7c941bbSAndroid Build Coastguard Worker //   ThrowNew
1689*b7c941bbSAndroid Build Coastguard Worker //   ToReflectedField
1690*b7c941bbSAndroid Build Coastguard Worker //   ToReflectedMethod
1691*b7c941bbSAndroid Build Coastguard Worker //   UnregisterNatives
1692*b7c941bbSAndroid Build Coastguard Worker 
1693*b7c941bbSAndroid Build Coastguard Worker 
1694*b7c941bbSAndroid Build Coastguard Worker 
1695*b7c941bbSAndroid Build Coastguard Worker /**
1696*b7c941bbSAndroid Build Coastguard Worker  * Runs all the tests, returning NULL if they all succeeded, or
1697*b7c941bbSAndroid Build Coastguard Worker  * a string listing information about all the failures.
1698*b7c941bbSAndroid Build Coastguard Worker  */
runAllTests(JNIEnv * env)1699*b7c941bbSAndroid Build Coastguard Worker static jstring runAllTests(JNIEnv *env) {
1700*b7c941bbSAndroid Build Coastguard Worker     char *result = initializeVariables(env);
1701*b7c941bbSAndroid Build Coastguard Worker 
1702*b7c941bbSAndroid Build Coastguard Worker     if (CALL(ExceptionOccurred)) {
1703*b7c941bbSAndroid Build Coastguard Worker         CALL(ExceptionDescribe);
1704*b7c941bbSAndroid Build Coastguard Worker         CALL(ExceptionClear);
1705*b7c941bbSAndroid Build Coastguard Worker     }
1706*b7c941bbSAndroid Build Coastguard Worker 
1707*b7c941bbSAndroid Build Coastguard Worker     if (result == NULL) {
1708*b7c941bbSAndroid Build Coastguard Worker         result = runJniTests(env,
1709*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallBooleanMethod),
1710*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallBooleanMethodA),
1711*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallBooleanMethodV),
1712*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualBooleanMethod),
1713*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualBooleanMethodA),
1714*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualBooleanMethodV),
1715*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticBooleanMethod),
1716*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticBooleanMethodA),
1717*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticBooleanMethodV),
1718*b7c941bbSAndroid Build Coastguard Worker 
1719*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallByteMethod),
1720*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallByteMethodA),
1721*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallByteMethodV),
1722*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualByteMethod),
1723*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualByteMethodA),
1724*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualByteMethodV),
1725*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticByteMethod),
1726*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticByteMethodA),
1727*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticByteMethodV),
1728*b7c941bbSAndroid Build Coastguard Worker 
1729*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallShortMethod),
1730*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallShortMethodA),
1731*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallShortMethodV),
1732*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualShortMethod),
1733*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualShortMethodA),
1734*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualShortMethodV),
1735*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticShortMethod),
1736*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticShortMethodA),
1737*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticShortMethodV),
1738*b7c941bbSAndroid Build Coastguard Worker 
1739*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallCharMethod),
1740*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallCharMethodA),
1741*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallCharMethodV),
1742*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualCharMethod),
1743*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualCharMethodA),
1744*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualCharMethodV),
1745*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticCharMethod),
1746*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticCharMethodA),
1747*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticCharMethodV),
1748*b7c941bbSAndroid Build Coastguard Worker 
1749*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallIntMethod),
1750*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallIntMethodA),
1751*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallIntMethodV),
1752*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualIntMethod),
1753*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualIntMethodA),
1754*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualIntMethodV),
1755*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticIntMethod),
1756*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticIntMethodA),
1757*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticIntMethodV),
1758*b7c941bbSAndroid Build Coastguard Worker 
1759*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallLongMethod),
1760*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallLongMethodA),
1761*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallLongMethodV),
1762*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualLongMethod),
1763*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualLongMethodA),
1764*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualLongMethodV),
1765*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticLongMethod),
1766*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticLongMethodA),
1767*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticLongMethodV),
1768*b7c941bbSAndroid Build Coastguard Worker 
1769*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallFloatMethod),
1770*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallFloatMethodA),
1771*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallFloatMethodV),
1772*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualFloatMethod),
1773*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualFloatMethodA),
1774*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualFloatMethodV),
1775*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticFloatMethod),
1776*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticFloatMethodA),
1777*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticFloatMethodV),
1778*b7c941bbSAndroid Build Coastguard Worker 
1779*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallDoubleMethod),
1780*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallDoubleMethodA),
1781*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallDoubleMethodV),
1782*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualDoubleMethod),
1783*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualDoubleMethodA),
1784*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualDoubleMethodV),
1785*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticDoubleMethod),
1786*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticDoubleMethodA),
1787*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticDoubleMethodV),
1788*b7c941bbSAndroid Build Coastguard Worker 
1789*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallVoidMethod),
1790*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallVoidMethodA),
1791*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallVoidMethodV),
1792*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualVoidMethod),
1793*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualVoidMethodA),
1794*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualVoidMethodV),
1795*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticVoidMethod),
1796*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticVoidMethodA),
1797*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticVoidMethodV),
1798*b7c941bbSAndroid Build Coastguard Worker 
1799*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallObjectMethod),
1800*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallObjectMethodA),
1801*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallObjectMethodV),
1802*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualObjectMethod),
1803*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualObjectMethodA),
1804*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallNonvirtualObjectMethodV),
1805*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticObjectMethod),
1806*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticObjectMethodA),
1807*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(CallStaticObjectMethodV),
1808*b7c941bbSAndroid Build Coastguard Worker 
1809*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(TakeOneOfEach),
1810*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(TakeOneOfEachA),
1811*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(TakeOneOfEachV),
1812*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(NonvirtualTakeOneOfEach),
1813*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(NonvirtualTakeOneOfEachA),
1814*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(NonvirtualTakeOneOfEachV),
1815*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(StaticTakeOneOfEach),
1816*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(StaticTakeOneOfEachA),
1817*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(StaticTakeOneOfEachV),
1818*b7c941bbSAndroid Build Coastguard Worker 
1819*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(TakeCoolHandLuke),
1820*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(TakeCoolHandLukeA),
1821*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(TakeCoolHandLukeV),
1822*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(NonvirtualTakeCoolHandLuke),
1823*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(NonvirtualTakeCoolHandLukeA),
1824*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(NonvirtualTakeCoolHandLukeV),
1825*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(StaticTakeCoolHandLuke),
1826*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(StaticTakeCoolHandLukeA),
1827*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(StaticTakeCoolHandLukeV),
1828*b7c941bbSAndroid Build Coastguard Worker 
1829*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(DefineClass),
1830*b7c941bbSAndroid Build Coastguard Worker                 RUN_TEST(GetVersion),
1831*b7c941bbSAndroid Build Coastguard Worker                 NULL);
1832*b7c941bbSAndroid Build Coastguard Worker 
1833*b7c941bbSAndroid Build Coastguard Worker         // TODO: Add more tests, above.
1834*b7c941bbSAndroid Build Coastguard Worker     }
1835*b7c941bbSAndroid Build Coastguard Worker 
1836*b7c941bbSAndroid Build Coastguard Worker     if (result != NULL) {
1837*b7c941bbSAndroid Build Coastguard Worker         jstring s = CALL(NewStringUTF, result);
1838*b7c941bbSAndroid Build Coastguard Worker         free(result);
1839*b7c941bbSAndroid Build Coastguard Worker         return s;
1840*b7c941bbSAndroid Build Coastguard Worker     }
1841*b7c941bbSAndroid Build Coastguard Worker 
1842*b7c941bbSAndroid Build Coastguard Worker     return NULL;
1843*b7c941bbSAndroid Build Coastguard Worker }
1844