blob: e8ac08f471461aae1574a6cf8789ac556e93376d [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* These are all tests of JNI, but where the JNI calls themselves are
* represented as macro invocations. There are both C and C++ files which
* include this file. A #if at the top of this file (immediately below)
* detects which language is being used and defines macros accordingly.
*
* This file also defines a static method called runAllTests(), which
* does what it says.
*/
#ifndef INCLUDED_FROM_WRAPPER
#error "This file should only be compiled by including it from a wrapper file."
#endif
#include "helper.h"
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
/** reference to test class {@code InstanceFromNative} */
static jclass InstanceFromNative;
/** reference to test class {@code StaticFromNative} */
static jclass StaticFromNative;
/** reference to field {@code InstanceFromNative.theOne} */
static jfieldID InstanceFromNative_theOne;
/** reference to string {@code "biscuits"} */
static jstring biscuits;
/**
* how to call a method: (virtual, direct, static) x (standard, array of
* args, va_list) */
typedef enum {
VIRTUAL_PLAIN, VIRTUAL_ARRAY, VIRTUAL_VA,
DIRECT_PLAIN, DIRECT_ARRAY, DIRECT_VA,
STATIC_PLAIN, STATIC_ARRAY, STATIC_VA,
} callType;
/*
* CALL() calls the JNI function with the given name, using a JNIEnv
* pointer named "env", and passing along any other arguments given.
*/
#ifdef __cplusplus
#define CALL(name, args...) env->name(args)
#else
/*
* Note: The space before the comma below is significant with respect to
* the processing of the ## operator.
*/
#define CALL(name, args...) (*env)->name(env , ## args)
#endif
/**
* Simple assert-like macro which returns NULL if the two values are
* equal, or an error message if they aren't.
*/
#define FAIL_IF_UNEQUAL(printfType, expected, actual) \
((expected) == (actual)) ? NULL : \
failure("expected " printfType " but got " printfType, \
expected, actual);
/**
* Initializes the static variables. Returns NULL on success or an
* error string on failure.
*/
static char *initializeVariables(JNIEnv *env) {
jclass clazz;
jfieldID field;
clazz = CALL(FindClass, "android/jni/cts/StaticFromNative");
if (clazz == NULL) {
return failure("could not find StaticFromNative");
}
StaticFromNative = (jclass) CALL(NewGlobalRef, clazz);
clazz = CALL(FindClass, "android/jni/cts/InstanceFromNative");
if (clazz == NULL) {
return failure("could not find InstanceFromNative");
}
InstanceFromNative = (jclass) CALL(NewGlobalRef, clazz);
field = CALL(GetStaticFieldID, InstanceFromNative, "theOne",
"Landroid/jni/cts/InstanceFromNative;");
if (field == NULL) {
return failure("could not find InstanceFromNative.theOne");
}
InstanceFromNative_theOne = field;
biscuits = CALL(NewStringUTF, "biscuits");
if (biscuits == NULL) {
return failure("could not construct string");
}
biscuits = (jstring) CALL(NewGlobalRef, biscuits);
return NULL;
}
/**
* Gets the standard instance of InstanceFromNative.
*/
static jobject getStandardInstance(JNIEnv *env) {
return CALL(GetStaticObjectField, InstanceFromNative,
InstanceFromNative_theOne);
}
/**
* Looks up a static method on StaticFromNative.
*/
static jmethodID findStaticMethod(JNIEnv *env, char **errorMsg,
const char *name, const char *sig) {
jmethodID result = CALL(GetStaticMethodID, StaticFromNative,
name, sig);
if (result == NULL) {
*errorMsg = failure("could not find static test method %s:%s",
name, sig);
}
return result;
}
/**
* Looks up an instance method on InstanceFromNative.
*/
static jmethodID findInstanceMethod(JNIEnv *env, char **errorMsg,
const char *name, const char *sig) {
jmethodID result = CALL(GetMethodID, InstanceFromNative, name, sig);
if (result == NULL) {
*errorMsg = failure("could not find instance test method %s:%s",
name, sig);
}
return result;
}
/**
* Looks up either an instance method on InstanceFromNative or a
* static method on StaticFromNative, depending on the given
* call type.
*/
static jmethodID findAppropriateMethod(JNIEnv *env, char **errorMsg,
callType ct, const char *name, const char *sig) {
if ((ct == STATIC_PLAIN) || (ct == STATIC_ARRAY) ||
(ct == STATIC_VA)) {
return findStaticMethod(env, errorMsg, name, sig);
} else {
return findInstanceMethod(env, errorMsg, name, sig);
}
}
/*
* The tests.
*/
// TODO: Missing functions:
// AllocObject
static char *help_CallBooleanMethod(JNIEnv *env, int ct, ...) {
va_list args;
va_start(args, ct);
char *msg;
jobject o = getStandardInstance(env);
jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
"returnBoolean", "()Z");
if (method == NULL) {
va_end(args);
return msg;
}
jboolean result;
switch (ct) {
case VIRTUAL_PLAIN: {
result = CALL(CallBooleanMethod, o, method);
break;
}
case VIRTUAL_ARRAY: {
result = CALL(CallBooleanMethodA, o, method, NULL);
break;
}
case VIRTUAL_VA: {
result = CALL(CallBooleanMethodV, o, method, args);
break;
}
case DIRECT_PLAIN: {
result = CALL(CallNonvirtualBooleanMethod, o, InstanceFromNative,
method);
break;
}
case DIRECT_ARRAY: {
result = CALL(CallNonvirtualBooleanMethodA, o, InstanceFromNative,
method, NULL);
break;
}
case DIRECT_VA: {
result = CALL(CallNonvirtualBooleanMethodV, o, InstanceFromNative,
method, args);
break;
}
case STATIC_PLAIN: {
result = CALL(CallStaticBooleanMethod, StaticFromNative, method);
break;
}
case STATIC_ARRAY: {
result = CALL(CallStaticBooleanMethodA, StaticFromNative, method,
NULL);
break;
}
case STATIC_VA: {
result = CALL(CallStaticBooleanMethodV, StaticFromNative, method,
args);
break;
}
default: {
va_end(args);
return failure("shouldn't happen");
}
}
va_end(args);
return FAIL_IF_UNEQUAL("%d", true, result);
}
TEST_DECLARATION(CallBooleanMethod) {
return help_CallBooleanMethod(env, VIRTUAL_PLAIN);
}
TEST_DECLARATION(CallBooleanMethodA) {
return help_CallBooleanMethod(env, VIRTUAL_ARRAY);
}
TEST_DECLARATION(CallBooleanMethodV) {
return help_CallBooleanMethod(env, VIRTUAL_VA);
}
TEST_DECLARATION(CallNonvirtualBooleanMethod) {
return help_CallBooleanMethod(env, DIRECT_PLAIN);
}
TEST_DECLARATION(CallNonvirtualBooleanMethodA) {
return help_CallBooleanMethod(env, DIRECT_ARRAY);
}
TEST_DECLARATION(CallNonvirtualBooleanMethodV) {
return help_CallBooleanMethod(env, DIRECT_VA);
}
TEST_DECLARATION(CallStaticBooleanMethod) {
return help_CallBooleanMethod(env, STATIC_PLAIN);
}
TEST_DECLARATION(CallStaticBooleanMethodA) {
return help_CallBooleanMethod(env, STATIC_ARRAY);
}
TEST_DECLARATION(CallStaticBooleanMethodV) {
return help_CallBooleanMethod(env, STATIC_VA);
}
static char *help_CallByteMethod(JNIEnv *env, int ct, ...) {
va_list args;
va_start(args, ct);
char *msg;
jobject o = getStandardInstance(env);
jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
"returnByte", "()B");
if (method == NULL) {
va_end(args);
return msg;
}
jbyte result;
switch (ct) {
case VIRTUAL_PLAIN: {
result = CALL(CallByteMethod, o, method);
break;
}
case VIRTUAL_ARRAY: {
result = CALL(CallByteMethodA, o, method, NULL);
break;
}
case VIRTUAL_VA: {
result = CALL(CallByteMethodV, o, method, args);
break;
}
case DIRECT_PLAIN: {
result = CALL(CallNonvirtualByteMethod, o, InstanceFromNative,
method);
break;
}
case DIRECT_ARRAY: {
result = CALL(CallNonvirtualByteMethodA, o, InstanceFromNative,
method, NULL);
break;
}
case DIRECT_VA: {
result = CALL(CallNonvirtualByteMethodV, o, InstanceFromNative,
method, args);
break;
}
case STATIC_PLAIN: {
result = CALL(CallStaticByteMethod, StaticFromNative, method);
break;
}
case STATIC_ARRAY: {
result = CALL(CallStaticByteMethodA, StaticFromNative, method,
NULL);
break;
}
case STATIC_VA: {
result = CALL(CallStaticByteMethodV, StaticFromNative, method,
args);
break;
}
default: {
va_end(args);
return failure("shouldn't happen");
}
}
va_end(args);
return FAIL_IF_UNEQUAL("%d", 14, result);
}
TEST_DECLARATION(CallByteMethod) {
return help_CallByteMethod(env, VIRTUAL_PLAIN);
}
TEST_DECLARATION(CallByteMethodA) {
return help_CallByteMethod(env, VIRTUAL_ARRAY);
}
TEST_DECLARATION(CallByteMethodV) {
return help_CallByteMethod(env, VIRTUAL_VA);
}
TEST_DECLARATION(CallNonvirtualByteMethod) {
return help_CallByteMethod(env, DIRECT_PLAIN);
}
TEST_DECLARATION(CallNonvirtualByteMethodA) {
return help_CallByteMethod(env, DIRECT_ARRAY);
}
TEST_DECLARATION(CallNonvirtualByteMethodV) {
return help_CallByteMethod(env, DIRECT_VA);
}
TEST_DECLARATION(CallStaticByteMethod) {
return help_CallByteMethod(env, STATIC_PLAIN);
}
TEST_DECLARATION(CallStaticByteMethodA) {
return help_CallByteMethod(env, STATIC_ARRAY);
}
TEST_DECLARATION(CallStaticByteMethodV) {
return help_CallByteMethod(env, STATIC_VA);
}
static char *help_CallShortMethod(JNIEnv *env, int ct, ...) {
va_list args;
va_start(args, ct);
char *msg;
jobject o = getStandardInstance(env);
jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
"returnShort", "()S");
if (method == NULL) {
va_end(args);
return msg;
}
jshort result;
switch (ct) {
case VIRTUAL_PLAIN: {
result = CALL(CallShortMethod, o, method);
break;
}
case VIRTUAL_ARRAY: {
result = CALL(CallShortMethodA, o, method, NULL);
break;
}
case VIRTUAL_VA: {
result = CALL(CallShortMethodV, o, method, args);
break;
}
case DIRECT_PLAIN: {
result = CALL(CallNonvirtualShortMethod, o, InstanceFromNative,
method);
break;
}
case DIRECT_ARRAY: {
result = CALL(CallNonvirtualShortMethodA, o, InstanceFromNative,
method, NULL);
break;
}
case DIRECT_VA: {
result = CALL(CallNonvirtualShortMethodV, o, InstanceFromNative,
method, args);
break;
}
case STATIC_PLAIN: {
result = CALL(CallStaticShortMethod, StaticFromNative, method);
break;
}
case STATIC_ARRAY: {
result = CALL(CallStaticShortMethodA, StaticFromNative, method,
NULL);
break;
}
case STATIC_VA: {
result = CALL(CallStaticShortMethodV, StaticFromNative, method,
args);
break;
}
default: {
va_end(args);
return failure("shouldn't happen");
}
}
va_end(args);
return FAIL_IF_UNEQUAL("%d", -608, result);
}
TEST_DECLARATION(CallShortMethod) {
return help_CallShortMethod(env, VIRTUAL_PLAIN);
}
TEST_DECLARATION(CallShortMethodA) {
return help_CallShortMethod(env, VIRTUAL_ARRAY);
}
TEST_DECLARATION(CallShortMethodV) {
return help_CallShortMethod(env, VIRTUAL_VA);
}
TEST_DECLARATION(CallNonvirtualShortMethod) {
return help_CallShortMethod(env, DIRECT_PLAIN);
}
TEST_DECLARATION(CallNonvirtualShortMethodA) {
return help_CallShortMethod(env, DIRECT_ARRAY);
}
TEST_DECLARATION(CallNonvirtualShortMethodV) {
return help_CallShortMethod(env, DIRECT_VA);
}
TEST_DECLARATION(CallStaticShortMethod) {
return help_CallShortMethod(env, STATIC_PLAIN);
}
TEST_DECLARATION(CallStaticShortMethodA) {
return help_CallShortMethod(env, STATIC_ARRAY);
}
TEST_DECLARATION(CallStaticShortMethodV) {
return help_CallShortMethod(env, STATIC_VA);
}
static char *help_CallCharMethod(JNIEnv *env, int ct, ...) {
va_list args;
va_start(args, ct);
char *msg;
jobject o = getStandardInstance(env);
jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
"returnChar", "()C");
if (method == NULL) {
va_end(args);
return msg;
}
jchar result;
switch (ct) {
case VIRTUAL_PLAIN: {
result = CALL(CallCharMethod, o, method);
break;
}
case VIRTUAL_ARRAY: {
result = CALL(CallCharMethodA, o, method, NULL);
break;
}
case VIRTUAL_VA: {
result = CALL(CallCharMethodV, o, method, args);
break;
}
case DIRECT_PLAIN: {
result = CALL(CallNonvirtualCharMethod, o, InstanceFromNative,
method);
break;
}
case DIRECT_ARRAY: {
result = CALL(CallNonvirtualCharMethodA, o, InstanceFromNative,
method, NULL);
break;
}
case DIRECT_VA: {
result = CALL(CallNonvirtualCharMethodV, o, InstanceFromNative,
method, args);
break;
}
case STATIC_PLAIN: {
result = CALL(CallStaticCharMethod, StaticFromNative, method);
break;
}
case STATIC_ARRAY: {
result = CALL(CallStaticCharMethodA, StaticFromNative, method,
NULL);
break;
}
case STATIC_VA: {
result = CALL(CallStaticCharMethodV, StaticFromNative, method,
args);
break;
}
default: {
va_end(args);
return failure("shouldn't happen");
}
}
va_end(args);
return FAIL_IF_UNEQUAL("%d", 9000, result);
}
TEST_DECLARATION(CallCharMethod) {
return help_CallCharMethod(env, VIRTUAL_PLAIN);
}
TEST_DECLARATION(CallCharMethodA) {
return help_CallCharMethod(env, VIRTUAL_ARRAY);
}
TEST_DECLARATION(CallCharMethodV) {
return help_CallCharMethod(env, VIRTUAL_VA);
}
TEST_DECLARATION(CallNonvirtualCharMethod) {
return help_CallCharMethod(env, DIRECT_PLAIN);
}
TEST_DECLARATION(CallNonvirtualCharMethodA) {
return help_CallCharMethod(env, DIRECT_ARRAY);
}
TEST_DECLARATION(CallNonvirtualCharMethodV) {
return help_CallCharMethod(env, DIRECT_VA);
}
TEST_DECLARATION(CallStaticCharMethod) {
return help_CallCharMethod(env, STATIC_PLAIN);
}
TEST_DECLARATION(CallStaticCharMethodA) {
return help_CallCharMethod(env, STATIC_ARRAY);
}
TEST_DECLARATION(CallStaticCharMethodV) {
return help_CallCharMethod(env, STATIC_VA);
}
static char *help_CallIntMethod(JNIEnv *env, int ct, ...) {
va_list args;
va_start(args, ct);
char *msg;
jobject o = getStandardInstance(env);
jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
"returnInt", "()I");
if (method == NULL) {
va_end(args);
return msg;
}
jint result;
switch (ct) {
case VIRTUAL_PLAIN: {
result = CALL(CallIntMethod, o, method);
break;
}
case VIRTUAL_ARRAY: {
result = CALL(CallIntMethodA, o, method, NULL);
break;
}
case VIRTUAL_VA: {
result = CALL(CallIntMethodV, o, method, args);
break;
}
case DIRECT_PLAIN: {
result = CALL(CallNonvirtualIntMethod, o, InstanceFromNative,
method);
break;
}
case DIRECT_ARRAY: {
result = CALL(CallNonvirtualIntMethodA, o, InstanceFromNative,
method, NULL);
break;
}
case DIRECT_VA: {
result = CALL(CallNonvirtualIntMethodV, o, InstanceFromNative,
method, args);
break;
}
case STATIC_PLAIN: {
result = CALL(CallStaticIntMethod, StaticFromNative, method);
break;
}
case STATIC_ARRAY: {
result = CALL(CallStaticIntMethodA, StaticFromNative, method,
NULL);
break;
}
case STATIC_VA: {
result = CALL(CallStaticIntMethodV, StaticFromNative, method,
args);
break;
}
default: {
va_end(args);
return failure("shouldn't happen");
}
}
va_end(args);
return FAIL_IF_UNEQUAL("%d", 4004004, result);
}
TEST_DECLARATION(CallIntMethod) {
return help_CallIntMethod(env, VIRTUAL_PLAIN);
}
TEST_DECLARATION(CallIntMethodA) {
return help_CallIntMethod(env, VIRTUAL_ARRAY);
}
TEST_DECLARATION(CallIntMethodV) {
return help_CallIntMethod(env, VIRTUAL_VA);
}
TEST_DECLARATION(CallNonvirtualIntMethod) {
return help_CallIntMethod(env, DIRECT_PLAIN);
}
TEST_DECLARATION(CallNonvirtualIntMethodA) {
return help_CallIntMethod(env, DIRECT_ARRAY);
}
TEST_DECLARATION(CallNonvirtualIntMethodV) {
return help_CallIntMethod(env, DIRECT_VA);
}
TEST_DECLARATION(CallStaticIntMethod) {
return help_CallIntMethod(env, STATIC_PLAIN);
}
TEST_DECLARATION(CallStaticIntMethodA) {
return help_CallIntMethod(env, STATIC_ARRAY);
}
TEST_DECLARATION(CallStaticIntMethodV) {
return help_CallIntMethod(env, STATIC_VA);
}
static char *help_CallLongMethod(JNIEnv *env, int ct, ...) {
va_list args;
va_start(args, ct);
char *msg;
jobject o = getStandardInstance(env);
jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
"returnLong", "()J");
if (method == NULL) {
va_end(args);
return msg;
}
jlong result;
switch (ct) {
case VIRTUAL_PLAIN: {
result = CALL(CallLongMethod, o, method);
break;
}
case VIRTUAL_ARRAY: {
result = CALL(CallLongMethodA, o, method, NULL);
break;
}
case VIRTUAL_VA: {
result = CALL(CallLongMethodV, o, method, args);
break;
}
case DIRECT_PLAIN: {
result = CALL(CallNonvirtualLongMethod, o, InstanceFromNative,
method);
break;
}
case DIRECT_ARRAY: {
result = CALL(CallNonvirtualLongMethodA, o, InstanceFromNative,
method, NULL);
break;
}
case DIRECT_VA: {
result = CALL(CallNonvirtualLongMethodV, o, InstanceFromNative,
method, args);
break;
}
case STATIC_PLAIN: {
result = CALL(CallStaticLongMethod, StaticFromNative, method);
break;
}
case STATIC_ARRAY: {
result = CALL(CallStaticLongMethodA, StaticFromNative, method,
NULL);
break;
}
case STATIC_VA: {
result = CALL(CallStaticLongMethodV, StaticFromNative, method,
args);
break;
}
default: {
va_end(args);
return failure("shouldn't happen");
}
}
va_end(args);
return FAIL_IF_UNEQUAL("%lld", -80080080087LL, result);
}
TEST_DECLARATION(CallLongMethod) {
return help_CallLongMethod(env, VIRTUAL_PLAIN);
}
TEST_DECLARATION(CallLongMethodA) {
return help_CallLongMethod(env, VIRTUAL_ARRAY);
}
TEST_DECLARATION(CallLongMethodV) {
return help_CallLongMethod(env, VIRTUAL_VA);
}
TEST_DECLARATION(CallNonvirtualLongMethod) {
return help_CallLongMethod(env, DIRECT_PLAIN);
}
TEST_DECLARATION(CallNonvirtualLongMethodA) {
return help_CallLongMethod(env, DIRECT_ARRAY);
}
TEST_DECLARATION(CallNonvirtualLongMethodV) {
return help_CallLongMethod(env, DIRECT_VA);
}
TEST_DECLARATION(CallStaticLongMethod) {
return help_CallLongMethod(env, STATIC_PLAIN);
}
TEST_DECLARATION(CallStaticLongMethodA) {
return help_CallLongMethod(env, STATIC_ARRAY);
}
TEST_DECLARATION(CallStaticLongMethodV) {
return help_CallLongMethod(env, STATIC_VA);
}
static char *help_CallFloatMethod(JNIEnv *env, int ct, ...) {
va_list args;
va_start(args, ct);
char *msg;
jobject o = getStandardInstance(env);
jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
"returnFloat", "()F");
if (method == NULL) {
va_end(args);
return msg;
}
jfloat result;
switch (ct) {
case VIRTUAL_PLAIN: {
result = CALL(CallFloatMethod, o, method);
break;
}
case VIRTUAL_ARRAY: {
result = CALL(CallFloatMethodA, o, method, NULL);
break;
}
case VIRTUAL_VA: {
result = CALL(CallFloatMethodV, o, method, args);
break;
}
case DIRECT_PLAIN: {
result = CALL(CallNonvirtualFloatMethod, o, InstanceFromNative,
method);
break;
}
case DIRECT_ARRAY: {
result = CALL(CallNonvirtualFloatMethodA, o, InstanceFromNative,
method, NULL);
break;
}
case DIRECT_VA: {
result = CALL(CallNonvirtualFloatMethodV, o, InstanceFromNative,
method, args);
break;
}
case STATIC_PLAIN: {
result = CALL(CallStaticFloatMethod, StaticFromNative, method);
break;
}
case STATIC_ARRAY: {
result = CALL(CallStaticFloatMethodA, StaticFromNative, method,
NULL);
break;
}
case STATIC_VA: {
result = CALL(CallStaticFloatMethodV, StaticFromNative, method,
args);
break;
}
default: {
va_end(args);
return failure("shouldn't happen");
}
}
va_end(args);
return FAIL_IF_UNEQUAL("%g", 2.5e22f, result);
}
TEST_DECLARATION(CallFloatMethod) {
return help_CallFloatMethod(env, VIRTUAL_PLAIN);
}
TEST_DECLARATION(CallFloatMethodA) {
return help_CallFloatMethod(env, VIRTUAL_ARRAY);
}
TEST_DECLARATION(CallFloatMethodV) {
return help_CallFloatMethod(env, VIRTUAL_VA);
}
TEST_DECLARATION(CallNonvirtualFloatMethod) {
return help_CallFloatMethod(env, DIRECT_PLAIN);
}
TEST_DECLARATION(CallNonvirtualFloatMethodA) {
return help_CallFloatMethod(env, DIRECT_ARRAY);
}
TEST_DECLARATION(CallNonvirtualFloatMethodV) {
return help_CallFloatMethod(env, DIRECT_VA);
}
TEST_DECLARATION(CallStaticFloatMethod) {
return help_CallFloatMethod(env, STATIC_PLAIN);
}
TEST_DECLARATION(CallStaticFloatMethodA) {
return help_CallFloatMethod(env, STATIC_ARRAY);
}
TEST_DECLARATION(CallStaticFloatMethodV) {
return help_CallFloatMethod(env, STATIC_VA);
}
static char *help_CallDoubleMethod(JNIEnv *env, int ct, ...) {
va_list args;
va_start(args, ct);
char *msg;
jobject o = getStandardInstance(env);
jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
"returnDouble", "()D");
if (method == NULL) {
va_end(args);
return msg;
}
jdouble result;
switch (ct) {
case VIRTUAL_PLAIN: {
result = CALL(CallDoubleMethod, o, method);
break;
}
case VIRTUAL_ARRAY: {
result = CALL(CallDoubleMethodA, o, method, NULL);
break;
}
case VIRTUAL_VA: {
result = CALL(CallDoubleMethodV, o, method, args);
break;
}
case DIRECT_PLAIN: {
result = CALL(CallNonvirtualDoubleMethod, o, InstanceFromNative,
method);
break;
}
case DIRECT_ARRAY: {
result = CALL(CallNonvirtualDoubleMethodA, o, InstanceFromNative,
method, NULL);
break;
}
case DIRECT_VA: {
result = CALL(CallNonvirtualDoubleMethodV, o, InstanceFromNative,
method, args);
break;
}
case STATIC_PLAIN: {
result = CALL(CallStaticDoubleMethod, StaticFromNative, method);
break;
}
case STATIC_ARRAY: {
result = CALL(CallStaticDoubleMethodA, StaticFromNative, method,
NULL);
break;
}
case STATIC_VA: {
result = CALL(CallStaticDoubleMethodV, StaticFromNative, method,
args);
break;
}
default: {
va_end(args);
return failure("shouldn't happen");
}
}
va_end(args);
return FAIL_IF_UNEQUAL("%g", 7.503e100, result);
}
TEST_DECLARATION(CallDoubleMethod) {
return help_CallDoubleMethod(env, VIRTUAL_PLAIN);
}
TEST_DECLARATION(CallDoubleMethodA) {
return help_CallDoubleMethod(env, VIRTUAL_ARRAY);
}
TEST_DECLARATION(CallDoubleMethodV) {
return help_CallDoubleMethod(env, VIRTUAL_VA);
}
TEST_DECLARATION(CallNonvirtualDoubleMethod) {
return help_CallDoubleMethod(env, DIRECT_PLAIN);
}
TEST_DECLARATION(CallNonvirtualDoubleMethodA) {
return help_CallDoubleMethod(env, DIRECT_ARRAY);
}
TEST_DECLARATION(CallNonvirtualDoubleMethodV) {
return help_CallDoubleMethod(env, DIRECT_VA);
}
TEST_DECLARATION(CallStaticDoubleMethod) {
return help_CallDoubleMethod(env, STATIC_PLAIN);
}
TEST_DECLARATION(CallStaticDoubleMethodA) {
return help_CallDoubleMethod(env, STATIC_ARRAY);
}
TEST_DECLARATION(CallStaticDoubleMethodV) {
return help_CallDoubleMethod(env, STATIC_VA);
}
static char *help_CallVoidMethod(JNIEnv *env, int ct, ...) {
va_list args;
va_start(args, ct);
char *msg;
jobject o = getStandardInstance(env);
jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
"nop", "()V");
if (method == NULL) {
va_end(args);
return msg;
}
// For these, we simply consider "success" to be "didn't crash."
switch (ct) {
case VIRTUAL_PLAIN: {
CALL(CallVoidMethod, o, method);
break;
}
case VIRTUAL_ARRAY: {
CALL(CallVoidMethodA, o, method, NULL);
break;
}
case VIRTUAL_VA: {
CALL(CallVoidMethodV, o, method, args);
break;
}
case DIRECT_PLAIN: {
CALL(CallNonvirtualVoidMethod, o, InstanceFromNative,
method);
break;
}
case DIRECT_ARRAY: {
CALL(CallNonvirtualVoidMethodA, o, InstanceFromNative,
method, NULL);
break;
}
case DIRECT_VA: {
CALL(CallNonvirtualVoidMethodV, o, InstanceFromNative,
method, args);
break;
}
case STATIC_PLAIN: {
CALL(CallStaticVoidMethod, StaticFromNative, method);
break;
}
case STATIC_ARRAY: {
CALL(CallStaticVoidMethodA, StaticFromNative, method,
NULL);
break;
}
case STATIC_VA: {
CALL(CallStaticVoidMethodV, StaticFromNative, method,
args);
break;
}
default: {
va_end(args);
return failure("shouldn't happen");
}
}
va_end(args);
return NULL;
}
TEST_DECLARATION(CallVoidMethod) {
return help_CallVoidMethod(env, VIRTUAL_PLAIN);
}
TEST_DECLARATION(CallVoidMethodA) {
return help_CallVoidMethod(env, VIRTUAL_ARRAY);
}
TEST_DECLARATION(CallVoidMethodV) {
return help_CallVoidMethod(env, VIRTUAL_VA);
}
TEST_DECLARATION(CallNonvirtualVoidMethod) {
return help_CallVoidMethod(env, DIRECT_PLAIN);
}
TEST_DECLARATION(CallNonvirtualVoidMethodA) {
return help_CallVoidMethod(env, DIRECT_ARRAY);
}
TEST_DECLARATION(CallNonvirtualVoidMethodV) {
return help_CallVoidMethod(env, DIRECT_VA);
}
TEST_DECLARATION(CallStaticVoidMethod) {
return help_CallVoidMethod(env, STATIC_PLAIN);
}
TEST_DECLARATION(CallStaticVoidMethodA) {
return help_CallVoidMethod(env, STATIC_ARRAY);
}
TEST_DECLARATION(CallStaticVoidMethodV) {
return help_CallVoidMethod(env, STATIC_VA);
}
static char *help_CallObjectMethod(JNIEnv *env, int ct, ...) {
va_list args;
va_start(args, ct);
char *msg;
jobject o = getStandardInstance(env);
jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
"returnString", "()Ljava/lang/String;");
if (method == NULL) {
va_end(args);
return msg;
}
jstring result;
switch (ct) {
case VIRTUAL_PLAIN: {
result = (jstring) CALL(CallObjectMethod, o, method);
break;
}
case VIRTUAL_ARRAY: {
result = (jstring) CALL(CallObjectMethodA, o, method, NULL);
break;
}
case VIRTUAL_VA: {
result = (jstring) CALL(CallObjectMethodV, o, method, args);
break;
}
case DIRECT_PLAIN: {
result = (jstring)
CALL(CallNonvirtualObjectMethod, o, InstanceFromNative,
method);
break;
}
case DIRECT_ARRAY: {
result = (jstring)
CALL(CallNonvirtualObjectMethodA, o, InstanceFromNative,
method, NULL);
break;
}
case DIRECT_VA: {
result = (jstring)
CALL(CallNonvirtualObjectMethodV, o, InstanceFromNative,
method, args);
break;
}
case STATIC_PLAIN: {
result = (jstring)
CALL(CallStaticObjectMethod, StaticFromNative, method);
break;
}
case STATIC_ARRAY: {
result = (jstring)
CALL(CallStaticObjectMethodA, StaticFromNative, method, NULL);
break;
}
case STATIC_VA: {
result = (jstring)
CALL(CallStaticObjectMethodV, StaticFromNative, method, args);
break;
}
default: {
va_end(args);
return failure("shouldn't happen");
}
}
va_end(args);
if (result == NULL) {
return failure("got null from call");
}
const char *utf = CALL(GetStringUTFChars, result, NULL);
if (strcmp(utf, "muffins") == 0) {
msg = NULL;
} else {
msg = failure("unexpected string: %s", utf);
}
CALL(ReleaseStringUTFChars, result, utf);
return msg;
}
TEST_DECLARATION(CallObjectMethod) {
return help_CallObjectMethod(env, VIRTUAL_PLAIN);
}
TEST_DECLARATION(CallObjectMethodA) {
return help_CallObjectMethod(env, VIRTUAL_ARRAY);
}
TEST_DECLARATION(CallObjectMethodV) {
return help_CallObjectMethod(env, VIRTUAL_VA);
}
TEST_DECLARATION(CallNonvirtualObjectMethod) {
return help_CallObjectMethod(env, DIRECT_PLAIN);
}
TEST_DECLARATION(CallNonvirtualObjectMethodA) {
return help_CallObjectMethod(env, DIRECT_ARRAY);
}
TEST_DECLARATION(CallNonvirtualObjectMethodV) {
return help_CallObjectMethod(env, DIRECT_VA);
}
TEST_DECLARATION(CallStaticObjectMethod) {
return help_CallObjectMethod(env, STATIC_PLAIN);
}
TEST_DECLARATION(CallStaticObjectMethodA) {
return help_CallObjectMethod(env, STATIC_ARRAY);
}
TEST_DECLARATION(CallStaticObjectMethodV) {
return help_CallObjectMethod(env, STATIC_VA);
}
static char *help_TakeOneOfEach(JNIEnv *env, int ct, ...) {
va_list args;
va_start(args, ct);
char *msg;
jobject o = getStandardInstance(env);
jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
"takeOneOfEach", "(DFJICSBZLjava/lang/String;)Z");
if (method == NULL) {
va_end(args);
return msg;
}
jvalue jargs[] = {
{d: 0.0}, {f: 1.0f}, {j: 2LL}, {i: 3}, {c: 4}, {s: 5}, {b: 6},
{z: true}, {l: biscuits}
};
jboolean result;
switch (ct) {
case VIRTUAL_PLAIN: {
result = CALL(CallBooleanMethod, o, method,
0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
(jboolean) true, biscuits);
break;
}
case VIRTUAL_ARRAY: {
result = CALL(CallBooleanMethodA, o, method, jargs);
break;
}
case VIRTUAL_VA: {
result = CALL(CallBooleanMethodV, o, method, args);
break;
}
case DIRECT_PLAIN: {
result = CALL(CallNonvirtualBooleanMethod, o, InstanceFromNative,
method,
0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
(jboolean) true, biscuits);
break;
}
case DIRECT_ARRAY: {
result = CALL(CallNonvirtualBooleanMethodA, o, InstanceFromNative,
method, jargs);
break;
}
case DIRECT_VA: {
result = CALL(CallNonvirtualBooleanMethodV, o, InstanceFromNative,
method, args);
break;
}
case STATIC_PLAIN: {
result = CALL(CallStaticBooleanMethod, StaticFromNative, method,
0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
(jboolean) true, biscuits);
break;
}
case STATIC_ARRAY: {
result = CALL(CallStaticBooleanMethodA, StaticFromNative, method,
jargs);
break;
}
case STATIC_VA: {
result = CALL(CallStaticBooleanMethodV, StaticFromNative, method,
args);
break;
}
default: {
va_end(args);
return failure("shouldn't happen");
}
}
va_end(args);
return FAIL_IF_UNEQUAL("%d", true, result);
}
TEST_DECLARATION(TakeOneOfEach) {
return help_TakeOneOfEach(env, VIRTUAL_PLAIN);
}
TEST_DECLARATION(TakeOneOfEachA) {
return help_TakeOneOfEach(env, VIRTUAL_ARRAY);
}
TEST_DECLARATION(TakeOneOfEachV) {
return help_TakeOneOfEach(env, VIRTUAL_VA,
0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
(jboolean) true, biscuits);
}
TEST_DECLARATION(NonvirtualTakeOneOfEach) {
return help_TakeOneOfEach(env, DIRECT_PLAIN);
}
TEST_DECLARATION(NonvirtualTakeOneOfEachA) {
return help_TakeOneOfEach(env, DIRECT_ARRAY);
}
TEST_DECLARATION(NonvirtualTakeOneOfEachV) {
return help_TakeOneOfEach(env, DIRECT_VA,
0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
(jboolean) true, biscuits);
}
TEST_DECLARATION(StaticTakeOneOfEach) {
return help_TakeOneOfEach(env, STATIC_PLAIN);
}
TEST_DECLARATION(StaticTakeOneOfEachA) {
return help_TakeOneOfEach(env, STATIC_ARRAY);
}
TEST_DECLARATION(StaticTakeOneOfEachV) {
return help_TakeOneOfEach(env, STATIC_VA,
0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
(jboolean) true, biscuits);
}
static char *help_TakeCoolHandLuke(JNIEnv *env, int ct, ...) {
va_list args;
va_start(args, ct);
char *msg;
jobject o = getStandardInstance(env);
jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
"takeCoolHandLuke",
"(IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII)Z");
if (method == NULL) {
va_end(args);
return msg;
}
jvalue jargs[] = {
{i: 1}, {i: 2}, {i: 3}, {i: 4},
{i: 5}, {i: 6}, {i: 7}, {i: 8}, {i: 9},
{i: 10}, {i: 11}, {i: 12}, {i: 13}, {i: 14},
{i: 15}, {i: 16}, {i: 17}, {i: 18}, {i: 19},
{i: 20}, {i: 21}, {i: 22}, {i: 23}, {i: 24},
{i: 25}, {i: 26}, {i: 27}, {i: 28}, {i: 29},
{i: 30}, {i: 31}, {i: 32}, {i: 33}, {i: 34},
{i: 35}, {i: 36}, {i: 37}, {i: 38}, {i: 39},
{i: 40}, {i: 41}, {i: 42}, {i: 43}, {i: 44},
{i: 45}, {i: 46}, {i: 47}, {i: 48}, {i: 49},
{i: 50}
};
jboolean result;
switch (ct) {
case VIRTUAL_PLAIN: {
result = CALL(CallBooleanMethod, o, method,
1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
50);
break;
}
case VIRTUAL_ARRAY: {
result = CALL(CallBooleanMethodA, o, method, jargs);
break;
}
case VIRTUAL_VA: {
result = CALL(CallBooleanMethodV, o, method, args);
break;
}
case DIRECT_PLAIN: {
result = CALL(CallNonvirtualBooleanMethod, o, InstanceFromNative,
method,
1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
50);
break;
}
case DIRECT_ARRAY: {
result = CALL(CallNonvirtualBooleanMethodA, o, InstanceFromNative,
method, jargs);
break;
}
case DIRECT_VA: {
result = CALL(CallNonvirtualBooleanMethodV, o, InstanceFromNative,
method, args);
break;
}
case STATIC_PLAIN: {
result = CALL(CallStaticBooleanMethod, StaticFromNative, method,
1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
50);
break;
}
case STATIC_ARRAY: {
result = CALL(CallStaticBooleanMethodA, StaticFromNative, method,
jargs);
break;
}
case STATIC_VA: {
result = CALL(CallStaticBooleanMethodV, StaticFromNative, method,
args);
break;
}
default: {
va_end(args);
return failure("shouldn't happen");
}
}
va_end(args);
return FAIL_IF_UNEQUAL("%d", true, result);
}
TEST_DECLARATION(TakeCoolHandLuke) {
return help_TakeCoolHandLuke(env, VIRTUAL_PLAIN);
}
TEST_DECLARATION(TakeCoolHandLukeA) {
return help_TakeCoolHandLuke(env, VIRTUAL_ARRAY);
}
TEST_DECLARATION(TakeCoolHandLukeV) {
return help_TakeCoolHandLuke(env, VIRTUAL_VA,
1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
50);
}
TEST_DECLARATION(NonvirtualTakeCoolHandLuke) {
return help_TakeCoolHandLuke(env, DIRECT_PLAIN);
}
TEST_DECLARATION(NonvirtualTakeCoolHandLukeA) {
return help_TakeCoolHandLuke(env, DIRECT_ARRAY);
}
TEST_DECLARATION(NonvirtualTakeCoolHandLukeV) {
return help_TakeCoolHandLuke(env, DIRECT_VA,
1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
50);
}
TEST_DECLARATION(StaticTakeCoolHandLuke) {
return help_TakeCoolHandLuke(env, STATIC_PLAIN);
}
TEST_DECLARATION(StaticTakeCoolHandLukeA) {
return help_TakeCoolHandLuke(env, STATIC_ARRAY);
}
TEST_DECLARATION(StaticTakeCoolHandLukeV) {
return help_TakeCoolHandLuke(env, STATIC_VA,
1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
50);
}
TEST_DECLARATION(DefineClass) {
// Android implementations should always return NULL.
jclass clazz = CALL(DefineClass, "foo", NULL, NULL, 0);
if (clazz != NULL) {
return failure("Expected NULL but got %p", clazz);
}
return NULL;
}
// TODO: Missing functions:
// DeleteLocalRef
// DeleteWeakGlobalRef
// EnsureLocalCapacity
// ExceptionCheck
// ExceptionClear
// ExceptionDescribe
// ExceptionOccurred
// FatalError (Note: impossible to test in this framework)
// FindClass
// FromReflectedField
// FromReflectedMethod
// GetArrayLength
// GetBooleanArrayElements
// GetBooleanArrayRegion
// GetBooleanField
// GetByteArrayElements
// GetByteArrayRegion
// GetByteField
// GetCharArrayElements
// GetCharArrayRegion
// GetCharField
// GetDirectBufferAddress
// GetDirectBufferCapacity
// GetDoubleArrayElements
// GetDoubleArrayRegion
// GetDoubleField
// GetFieldID
// GetFloatArrayElements
// GetFloatArrayRegion
// GetFloatField
// GetIntArrayElements
// GetIntArrayRegion
// GetIntField
// GetJavaVM
// GetLongArrayElements
// GetLongArrayRegion
// GetLongField
// GetMethodID
// GetObjectArrayElement
// GetObjectClass
// GetObjectField
// GetObjectRefType (since 1.6)
// GetPrimitiveArrayCritical
// GetShortArrayElements
// GetShortArrayRegion
// GetShortField
// GetStaticBooleanField
// GetStaticByteField
// GetStaticCharField
// GetStaticDoubleField
// GetStaticFieldID
// GetStaticFloatField
// GetStaticIntField
// GetStaticLongField
// GetStaticMethodID
// GetStaticObjectField
// GetStaticShortField
// GetStringChars
// GetStringCritical
// GetStringLength
// GetStringRegion
// GetStringUTFChars
// GetStringUTFLength
// GetStringUTFRegion
// GetSuperclass
TEST_DECLARATION(GetVersion) {
// Android implementations should all be at version 1.6.
jint version = CALL(GetVersion);
if (version != JNI_VERSION_1_6) {
return failure("Expected JNI_VERSION_1_6 but got 0x%x", version);
}
return NULL;
}
// TODO: Missing functions:
// IsAssignableFrom
// IsInstanceOf
// IsSameObject
// MonitorEnter
// MonitorExit
// NewBooleanArray
// NewByteArray
// NewCharArray
// NewDirectByteBuffer
// NewDoubleArray
// NewFloatArray
// NewGlobalRef
// NewIntArray
// NewLocalRef
// NewLongArray
// NewObject
// NewObjectA
// NewObjectArray
// NewObjectV
// NewShortArray
// NewString
// NewStringUTF
// NewWeakGlobalRef
// PopLocalFrame
// PushLocalFrame
// RegisterNatives
// ReleaseBooleanArrayElements
// ReleaseByteArrayElements
// ReleaseCharArrayElements
// ReleaseDoubleArrayElements
// ReleaseFloatArrayElements
// ReleaseIntArrayElements
// ReleaseLongArrayElements
// ReleasePrimitiveArrayCritical
// ReleaseShortArrayElements
// ReleaseStringChars
// ReleaseStringCritical
// ReleaseStringUTFChars
// SetBooleanArrayRegion
// SetBooleanField
// SetByteArrayRegion
// SetByteField
// SetCharArrayRegion
// SetCharField
// SetDoubleArrayRegion
// SetDoubleField
// SetFloatArrayRegion
// SetFloatField
// SetIntArrayRegion
// SetIntField
// SetLongArrayRegion
// SetLongField
// SetObjectArrayElement
// SetObjectField
// SetShortArrayRegion
// SetShortField
// SetStaticBooleanField
// SetStaticByteField
// SetStaticCharField
// SetStaticDoubleField
// SetStaticFloatField
// SetStaticIntField
// SetStaticLongField
// SetStaticObjectField
// SetStaticShortField
// Throw
// ThrowNew
// ToReflectedField
// ToReflectedMethod
// UnregisterNatives
/**
* Runs all the tests, returning NULL if they all succeeded, or
* a string listing information about all the failures.
*/
static jstring runAllTests(JNIEnv *env) {
char *result = initializeVariables(env);
if (CALL(ExceptionOccurred)) {
CALL(ExceptionDescribe);
CALL(ExceptionClear);
}
if (result == NULL) {
result = runJniTests(env,
RUN_TEST(CallBooleanMethod),
RUN_TEST(CallBooleanMethodA),
RUN_TEST(CallBooleanMethodV),
RUN_TEST(CallNonvirtualBooleanMethod),
RUN_TEST(CallNonvirtualBooleanMethodA),
RUN_TEST(CallNonvirtualBooleanMethodV),
RUN_TEST(CallStaticBooleanMethod),
RUN_TEST(CallStaticBooleanMethodA),
RUN_TEST(CallStaticBooleanMethodV),
RUN_TEST(CallByteMethod),
RUN_TEST(CallByteMethodA),
RUN_TEST(CallByteMethodV),
RUN_TEST(CallNonvirtualByteMethod),
RUN_TEST(CallNonvirtualByteMethodA),
RUN_TEST(CallNonvirtualByteMethodV),
RUN_TEST(CallStaticByteMethod),
RUN_TEST(CallStaticByteMethodA),
RUN_TEST(CallStaticByteMethodV),
RUN_TEST(CallShortMethod),
RUN_TEST(CallShortMethodA),
RUN_TEST(CallShortMethodV),
RUN_TEST(CallNonvirtualShortMethod),
RUN_TEST(CallNonvirtualShortMethodA),
RUN_TEST(CallNonvirtualShortMethodV),
RUN_TEST(CallStaticShortMethod),
RUN_TEST(CallStaticShortMethodA),
RUN_TEST(CallStaticShortMethodV),
RUN_TEST(CallCharMethod),
RUN_TEST(CallCharMethodA),
RUN_TEST(CallCharMethodV),
RUN_TEST(CallNonvirtualCharMethod),
RUN_TEST(CallNonvirtualCharMethodA),
RUN_TEST(CallNonvirtualCharMethodV),
RUN_TEST(CallStaticCharMethod),
RUN_TEST(CallStaticCharMethodA),
RUN_TEST(CallStaticCharMethodV),
RUN_TEST(CallIntMethod),
RUN_TEST(CallIntMethodA),
RUN_TEST(CallIntMethodV),
RUN_TEST(CallNonvirtualIntMethod),
RUN_TEST(CallNonvirtualIntMethodA),
RUN_TEST(CallNonvirtualIntMethodV),
RUN_TEST(CallStaticIntMethod),
RUN_TEST(CallStaticIntMethodA),
RUN_TEST(CallStaticIntMethodV),
RUN_TEST(CallLongMethod),
RUN_TEST(CallLongMethodA),
RUN_TEST(CallLongMethodV),
RUN_TEST(CallNonvirtualLongMethod),
RUN_TEST(CallNonvirtualLongMethodA),
RUN_TEST(CallNonvirtualLongMethodV),
RUN_TEST(CallStaticLongMethod),
RUN_TEST(CallStaticLongMethodA),
RUN_TEST(CallStaticLongMethodV),
RUN_TEST(CallFloatMethod),
RUN_TEST(CallFloatMethodA),
RUN_TEST(CallFloatMethodV),
RUN_TEST(CallNonvirtualFloatMethod),
RUN_TEST(CallNonvirtualFloatMethodA),
RUN_TEST(CallNonvirtualFloatMethodV),
RUN_TEST(CallStaticFloatMethod),
RUN_TEST(CallStaticFloatMethodA),
RUN_TEST(CallStaticFloatMethodV),
RUN_TEST(CallDoubleMethod),
RUN_TEST(CallDoubleMethodA),
RUN_TEST(CallDoubleMethodV),
RUN_TEST(CallNonvirtualDoubleMethod),
RUN_TEST(CallNonvirtualDoubleMethodA),
RUN_TEST(CallNonvirtualDoubleMethodV),
RUN_TEST(CallStaticDoubleMethod),
RUN_TEST(CallStaticDoubleMethodA),
RUN_TEST(CallStaticDoubleMethodV),
RUN_TEST(CallVoidMethod),
RUN_TEST(CallVoidMethodA),
RUN_TEST(CallVoidMethodV),
RUN_TEST(CallNonvirtualVoidMethod),
RUN_TEST(CallNonvirtualVoidMethodA),
RUN_TEST(CallNonvirtualVoidMethodV),
RUN_TEST(CallStaticVoidMethod),
RUN_TEST(CallStaticVoidMethodA),
RUN_TEST(CallStaticVoidMethodV),
RUN_TEST(CallObjectMethod),
RUN_TEST(CallObjectMethodA),
RUN_TEST(CallObjectMethodV),
RUN_TEST(CallNonvirtualObjectMethod),
RUN_TEST(CallNonvirtualObjectMethodA),
RUN_TEST(CallNonvirtualObjectMethodV),
RUN_TEST(CallStaticObjectMethod),
RUN_TEST(CallStaticObjectMethodA),
RUN_TEST(CallStaticObjectMethodV),
RUN_TEST(TakeOneOfEach),
RUN_TEST(TakeOneOfEachA),
RUN_TEST(TakeOneOfEachV),
RUN_TEST(NonvirtualTakeOneOfEach),
RUN_TEST(NonvirtualTakeOneOfEachA),
RUN_TEST(NonvirtualTakeOneOfEachV),
RUN_TEST(StaticTakeOneOfEach),
RUN_TEST(StaticTakeOneOfEachA),
RUN_TEST(StaticTakeOneOfEachV),
RUN_TEST(TakeCoolHandLuke),
RUN_TEST(TakeCoolHandLukeA),
RUN_TEST(TakeCoolHandLukeV),
RUN_TEST(NonvirtualTakeCoolHandLuke),
RUN_TEST(NonvirtualTakeCoolHandLukeA),
RUN_TEST(NonvirtualTakeCoolHandLukeV),
RUN_TEST(StaticTakeCoolHandLuke),
RUN_TEST(StaticTakeCoolHandLukeA),
RUN_TEST(StaticTakeCoolHandLukeV),
RUN_TEST(DefineClass),
RUN_TEST(GetVersion),
NULL);
// TODO: Add more tests, above.
}
if (result != NULL) {
jstring s = CALL(NewStringUTF, result);
free(result);
return s;
}
return NULL;
}