blob: 00e4dc6fbe18c9a1ec7480211928937cfa12bf13 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
/**
* @author Intel, Gregory Shimansky
*/
#define LOG_DOMAIN "jni.method"
#include "cxxlog.h"
#include <assert.h>
#include "jni.h"
#include "jni_utils.h"
#include "jni_direct.h"
#include "vtable.h"
#include "Class.h"
#include "environment.h"
#include "exceptions.h"
#include "object_handles.h"
#include "open/vm_util.h"
#include "vm_threads.h"
#include "ini.h"
#include "nogc.h"
#include "open/vm_method_access.h"
static Method* lookup_method_init(Class* clss, const char* descr)
{
String* method_name = VM_Global_State::loader_env->Init_String;
String* method_descr =
VM_Global_State::loader_env->string_pool.lookup(descr);
return clss->lookup_method(method_name, method_descr);
} // lookup_method_init
static Method* lookup_method_clinit(Class* clss)
{
return clss->lookup_method(VM_Global_State::loader_env->Clinit_String,
VM_Global_State::loader_env->VoidVoidDescriptor_String);
} // lookup_method_clinit
jmethodID JNICALL GetMethodID(JNIEnv * jni_env,
jclass clazz,
const char *name,
const char *descr)
{
TRACE2("jni", "GetMethodID called: " << name << descr);
assert(hythread_is_suspend_enabled());
assert(clazz);
if (exn_raised()) return NULL;
Class* clss = jclass_to_struct_Class(clazz);
Method *method;
if ('<' == *name) {
if (!strcmp(name + 1, "init>")) {
method = lookup_method_init(clss, descr);
} else {
ThrowNew_Quick(jni_env, "java/lang/NoSuchMethodError", name);
return NULL;
}
} else {
method = class_lookup_method_recursive(clss, name, descr);
}
if(!method || method->is_static()) {
ThrowNew_Quick(jni_env, "java/lang/NoSuchMethodError", name);
return NULL;
}
TRACE2("jni", "GetMethodID " << clss->get_name()->bytes
<< "." << name << " " << descr << " = " << (jmethodID)method);
return (jmethodID)method;
} //GetMethodID
jmethodID JNICALL GetStaticMethodID(JNIEnv *jni_env,
jclass clazz,
const char *name,
const char *descr)
{
TRACE2("jni", "GetStaticMethodID called: " << name << descr);
assert(hythread_is_suspend_enabled());
Class* clss = jclass_to_struct_Class(clazz);
if (exn_raised()) return NULL;
Method *method;
if ('<' == *name) {
if (!strcmp(name + 1, "clinit>") && !strcmp(descr, "()V")) {
method = lookup_method_clinit(clss);
} else {
ThrowNew_Quick(jni_env, "java/lang/NoSuchMethodError", name);
return NULL;
}
} else {
method = class_lookup_method_recursive(clss, name, descr);
}
if(!method || !method->is_static()) {
ThrowNew_Quick(jni_env, "java/lang/NoSuchMethodError", name);
return NULL;
}
TRACE2("jni", "GetStaticMethodID " << clss->get_name()->bytes
<< "." << name << " " << descr << " = " << (jmethodID)method);
return (jmethodID)method;
} //GetStaticMethodID
static Method *object_lookup_method(jobject obj, const String* name, const String* desc)
{
ObjectHandle h = (ObjectHandle)obj;
tmn_suspend_disable(); // v----------
VTable *vtable = ((ManagedObject *)h->object)->vt();
tmn_suspend_enable(); // ^----------
assert(vtable);
Method *method = class_lookup_method_recursive(vtable->clss, name, desc);
if (method == 0) {
LDIE(21, "Can't find method {0} {1}" << name->bytes << desc->bytes);
}
return method;
}
/////////////////////////////////////////////////////////////////////////////
// begin Call<Type>MethodA functions
static void call_method_no_ref_result(JNIEnv * jni_env,
jobject obj,
jmethodID methodID,
jvalue *args,
jvalue *result,
int non_virtual)
{
assert(hythread_is_suspend_enabled());
Method *method = (Method *)methodID;
if ( !non_virtual && !method_is_private(method) ) {
// lookup the underlying "real" (e.g. abstract) method
method = object_lookup_method(obj, method->get_name(), method->get_descriptor());
}
// Check method is not abstract
// Alternative solution is to restore exception stubs in
// class_parse_methods() in Class_File_Loader.cpp,
// and to add similar functionality to interpreter
if (method->is_abstract()) {
ThrowNew_Quick (jni_env, "java/lang/AbstractMethodError",
"attempt to invoke abstract method");
return;
}
if (!ensure_initialised(jni_env, method->get_class()))
return;
unsigned num_args = method->get_num_args();
jvalue *all_args = (jvalue*) STD_ALLOCA(num_args * sizeof(jvalue));
all_args[0].l = obj;
memcpy(all_args + 1, args, (num_args - 1) * sizeof(jvalue));
tmn_suspend_disable(); // v----------
vm_execute_java_method_array((jmethodID)method, result, all_args);
tmn_suspend_enable(); // ^----------
} //call_method_no_ref_result
void JNICALL CallVoidMethod(JNIEnv * jni_env, jobject obj, jmethodID methodID, ...)
{
TRACE2("jni", "CallVoidMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
CallVoidMethodV(jni_env, obj, methodID, args);
} //CallVoidMethod
void JNICALL CallVoidMethodV(JNIEnv * jni_env, jobject obj, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallVoidMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
CallVoidMethodA(jni_env, obj, methodID, jvalue_args);
STD_FREE(jvalue_args);
} //CallVoidMethodV
void JNICALL CallVoidMethodA(JNIEnv * jni_env,
jobject obj,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallVoidMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue UNREF result;
if (exn_raised()) return;
String *name = ((Method*)methodID)->get_name();
bool non_virtual = name == VM_Global_State::loader_env->Init_String;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, non_virtual);
} //CallVoidMethodA
jobject JNICALL CallObjectMethod(JNIEnv * jni_env, jobject obj, jmethodID methodID, ...)
{
TRACE2("jni", "CallObjectMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallObjectMethodV(jni_env, obj, methodID, args);
} //CallObjectMethod
jobject JNICALL CallObjectMethodV(JNIEnv * jni_env, jobject obj, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallObjectMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jobject result = CallObjectMethodA(jni_env, obj, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallObjectMethodV
jobject JNICALL CallObjectMethodA(JNIEnv * jni_env,
jobject obj,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallObjectMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return NULL;
jvalue result;
Method *method = (Method *)methodID; // resolve to actual vtable entry below
if (! method_is_private(method)) {
// lookup the underlying "real" (e.g. abstract) method
method = object_lookup_method(obj, method->get_name(), method->get_descriptor());
}
// Check method is not abstract
// Alternative solution is to restore exception stubs in
// class_parse_methods() in Class_File_Loader.cpp,
// and to add similar functionality to interpreter
if (method->is_abstract()) {
ThrowNew_Quick (jni_env, "java/lang/AbstractMethodError",
"attempt to invoke abstract method");
return NULL;
}
if (!ensure_initialised(jni_env, method->get_class()))
return NULL;
unsigned num_args = method->get_num_args();
jvalue *all_args = (jvalue*) STD_ALLOCA(num_args * sizeof(jvalue));
all_args[0].l = obj;
memcpy(all_args + 1, args, (num_args - 1) * sizeof(jvalue));
tmn_suspend_disable(); // v----------
vm_execute_java_method_array((jmethodID)method, &result, all_args);
tmn_suspend_enable(); // ^----------
return result.l;
} //CallObjectMethodA
jboolean JNICALL CallBooleanMethod(JNIEnv * jni_env, jobject obj, jmethodID methodID, ...)
{
TRACE2("jni", "CallBooleanMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallBooleanMethodV(jni_env, obj, methodID, args);
} //CallBooleanMethod
jboolean JNICALL CallBooleanMethodV(JNIEnv * jni_env, jobject obj, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallBooleanMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jboolean result = CallBooleanMethodA(jni_env, obj, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallBooleanMethodV
jboolean JNICALL CallBooleanMethodA(JNIEnv * jni_env,
jobject obj,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallBooleanMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE);
return result.z;
} //CallBooleanMethodA
jbyte JNICALL CallByteMethod(JNIEnv * jni_env, jobject obj, jmethodID methodID, ...)
{
TRACE2("jni", "CallByteMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallByteMethodV(jni_env, obj, methodID, args);
} //CallByteMethod
jbyte JNICALL CallByteMethodV(JNIEnv * jni_env, jobject obj, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallByteMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jbyte result = CallByteMethodA(jni_env, obj, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallByteMethodV
jbyte JNICALL CallByteMethodA(JNIEnv * jni_env,
jobject obj,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallByteMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE);
return result.b;
} //CallByteMethodA
jchar JNICALL CallCharMethod(JNIEnv * jni_env, jobject obj, jmethodID methodID, ...)
{
TRACE2("jni", "CallCharMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallCharMethodV(jni_env, obj, methodID, args);
} //CallCharMethod
jchar JNICALL CallCharMethodV(JNIEnv * jni_env, jobject obj, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallCharMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jchar result = CallCharMethodA(jni_env, obj, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallCharMethodV
jchar JNICALL CallCharMethodA(JNIEnv * jni_env,
jobject obj,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallCharMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE);
return result.c;
} //CallCharMethodA
jshort JNICALL CallShortMethod(JNIEnv * jni_env, jobject obj, jmethodID methodID, ...)
{
TRACE2("jni", "CallShortMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallShortMethodV(jni_env, obj, methodID, args);
} //CallShortMethod
jshort JNICALL CallShortMethodV(JNIEnv * jni_env, jobject obj, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallShortMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jshort result = CallShortMethodA(jni_env, obj, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallShortMethodV
jshort JNICALL CallShortMethodA(JNIEnv * jni_env,
jobject obj,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallShortMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE);
return result.s;
} //CallShortMethodA
jint JNICALL CallIntMethod(JNIEnv * jni_env, jobject obj, jmethodID methodID, ...)
{
TRACE2("jni", "CallIntMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallIntMethodV(jni_env, obj, methodID, args);
} //CallIntMethod
jint JNICALL CallIntMethodV(JNIEnv * jni_env, jobject obj, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallIntMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jint result = CallIntMethodA(jni_env, obj, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallIntMethodV
jint JNICALL CallIntMethodA(JNIEnv * jni_env,
jobject obj,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallIntMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE);
return result.i;
} //CallIntMethodA
jlong JNICALL CallLongMethod(JNIEnv * jni_env, jobject obj, jmethodID methodID, ...)
{
TRACE2("jni", "CallLongMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallLongMethodV(jni_env, obj, methodID, args);
} //CallLongMethod
jlong JNICALL CallLongMethodV(JNIEnv * jni_env, jobject obj, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallLongMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jlong result = CallLongMethodA(jni_env, obj, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallLongMethodV
jlong JNICALL CallLongMethodA(JNIEnv * jni_env,
jobject obj,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallLongMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE);
return result.j;
} //CallLongMethodA
jfloat JNICALL CallFloatMethod(JNIEnv * jni_env, jobject obj, jmethodID methodID, ...)
{
TRACE2("jni", "CallFloatMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallFloatMethodV(jni_env, obj, methodID, args);
} //CallFloatMethod
jfloat JNICALL CallFloatMethodV(JNIEnv * jni_env, jobject obj, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallFloatMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jfloat result = CallFloatMethodA(jni_env, obj, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallFloatMethodV
jfloat JNICALL CallFloatMethodA(JNIEnv * jni_env,
jobject obj,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallFloatMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE);
return result.f;
} //CallFloatMethodA
jdouble JNICALL CallDoubleMethod(JNIEnv * jni_env, jobject obj, jmethodID methodID, ...)
{
TRACE2("jni", "CallDoubleMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallDoubleMethodV(jni_env, obj, methodID, args);
} //CallDoubleMethod
jdouble JNICALL CallDoubleMethodV(JNIEnv * jni_env, jobject obj, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallDoubleMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jdouble result = CallDoubleMethodA(jni_env, obj, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallDoubleMethodV
jdouble JNICALL CallDoubleMethodA(JNIEnv * jni_env,
jobject obj,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallDoubleMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE);
return result.d;
} //CallDoubleMethodA
// end Call<Type>MethodA functions
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// begin CallNonvirtual<Type>MethodA functions
void JNICALL CallNonvirtualVoidMethod(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
...)
{
TRACE2("jni", "CallNonvirtualVoidMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
CallNonvirtualVoidMethodV(jni_env, obj, clazz, methodID, args);
} //CallNonvirtualVoidMethod
void JNICALL CallNonvirtualVoidMethodV(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
va_list args)
{
TRACE2("jni", "CallNonvirtualVoidMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
CallNonvirtualVoidMethodA(jni_env, obj, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
} //CallNonvirtualVoidMethodV
void JNICALL CallNonvirtualVoidMethodA(JNIEnv * jni_env,
jobject obj,
jclass UNREF clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallNonvirtualVoidMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return;
call_method_no_ref_result(jni_env, obj, methodID, args, 0, TRUE);
} //CallNonvirtualVoidMethodA
jobject JNICALL CallNonvirtualObjectMethod(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
...)
{
TRACE2("jni", "CallNonvirtualObjectMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallNonvirtualObjectMethodV(jni_env, obj, clazz, methodID, args);
} //CallNonvirtualObjectMethod
jobject JNICALL CallNonvirtualObjectMethodV(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
va_list args)
{
TRACE2("jni", "CallNonvirtualObjectMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jobject result = CallNonvirtualObjectMethodA(jni_env, obj, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallNonvirtualObjectMethodV
jobject JNICALL CallNonvirtualObjectMethodA(JNIEnv * jni_env,
jobject obj,
jclass UNREF clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallNonvirtualObjectMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return NULL;
jvalue result;
Method *method = (Method *)methodID;
if (!ensure_initialised(jni_env, method->get_class()))
return NULL;
unsigned num_args = method->get_num_args();
jvalue *all_args = (jvalue*) STD_ALLOCA(num_args * sizeof(jvalue));
all_args[0].l = obj;
memcpy(all_args + 1, args, (num_args - 1) * sizeof(jvalue));
tmn_suspend_disable();
vm_execute_java_method_array(methodID, &result, all_args);
tmn_suspend_enable();
return result.l;
} //CallNonvirtualObjectMethodA
jboolean JNICALL CallNonvirtualBooleanMethod(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
...)
{
TRACE2("jni", "CallNonvirtualBooleanMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallNonvirtualBooleanMethodV(jni_env, obj, clazz, methodID, args);
} //CallNonvirtualBooleanMethod
jboolean JNICALL CallNonvirtualBooleanMethodV(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
va_list args)
{
TRACE2("jni", "CallNonvirtualBooleanMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jboolean result = CallNonvirtualBooleanMethodA(jni_env, obj, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallNonvirtualBooleanMethodV
jboolean JNICALL CallNonvirtualBooleanMethodA(JNIEnv * jni_env,
jobject obj,
jclass UNREF clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallNonvirtualBooleanMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE);
return result.z;
} //CallNonvirtualBooleanMethodA
jbyte JNICALL CallNonvirtualByteMethod(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
...)
{
TRACE2("jni", "CallNonvirtualByteMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallNonvirtualByteMethodV(jni_env, obj, clazz, methodID, args);
} //CallNonvirtualByteMethod
jbyte JNICALL CallNonvirtualByteMethodV(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
va_list args)
{
TRACE2("jni", "CallNonvirtualByteMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jbyte result = CallNonvirtualByteMethodA(jni_env, obj, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallNonvirtualByteMethodV
jbyte JNICALL CallNonvirtualByteMethodA(JNIEnv * jni_env,
jobject obj,
jclass UNREF clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallNonvirtualByteMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE);
return result.b;
} //CallNonvirtualByteMethodA
jchar JNICALL CallNonvirtualCharMethod(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
...)
{
TRACE2("jni", "CallNonvirtualCharMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallNonvirtualCharMethodV(jni_env, obj, clazz, methodID, args);
} //CallNonvirtualCharMethod
jchar JNICALL CallNonvirtualCharMethodV(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
va_list args)
{
TRACE2("jni", "CallNonvirtualCharMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jchar result = CallNonvirtualCharMethodA(jni_env, obj, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallNonvirtualCharMethodV
jchar JNICALL CallNonvirtualCharMethodA(JNIEnv * jni_env,
jobject obj,
jclass UNREF clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallNonvirtualCharMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE);
return result.c;
} //CallNonvirtualCharMethodA
jshort JNICALL CallNonvirtualShortMethod(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
...)
{
TRACE2("jni", "CallNonvirtualShortMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallNonvirtualShortMethodV(jni_env, obj, clazz, methodID, args);
} //CallNonvirtualShortMethod
jshort JNICALL CallNonvirtualShortMethodV(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
va_list args)
{
TRACE2("jni", "CallNonvirtualShortMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jshort result = CallNonvirtualShortMethodA(jni_env, obj, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallNonvirtualShortMethodV
jshort JNICALL CallNonvirtualShortMethodA(JNIEnv * jni_env,
jobject obj,
jclass UNREF clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallNonvirtualShortMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE);
return result.s;
} //CallNonvirtualShortMethodA
jint JNICALL CallNonvirtualIntMethod(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
...)
{
TRACE2("jni", "CallNonvirtualIntMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallNonvirtualIntMethodV(jni_env, obj, clazz, methodID, args);
} //CallNonvirtualIntMethod
jint JNICALL CallNonvirtualIntMethodV(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
va_list args)
{
TRACE2("jni", "CallNonvirtualIntMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jint result = CallNonvirtualIntMethodA(jni_env, obj, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallNonvirtualIntMethodV
jint JNICALL CallNonvirtualIntMethodA(JNIEnv * jni_env,
jobject obj,
jclass UNREF clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallNonvirtualIntMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE);
return result.i;
} //CallNonvirtualIntMethodA
jlong JNICALL CallNonvirtualLongMethod(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
...)
{
TRACE2("jni", "CallNonvirtualLongMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallNonvirtualLongMethodV(jni_env, obj, clazz, methodID, args);
} //CallNonvirtualLongMethod
jlong JNICALL CallNonvirtualLongMethodV(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
va_list args)
{
TRACE2("jni", "CallNonvirtualLongMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jlong result = CallNonvirtualLongMethodA(jni_env, obj, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallNonvirtualLongMethodV
jlong JNICALL CallNonvirtualLongMethodA(JNIEnv * jni_env,
jobject obj,
jclass UNREF clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallNonvirtualLongMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE);
return result.j;
} //CallNonvirtualLongMethodA
jfloat JNICALL CallNonvirtualFloatMethod(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
...)
{
TRACE2("jni", "CallNonvirtualFloatMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallNonvirtualFloatMethodV(jni_env, obj, clazz, methodID, args);
} //CallNonvirtualFloatMethod
jfloat JNICALL CallNonvirtualFloatMethodV(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
va_list args)
{
TRACE2("jni", "CallNonvirtualFloatMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jfloat result = CallNonvirtualFloatMethodA(jni_env, obj, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallNonvirtualFloatMethodV
jfloat JNICALL CallNonvirtualFloatMethodA(JNIEnv * jni_env,
jobject obj,
jclass UNREF clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallNonvirtualFloatMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE);
return result.f;
} //CallNonvirtualFloatMethodA
jdouble JNICALL CallNonvirtualDoubleMethod(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
...)
{
TRACE2("jni", "CallNonvirtualDoubleMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallNonvirtualDoubleMethodV(jni_env, obj, clazz, methodID, args);
} //CallNonvirtualDoubleMethod
jdouble JNICALL CallNonvirtualDoubleMethodV(JNIEnv * jni_env,
jobject obj,
jclass clazz,
jmethodID methodID,
va_list args)
{
TRACE2("jni", "CallNonvirtualDoubleMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jdouble result = CallNonvirtualDoubleMethodA(jni_env, obj, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallNonvirtualDoubleMethodV
jdouble JNICALL CallNonvirtualDoubleMethodA(JNIEnv * jni_env,
jobject obj,
jclass UNREF clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallNonvirtualDoubleMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE);
return result.d;
} //CallNonvirtualDoubleMethodA
// end CallNonvirtual<Type>MethodA functions
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// begin CallStatic<Type>MethodA functions
static void call_static_method_no_ref_result(JNIEnv * jni_env,
jclass UNREF clazz,
jmethodID methodID,
jvalue *args,
jvalue *result)
{
assert(hythread_is_suspend_enabled());
Method *method = (Method *)methodID;
if (!ensure_initialised(jni_env, method->get_class()))
return;
tmn_suspend_disable();
vm_execute_java_method_array(methodID, result, args);
tmn_suspend_enable();
} //call_static_method_no_ref_result
jobject JNICALL CallStaticObjectMethod(JNIEnv * jni_env, jclass clazz, jmethodID methodID, ...)
{
TRACE2("jni", "CallStaticObjectMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallStaticObjectMethodV(jni_env, clazz, methodID, args);
} //CallStaticObjectMethod
jobject JNICALL CallStaticObjectMethodV(JNIEnv * jni_env, jclass clazz, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallStaticObjectMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jobject result = CallStaticObjectMethodA(jni_env, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallStaticObjectMethodV
jobject JNICALL CallStaticObjectMethodA(JNIEnv * jni_env,
jclass UNREF clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallStaticObjectMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return NULL;
jvalue result;
Method *method = (Method *)methodID;
if (!ensure_initialised(jni_env, method->get_class()))
return NULL;
unsigned num_args = method->get_num_args();
jvalue *all_args = (jvalue*) STD_ALLOCA(num_args * sizeof(jvalue));
memcpy(all_args, args, num_args * sizeof(jvalue));
tmn_suspend_disable();
vm_execute_java_method_array(methodID, &result, all_args);
tmn_suspend_enable();
return result.l;
} //CallStaticObjectMethodA
jboolean JNICALL CallStaticBooleanMethod(JNIEnv * jni_env, jclass clazz, jmethodID methodID, ...)
{
TRACE2("jni", "CallStaticBooleanMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallStaticBooleanMethodV(jni_env, clazz, methodID, args);
} //CallStaticBooleanMethod
jboolean JNICALL CallStaticBooleanMethodV(JNIEnv * jni_env, jclass clazz, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallStaticBooleanMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jboolean result = CallStaticBooleanMethodA(jni_env, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallStaticBooleanMethodV
jboolean JNICALL CallStaticBooleanMethodA(JNIEnv * jni_env,
jclass clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallStaticBooleanMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result);
return result.z;
} //CallStaticBooleanMethodA
jbyte JNICALL CallStaticByteMethod(JNIEnv * jni_env, jclass clazz, jmethodID methodID, ...)
{
TRACE2("jni", "CallStaticByteMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallStaticByteMethodV(jni_env, clazz, methodID, args);
} //CallStaticByteMethod
jbyte JNICALL CallStaticByteMethodV(JNIEnv * jni_env, jclass clazz, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallStaticByteMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jbyte result = CallStaticByteMethodA(jni_env, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallStaticByteMethodV
jbyte JNICALL CallStaticByteMethodA(JNIEnv * jni_env,
jclass clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallStaticByteMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result);
return result.b;
} //CallStaticByteMethodA
jchar JNICALL CallStaticCharMethod(JNIEnv * jni_env, jclass clazz, jmethodID methodID, ...)
{
TRACE2("jni", "CallStaticCharMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallStaticCharMethodV(jni_env, clazz, methodID, args);
} //CallStaticCharMethod
jchar JNICALL CallStaticCharMethodV(JNIEnv * jni_env, jclass clazz, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallStaticCharMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jchar result = CallStaticCharMethodA(jni_env, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallStaticCharMethodV
jchar JNICALL CallStaticCharMethodA(JNIEnv * jni_env,
jclass clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallStaticCharMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result);
return result.c;
} //CallStaticCharMethodA
jshort JNICALL CallStaticShortMethod(JNIEnv * jni_env, jclass clazz, jmethodID methodID, ...)
{
TRACE2("jni", "CallStaticShortMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallStaticShortMethodV(jni_env, clazz, methodID, args);
} //CallStaticShortMethod
jshort JNICALL CallStaticShortMethodV(JNIEnv * jni_env, jclass clazz, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallStaticShortMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jshort result = CallStaticShortMethodA(jni_env, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallStaticShortMethodV
jshort JNICALL CallStaticShortMethodA(JNIEnv * jni_env,
jclass clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallStaticShortMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result);
return result.s;
} //CallStaticShortMethodA
jint JNICALL CallStaticIntMethod(JNIEnv * jni_env, jclass clazz, jmethodID methodID, ...)
{
TRACE2("jni", "CallStaticIntMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallStaticIntMethodV(jni_env, clazz, methodID, args);
} //CallStaticIntMethod
jint JNICALL CallStaticIntMethodV(JNIEnv * jni_env, jclass clazz, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallStaticIntMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jint result = CallStaticIntMethodA(jni_env, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallStaticIntMethodV
jint JNICALL CallStaticIntMethodA(JNIEnv * jni_env,
jclass clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallStaticIntMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result);
return result.i;
} //CallStaticIntMethodA
jlong JNICALL CallStaticLongMethod(JNIEnv * jni_env, jclass clazz, jmethodID methodID, ...)
{
TRACE2("jni", "CallStaticLongMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallStaticLongMethodV(jni_env, clazz, methodID, args);
} //CallStaticLongMethod
jlong JNICALL CallStaticLongMethodV(JNIEnv * jni_env, jclass clazz, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallStaticLongMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jlong result = CallStaticLongMethodA(jni_env, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallStaticLongMethodV
jlong JNICALL CallStaticLongMethodA(JNIEnv * jni_env,
jclass clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallStaticLongMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result);
return result.j;
} //CallStaticLongMethodA
jfloat JNICALL CallStaticFloatMethod(JNIEnv * jni_env, jclass clazz, jmethodID methodID, ...)
{
TRACE2("jni", "CallStaticFloatMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallStaticFloatMethodV(jni_env, clazz, methodID, args);
} //CallStaticFloatMethod
jfloat JNICALL CallStaticFloatMethodV(JNIEnv * jni_env, jclass clazz, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallStaticFloatMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jfloat result = CallStaticFloatMethodA(jni_env, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallStaticFloatMethodV
jfloat JNICALL CallStaticFloatMethodA(JNIEnv * jni_env,
jclass clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallStaticFloatMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result);
return result.f;
} //CallStaticFloatMethodA
jdouble JNICALL CallStaticDoubleMethod(JNIEnv * jni_env, jclass clazz, jmethodID methodID, ...)
{
TRACE2("jni", "CallStaticDoubleMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
return CallStaticDoubleMethodV(jni_env, clazz, methodID, args);
} //CallStaticDoubleMethod
jdouble JNICALL CallStaticDoubleMethodV(JNIEnv * jni_env, jclass clazz, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallStaticDoubleMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
jdouble result = CallStaticDoubleMethodA(jni_env, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
return result;
} //CallStaticDoubleMethodV
jdouble JNICALL CallStaticDoubleMethodA(JNIEnv * jni_env,
jclass clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallStaticDoubleMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return 0;
jvalue result;
call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result);
return result.d;
} //CallStaticDoubleMethodA
void JNICALL CallStaticVoidMethod(JNIEnv * jni_env, jclass clazz, jmethodID methodID, ...)
{
TRACE2("jni", "CallStaticVoidMethod called, id = " << methodID);
assert(hythread_is_suspend_enabled());
va_list args;
va_start(args, methodID);
CallStaticVoidMethodV(jni_env, clazz, methodID, args);
} //CallStaticVoidMethod
void JNICALL CallStaticVoidMethodV(JNIEnv * jni_env, jclass clazz, jmethodID methodID, va_list args)
{
TRACE2("jni", "CallStaticVoidMethodV called, id = " << methodID);
assert(hythread_is_suspend_enabled());
jvalue *jvalue_args = get_jvalue_arg_array((Method *)methodID, args);
CallStaticVoidMethodA(jni_env, clazz, methodID, jvalue_args);
STD_FREE(jvalue_args);
} //CallStaticVoidMethodV
void JNICALL CallStaticVoidMethodA(JNIEnv * jni_env,
jclass clazz,
jmethodID methodID,
jvalue *args)
{
TRACE2("jni", "CallStaticVoidMethodA called, id = " << methodID);
assert(hythread_is_suspend_enabled());
if (exn_raised()) return;
call_static_method_no_ref_result(jni_env, clazz, methodID, args, 0);
} //CallStaticVoidMethodA
// end CallStatic<Type>MethodA functions
/////////////////////////////////////////////////////////////////////////////