blob: 0e18dbe06dc01fc75b459c7f0ae887d46a1a503d [file] [log] [blame]
//===---------------- Jni.cpp - Jni interface for J3 ----------------------===//
//
// The VMKit project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "j3/jni.h"
#include "vmkit/System.h"
#include "ClasspathReflect.h"
#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaObject.h"
#include "JavaString.h"
#include "JavaThread.h"
#include "JavaTypes.h"
#include "JavaUpcalls.h"
#include "Jnjvm.h"
#include "Reader.h"
using namespace j3;
#define NYI() do { \
fprintf(stderr, "%s: Implement me!\n", __FUNCTION__); \
} while(0)
Jnjvm* myVM(JNIEnv* env) {
return JavaThread::get()->getJVM();
}
UserClass* getClassFromStaticMethod(Jnjvm* vm, JavaMethod* meth,
JavaObject* clazz) {
llvm_gcroot(clazz, 0);
return meth->classDef;
}
static UserClass* getClassFromVirtualMethod(Jnjvm* vm,
JavaMethod* meth,
UserCommonClass* cl) {
return meth->classDef;
}
extern "C" const struct JNIInvokeInterface_ JNI_JavaVMTable;
extern "C" struct JNINativeInterface_ JNI_JNIEnvTable;
jint GetVersion(JNIEnv *env) {
return JNI_VERSION_1_4;
}
jobject NewLocalRef(JNIEnv *env, jobject ref) {
JavaObject* Obj = 0;
llvm_gcroot(Obj, 0);
BEGIN_JNI_EXCEPTION
if (ref) {
Obj = *(JavaObject**)ref;
jobject res = (jobject)th->pushJNIRef(Obj);
RETURN_FROM_JNI(res);
}
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jclass DefineClass(JNIEnv *env, const char *name, jobject _loader,
const jbyte *buf, jsize len) {
JavaObject *loader = NULL;
llvm_gcroot(loader, 0);
BEGIN_JNI_EXCEPTION
loader = _loader ? *(JavaObject**)_loader : 0;
jclass res = NULL;
Jnjvm* vm = JavaThread::get()->getJVM();
JnjvmClassLoader* JCL =
JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);
ClassBytes * bytes = new (JCL->allocator, len) ClassBytes(len);
memcpy(bytes->elements,buf,len);
const UTF8* utfName = JCL->asciizConstructUTF8(name);
UserClass *cl = JCL->constructClass(utfName, bytes);
if (cl) res = (jclass)cl->getClassDelegateePtr(vm);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jclass FindClass(JNIEnv *env, const char *asciiz) {
BEGIN_JNI_EXCEPTION
JnjvmClassLoader* loader = 0;
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
UserClass* currentClass = th->getCallingClassLevel(0);
if (currentClass) loader = currentClass->classLoader;
else loader = vm->appClassLoader;
UserCommonClass* cl = loader->loadClassFromAsciiz(asciiz, true, true);
if (cl && cl->asClass()) {
assert(cl->asClass()->isResolved());
cl->asClass()->initialiseClass(vm);
}
jclass res = (jclass)cl->getClassDelegateePtr(vm);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jmethodID FromReflectedMethod(JNIEnv *env, jobject method) {
JavaObjectConstructor* methObj = 0;
JavaObject* meth = NULL;
llvm_gcroot(meth, 0);
llvm_gcroot(methObj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
meth = *(JavaObject**)method;
Jnjvm* vm = myVM(env);
Classpath* upcalls = vm->upcalls;
UserCommonClass* cl = JavaObject::getClass(meth);
if (cl == upcalls->newConstructor) {
jmethodID res = (jmethodID)JavaObjectMethod::getInternalMethod((JavaObjectMethod*)meth);
RETURN_FROM_JNI(res);
} else if (cl == upcalls->newMethod) {
jmethodID res = (jmethodID)JavaObjectConstructor::getInternalMethod(methObj = (JavaObjectConstructor*)meth);
RETURN_FROM_JNI(res);
}
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jclass GetSuperclass(JNIEnv *env, jclass sub) {
jclass res = 0;
JavaObject* Cl = NULL;
llvm_gcroot(Cl, 0);
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
Cl = *(JavaObject**)sub;
Jnjvm* vm = JavaThread::get()->getJVM();
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
if (!cl->isInterface() && cl->getSuper() != NULL) {
res = (jclass)cl->getSuper()->getClassDelegateePtr(vm);
}
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jboolean IsSubclassOf(JNIEnv *env, jclass _sub, jclass _sup) {
JavaObject* sub = NULL;
JavaObject* sup = NULL;
llvm_gcroot(sub, 0);
llvm_gcroot(sup, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
sub = *(JavaObject**)_sub;
sup = *(JavaObject**)_sup;
Jnjvm* vm = JavaThread::get()->getJVM();
UserCommonClass* cl2 =
UserCommonClass::resolvedImplClass(vm, sup, false);
UserCommonClass* cl1 =
UserCommonClass::resolvedImplClass(vm, sub, false);
jboolean res = (jboolean)cl1->isSubclassOf(cl2);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(false);
}
jint Throw(JNIEnv *env, jthrowable obj) {
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
vmkit::Collector::objectReferenceNonHeapWriteBarrier((gc**)&(th->pendingException), *(gc**)obj);
RETURN_FROM_JNI(0);
END_JNI_EXCEPTION
RETURN_FROM_JNI(-1);
}
jint ThrowNew(JNIEnv* env, jclass _Cl, const char *msg) {
JavaObject* Cl = NULL;
JavaObject* res = 0;
JavaString* str = 0;
llvm_gcroot(Cl, 0);
llvm_gcroot(res, 0);
llvm_gcroot(str, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
verifyNull(_Cl);
Cl = *(JavaObject**)_Cl;
Jnjvm* vm = JavaThread::get()->getJVM();
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, true);
if (!cl->isClass()) RETURN_FROM_JNI(0);
UserClass* realCl = cl->asClass();
res = realCl->doNew(vm);
JavaMethod* init = realCl->lookupMethod(vm->bootstrapLoader->initName,
vm->bootstrapLoader->initExceptionSig,
false, true, 0);
str = vm->asciizToStr(msg);
init->invokeIntSpecial(vm, realCl, res, &str);
vmkit::Collector::objectReferenceNonHeapWriteBarrier((gc**)&(th->pendingException), (gc*)res);
RETURN_FROM_JNI(0);
END_JNI_EXCEPTION
RETURN_FROM_JNI(-1);
}
jthrowable ExceptionOccurred(JNIEnv *env) {
JavaObject* obj = NULL;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
obj = JavaThread::get()->pendingException;
if (obj == NULL) RETURN_FROM_JNI(NULL);
jthrowable res = (jthrowable)th->pushJNIRef(obj);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
void ExceptionDescribe(JNIEnv *env) {
NYI();
abort();
}
void ExceptionClear(JNIEnv *env) {
BEGIN_JNI_EXCEPTION
JavaThread::get()->pendingException = NULL;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI
}
void FatalError(JNIEnv *env, const char *msg) {
NYI();
abort();
}
jint PushLocalFrame(JNIEnv* env, jint capacity) {
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
std::pair<uint32_t*,int> frame;
frame.first = th->currentAddedReferences;
frame.second = th->localJNIRefs->getLength();
th->JNIlocalFrames.push_back(frame);
RETURN_FROM_JNI(0);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jobject PopLocalFrame(JNIEnv* env, jobject result) {
JavaObject* res = NULL;
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
std::pair<uint32_t*, int> frame = th->JNIlocalFrames.back();
uint32_t toRemove = th->localJNIRefs->getLength() - frame.second;
assert(toRemove >= 0 && "Local frame has negative number of references to remove");
th->JNIlocalFrames.pop_back();
th->localJNIRefs->removeJNIReferences(th,toRemove);
*(th->currentAddedReferences) -= toRemove;
if(result){
res = *(JavaObject**)result;
jobject ret = (jobject)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
}
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
void DeleteLocalRef(JNIEnv *env, jobject localRef) {
}
jboolean IsSameObject(JNIEnv *env, jobject ref1, jobject ref2) {
JavaObject* Ref1 = NULL;
JavaObject* Ref2 = NULL;
llvm_gcroot(Ref1, 0);
llvm_gcroot(Ref2, 0);
BEGIN_JNI_EXCEPTION
Ref1 = ref1 ? *(JavaObject**)ref1 : NULL;
Ref2 = ref2 ? *(JavaObject**)ref2 : NULL;
RETURN_FROM_JNI(Ref1 == Ref2);
END_JNI_EXCEPTION
RETURN_FROM_JNI(false);
}
jint EnsureLocalCapacity(JNIEnv* env, jint capacity) {
// Assume we have capacity
return 0;
}
jobject AllocObject(JNIEnv *env, jclass _clazz) {
JavaObject* clazz = 0;
JavaObject* res = 0;
llvm_gcroot(clazz, 0);
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);
if (!cl->isClass()) RETURN_FROM_JNI(0);
// Store local reference
res = cl->asClass()->doNew(vm);
jobject ret = (jobject)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jobject NewObject(JNIEnv *env, jclass _clazz, jmethodID methodID, ...) {
JavaObject* clazz = 0;
JavaObject* res = 0;
llvm_gcroot(clazz, 0);
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
// Local object references
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);
if (!cl->isClass()) RETURN_FROM_JNI(0);
// Store local reference
res = cl->asClass()->doNew(vm);
va_list ap;
va_start(ap, methodID);
meth->invokeIntSpecialAP(vm, cl->asClass(), res, ap);
va_end(ap);
jobject ret = (jobject)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jobject NewObjectV(JNIEnv* env, jclass _clazz, jmethodID methodID,
va_list args) {
JavaObject* clazz = 0;
JavaObject* res = 0;
llvm_gcroot(clazz, 0);
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
// Local object references
clazz = *(JavaObject**)_clazz;
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
JavaMethod* meth = (JavaMethod*)methodID;
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);
// Store local reference
res = cl->asClass()->doNew(vm);
meth->invokeIntSpecialAP(vm, cl->asClass(), res, args);
jobject ret = (jobject)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jobject NewObjectA(JNIEnv* env, jclass _clazz, jmethodID methodID,
const jvalue *args) {
JavaObject* clazz = 0;
JavaObject* res = 0;
llvm_gcroot(clazz, 0);
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
// Local object references
clazz = *(JavaObject**)_clazz;
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
JavaMethod* meth = (JavaMethod*)methodID;
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);
// Store local reference
res = cl->asClass()->doNew(vm);
meth->invokeIntSpecialBuf(vm, cl->asClass(), res, (void*)args);
jobject ret = (jobject)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jclass GetObjectClass(JNIEnv *env, jobject _obj) {
JavaObject* obj = NULL;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references
obj = *(JavaObject**)_obj;
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
// Store local reference
jclass res = (jclass)JavaObject::getClass(obj)->getClassDelegateePtr(vm);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jboolean IsInstanceOf(JNIEnv *env, jobject _obj, jclass clazz) {
bool res = false;
JavaObject * obj = 0;
JavaObject * Cl = 0;
llvm_gcroot(Cl, 0);
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
obj = *(JavaObject**)_obj;
Cl = *(JavaObject**)clazz;
Jnjvm* vm = JavaThread::get()->getJVM();
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
res = JavaObject::instanceOf(obj, cl);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jfieldID FromReflectedField(JNIEnv* env, jobject field) {
NYI();
abort();
return 0;
}
jobject ToReflectedMethod(JNIEnv* env, jclass cls, jmethodID methodID,
jboolean isStatic) {
NYI();
abort();
return 0;
}
jobject ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID,
jboolean isStatic) {
NYI();
abort();
return 0;
}
jmethodID GetMethodID(JNIEnv* env, jclass _clazz, const char *aname,
const char *atype) {
JavaObject* clazz = NULL;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
Jnjvm* vm = JavaThread::get()->getJVM();
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);
UserClass* realCl = cl->isClass() ? cl->asClass() : cl->super;
const UTF8* name = cl->classLoader->hashUTF8->lookupAsciiz(aname);
if (name) {
const UTF8* type = cl->classLoader->hashUTF8->lookupAsciiz(atype);
if (type) {
JavaMethod* meth = realCl->lookupMethod(name, type, false, true, 0);
RETURN_FROM_JNI((jmethodID)meth);
}
}
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jobject CallObjectMethod(JNIEnv *env, jobject _obj, jmethodID methodID, ...) {
JavaObject* obj = 0;
JavaObject* res = 0;
llvm_gcroot(obj, 0);
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
va_list ap;
va_start(ap, methodID);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
res = meth->invokeJavaObjectVirtualAP(vm, cl, obj, ap);
va_end(ap);
jobject ret = (jobject)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jobject CallObjectMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
va_list args) {
JavaObject* obj = 0;
JavaObject* res = 0;
llvm_gcroot(obj, 0);
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
JavaThread* th = JavaThread::get();
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
// Store local reference.
res = meth->invokeJavaObjectVirtualAP(vm, cl, obj, args);
jobject ret = (jobject)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jobject CallObjectMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
const jvalue * args) {
JavaObject* obj = 0;
JavaObject* res = 0;
llvm_gcroot(obj, 0);
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
res = meth->invokeJavaObjectVirtualBuf(vm, cl, obj, (void*)args);
jobject ret = (jobject)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jboolean CallBooleanMethod(JNIEnv *env, jobject _obj, jmethodID methodID, ...) {
JavaObject* self = 0;
llvm_gcroot(self, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
va_list ap;
va_start(ap, methodID);
// Local object references.
self = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl =
getClassFromVirtualMethod(vm, meth, JavaObject::getClass(self));
uint32 res = meth->invokeIntVirtualAP(vm, cl, self, ap);
va_end(ap);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jboolean CallBooleanMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
va_list args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jboolean res = (jboolean)meth->invokeIntVirtualAP(vm, cl, obj, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jboolean CallBooleanMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
const jvalue * args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jboolean res = (jboolean)meth->invokeIntVirtualBuf(vm, cl, obj, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jbyte CallByteMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...) {
NYI();
abort();
return 0;
}
jbyte CallByteMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
va_list args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jbyte res = (jbyte)meth->invokeIntVirtualAP(vm, cl, obj, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jbyte CallByteMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
const jvalue *args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jbyte res = (jbyte)meth->invokeIntVirtualBuf(vm, cl, obj, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jchar CallCharMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...) {
NYI();
abort();
return 0;
}
jchar CallCharMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
va_list args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jchar res = (jchar)meth->invokeIntVirtualAP(vm, cl, obj, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jchar CallCharMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
const jvalue *args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jchar res = (jchar)meth->invokeIntVirtualBuf(vm, cl, obj, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jshort CallShortMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...) {
NYI();
abort();
return 0;
}
jshort CallShortMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
va_list args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jshort res = (jshort)meth->invokeIntVirtualAP(vm, cl, obj, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jshort CallShortMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
const jvalue *args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jshort res = (jshort)meth->invokeIntVirtualBuf(vm, cl, obj, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jint CallIntMethod(JNIEnv *env, jobject _obj, jmethodID methodID, ...) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
va_list ap;
va_start(ap, methodID);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
uint32 res = meth->invokeIntVirtualAP(vm, cl, obj, ap);
va_end(ap);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jint CallIntMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
va_list args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jint res = (jint)meth->invokeIntVirtualAP(vm, cl, obj, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jint CallIntMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
const jvalue *args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jint res = (jint)meth->invokeIntVirtualBuf(vm, cl, obj, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jlong CallLongMethod(JNIEnv *env, jobject _obj, jmethodID methodID, ...) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
va_list ap;
va_start(ap, methodID);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jlong res = meth->invokeLongVirtualAP(vm, cl, obj, ap);
va_end(ap);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jlong CallLongMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
va_list args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jlong res = (jlong)meth->invokeLongVirtualAP(vm, cl, obj, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jlong CallLongMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
const jvalue *args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jlong res = (jlong)meth->invokeLongVirtualBuf(vm, cl, obj, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jfloat CallFloatMethod(JNIEnv *env, jobject _obj, jmethodID methodID, ...) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
va_list ap;
va_start(ap, methodID);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jfloat res = meth->invokeFloatVirtualAP(vm, cl, obj, ap);
va_end(ap);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION;
RETURN_FROM_JNI(0.0);
}
jfloat CallFloatMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
va_list args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jfloat res = (jfloat)meth->invokeFloatVirtualAP(vm, cl, obj, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0.0f);
}
jfloat CallFloatMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
const jvalue *args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jfloat res = (jfloat)meth->invokeFloatVirtualBuf(vm, cl, obj, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0.0f);
}
jdouble CallDoubleMethod(JNIEnv *env, jobject _obj, jmethodID methodID, ...) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
va_list ap;
va_start(ap, methodID);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jdouble res = meth->invokeDoubleVirtualAP(vm, cl, obj, ap);
va_end(ap);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0.0);
}
jdouble CallDoubleMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
va_list args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jdouble res = (jdouble)meth->invokeDoubleVirtualAP(vm, cl, obj, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0.0);
}
jdouble CallDoubleMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
const jvalue *args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
jdouble res = (jdouble)meth->invokeDoubleVirtualBuf(vm, cl, obj, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0.0);
}
void CallVoidMethod(JNIEnv *env, jobject _obj, jmethodID methodID, ...) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
va_list ap;
va_start(ap, methodID);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
meth->invokeIntVirtualAP(vm, cl, obj, ap);
va_end(ap);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void CallVoidMethodV(JNIEnv *env, jobject _obj, jmethodID methodID,
va_list args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
meth->invokeIntVirtualAP(vm, cl, obj, args);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void CallVoidMethodA(JNIEnv *env, jobject _obj, jmethodID methodID,
const jvalue *args) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
meth->invokeIntVirtualBuf(vm, cl, obj, (void*)args);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
jobject CallNonvirtualObjectMethod(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, ...) {
NYI();
abort();
return 0;
}
jobject CallNonvirtualObjectMethodV(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, va_list args) {
NYI();
abort();
return 0;
}
jobject CallNonvirtualObjectMethodA(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, const jvalue *args) {
NYI();
abort();
return 0;
}
jboolean CallNonvirtualBooleanMethod(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, ...) {
NYI();
abort();
return 0;
}
jboolean CallNonvirtualBooleanMethodV(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, va_list args) {
NYI();
abort();
return 0;
}
jboolean CallNonvirtualBooleanMethodA(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, const jvalue *args) {
NYI();
abort();
return 0;
}
jbyte CallNonvirtualByteMethod(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, ...) {
NYI();
abort();
return 0;
}
jbyte CallNonvirtualByteMethodV (JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, va_list args) {
NYI();
abort();
return 0;
}
jbyte CallNonvirtualByteMethodA(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, const jvalue *args) {
NYI();
abort();
return 0;
}
jchar CallNonvirtualCharMethod(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, ...) {
NYI();
abort();
return 0;
}
jchar CallNonvirtualCharMethodV(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, va_list args) {
NYI();
abort();
return 0;
}
jchar CallNonvirtualCharMethodA(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, const jvalue *args) {
NYI();
abort();
return 0;
}
jshort CallNonvirtualShortMethod(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, ...) {
NYI();
abort();
return 0;
}
jshort CallNonvirtualShortMethodV(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, va_list args) {
NYI();
abort();
return 0;
}
jshort CallNonvirtualShortMethodA(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, const jvalue *args) {
NYI();
abort();
return 0;
}
jint CallNonvirtualIntMethod(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, ...) {
NYI();
abort();
return 0;
}
jint CallNonvirtualIntMethodV(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, va_list args) {
NYI();
abort();
return 0;
}
jint CallNonvirtualIntMethodA(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, const jvalue *args) {
NYI();
abort();
return 0;
}
jlong CallNonvirtualLongMethod(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, ...) {
NYI();
abort();
return 0;
}
jlong CallNonvirtualLongMethodV(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, va_list args) {
NYI();
abort();
return 0;
}
jlong CallNonvirtualLongMethodA(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, const jvalue *args) {
NYI();
abort();
return 0;
}
jfloat CallNonvirtualFloatMethod(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, ...) {
NYI();
abort();
return 0;
}
jfloat CallNonvirtualFloatMethodV(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, va_list args) {
NYI();
abort();
return 0;
}
jfloat CallNonvirtualFloatMethodA(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, const jvalue *args) {
NYI();
abort();
return 0;
}
jdouble CallNonvirtualDoubleMethod(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, ...) {
NYI();
abort();
return 0;
}
jdouble CallNonvirtualDoubleMethodV(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, va_list args) {
NYI();
abort();
return 0;
}
jdouble CallNonvirtualDoubleMethodA(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, const jvalue *args) {
NYI();
abort();
return 0;
}
void CallNonvirtualVoidMethod(JNIEnv *env, jobject _obj, jclass clazz,
jmethodID methodID, ...) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
verifyNull(_obj);
va_list ap;
va_start(ap, methodID);
// Local object references.
obj = *(JavaObject**)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, JavaObject::getClass(obj));
meth->invokeIntSpecialAP(vm, cl, obj, ap);
va_end(ap);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void CallNonvirtualVoidMethodV(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, va_list args) {
NYI();
abort();
}
void CallNonvirtualVoidMethodA(JNIEnv *env, jobject obj, jclass clazz,
jmethodID methodID, const jvalue * args) {
NYI();
abort();
}
jfieldID GetFieldID(JNIEnv *env, jclass _clazz, const char *aname,
const char *sig) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
Jnjvm* vm = JavaThread::get()->getJVM();
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);
if (cl->isClass()) {
const UTF8* name = cl->classLoader->hashUTF8->lookupAsciiz(aname);
if (name) {
const UTF8* type = cl->classLoader->hashUTF8->lookupAsciiz(sig);
if (type) {
JavaField* field = cl->asClass()->lookupField(name, type, false, true,
0);
RETURN_FROM_JNI((jfieldID)field);
}
}
}
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jobject GetObjectField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
JavaObject* obj = 0;
JavaObject* res = 0;
llvm_gcroot(obj, 0);
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
// Store local reference.
res = field->getInstanceObjectField(obj);
JavaThread* th = JavaThread::get();
jobject ret = (jobject)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jboolean GetBooleanField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
uint8 res = (uint8)field->getInstanceInt8Field(obj);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jbyte GetByteField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
sint8 res = (sint8)field->getInstanceInt8Field(obj);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jchar GetCharField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
uint16 res = (uint16)field->getInstanceInt16Field(obj);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jshort GetShortField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
sint16 res = (sint16)field->getInstanceInt16Field(obj);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jint GetIntField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
sint32 res = (sint32)field->getInstanceInt32Field(obj);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jlong GetLongField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
sint64 res = (sint64)field->getInstanceLongField(obj);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jfloat GetFloatField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
jfloat res = (jfloat)field->getInstanceFloatField(obj);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jdouble GetDoubleField(JNIEnv *env, jobject _obj, jfieldID fieldID) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
jdouble res = (jdouble)field->getInstanceDoubleField(obj);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
void SetObjectField(JNIEnv *env, jobject _obj, jfieldID fieldID, jobject _value) {
JavaObject* obj = 0;
JavaObject* value = 0;
llvm_gcroot(obj, 0);
llvm_gcroot(value, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
value = *(JavaObject**)_value;
JavaField* field = (JavaField*)fieldID;
field->setInstanceObjectField(obj, value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetBooleanField(JNIEnv *env, jobject _obj, jfieldID fieldID,
jboolean value) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
field->setInstanceInt8Field(obj, (uint8)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetByteField(JNIEnv *env, jobject _obj, jfieldID fieldID, jbyte value) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
field->setInstanceInt8Field(obj, (uint8)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetCharField(JNIEnv *env, jobject _obj, jfieldID fieldID, jchar value) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
field->setInstanceInt16Field(obj, (uint16)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetShortField(JNIEnv *env, jobject _obj, jfieldID fieldID, jshort value) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
field->setInstanceInt16Field(obj, (sint16)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetIntField(JNIEnv *env, jobject _obj, jfieldID fieldID, jint value) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
field->setInstanceInt32Field(obj, (sint32)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetLongField(JNIEnv *env, jobject _obj, jfieldID fieldID, jlong value) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
field->setInstanceLongField(obj, (sint64)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetFloatField(JNIEnv *env, jobject _obj, jfieldID fieldID, jfloat value) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
field->setInstanceFloatField(obj, (float)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetDoubleField(JNIEnv *env, jobject _obj, jfieldID fieldID, jdouble value) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
obj = *(JavaObject**)_obj;
JavaField* field = (JavaField*)fieldID;
field->setInstanceDoubleField(obj, (float)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
jmethodID GetStaticMethodID(JNIEnv *env, jclass _clazz, const char *aname,
const char *atype) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
Jnjvm* vm = JavaThread::get()->getJVM();
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);
if (cl->isClass()) {
const UTF8* name = cl->classLoader->hashUTF8->lookupAsciiz(aname);
if (name) {
const UTF8* type = cl->classLoader->hashUTF8->lookupAsciiz(atype);
if (type) {
JavaMethod* meth = cl->asClass()->lookupMethod(name, type, true, true,
0);
RETURN_FROM_JNI((jmethodID)meth);
}
}
}
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jobject CallStaticObjectMethod(JNIEnv *env, jclass _clazz, jmethodID methodID,
...) {
JavaObject* clazz = 0;
JavaObject* res = 0;
llvm_gcroot(clazz, 0);
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
va_list ap;
va_start(ap, methodID);
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
// Store local reference.
res = meth->invokeJavaObjectStaticAP(vm, cl, ap);
va_end(ap);
jobject ret = (jobject)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jobject CallStaticObjectMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
va_list args) {
JavaObject* clazz = 0;
JavaObject* res = 0;
llvm_gcroot(clazz, 0);
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
// Store local reference.
res = meth->invokeJavaObjectStaticAP(vm, cl, args);
jobject ret = (jobject)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jobject CallStaticObjectMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
const jvalue *args) {
JavaObject* clazz = 0;
JavaObject* res = 0;
llvm_gcroot(clazz, 0);
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
res = meth->invokeJavaObjectStaticBuf(vm, cl, (void*)args);
jobject ret = (jobject)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jboolean CallStaticBooleanMethod(JNIEnv *env, jclass _clazz, jmethodID methodID,
...) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
va_list ap;
va_start(ap, methodID);
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
uint32 res = meth->invokeIntStaticAP(vm, cl, ap);
va_end(ap);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jboolean CallStaticBooleanMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
va_list args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jboolean res = (jboolean)meth->invokeIntStaticAP(vm, cl, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jboolean CallStaticBooleanMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
const jvalue *args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jboolean res = (jboolean) meth->invokeIntStaticBuf(vm, cl, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jbyte CallStaticByteMethod(JNIEnv *env, jclass _clazz, jmethodID methodID, ...) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
va_list ap;
va_start(ap, methodID);
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jbyte res = (jbyte) meth->invokeIntStaticAP(vm, cl, ap);
va_end(ap);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jbyte CallStaticByteMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
va_list args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jbyte res = (jbyte)meth->invokeIntStaticAP(vm, cl, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jbyte CallStaticByteMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
const jvalue *args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jbyte res = (jbyte) meth->invokeIntStaticBuf(vm, cl, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jchar CallStaticCharMethod(JNIEnv *env, jclass _clazz, jmethodID methodID, ...) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
va_list ap;
va_start(ap, methodID);
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jchar res = (jchar) meth->invokeIntStaticAP(vm, cl, ap);
va_end(ap);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jchar CallStaticCharMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
va_list args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jchar res = (jchar)meth->invokeIntStaticAP(vm, cl, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jchar CallStaticCharMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
const jvalue *args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jchar res = (jchar) meth->invokeIntStaticBuf(vm, cl, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jshort CallStaticShortMethod(JNIEnv *env, jclass _clazz, jmethodID methodID,
...) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
va_list ap;
va_start(ap, methodID);
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jshort res = (jshort) meth->invokeIntStaticAP(vm, cl, ap);
va_end(ap);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jshort CallStaticShortMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
va_list args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jshort res = (jshort)meth->invokeIntStaticAP(vm, cl, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jshort CallStaticShortMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
const jvalue *args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jshort res = (jshort) meth->invokeIntStaticBuf(vm, cl, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jint CallStaticIntMethod(JNIEnv *env, jclass _clazz, jmethodID methodID, ...) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
va_list ap;
va_start(ap, methodID);
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jint res = (jint) meth->invokeIntStaticAP(vm, cl, ap);
va_end(ap);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jint CallStaticIntMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
va_list args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jint res = (jint)meth->invokeIntStaticAP(vm, cl, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jint CallStaticIntMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
const jvalue *args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jint res = (jint) meth->invokeIntStaticBuf(vm, cl, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jlong CallStaticLongMethod(JNIEnv *env, jclass _clazz, jmethodID methodID, ...) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
va_list ap;
va_start(ap, methodID);
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jlong res = (jlong) meth->invokeLongStaticAP(vm, cl, ap);
va_end(ap);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jlong CallStaticLongMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
va_list args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jlong res = (jlong)meth->invokeLongStaticAP(vm, cl, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jlong CallStaticLongMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
const jvalue *args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jlong res = (jlong) meth->invokeLongStaticBuf(vm, cl, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jfloat CallStaticFloatMethod(JNIEnv *env, jclass _clazz, jmethodID methodID,
...) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
va_list ap;
va_start(ap, methodID);
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jfloat res = (jfloat) meth->invokeFloatStaticAP(vm, cl, ap);
va_end(ap);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0.0f);
}
jfloat CallStaticFloatMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
va_list args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jfloat res = (jfloat)meth->invokeFloatStaticAP(vm, cl, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0.0f);
}
jfloat CallStaticFloatMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
const jvalue *args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jfloat res = (jfloat) meth->invokeFloatStaticBuf(vm, cl, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jdouble CallStaticDoubleMethod(JNIEnv *env, jclass _clazz, jmethodID methodID,
...) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
va_list ap;
va_start(ap, methodID);
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jdouble res = (jdouble) meth->invokeDoubleStaticAP(vm, cl, ap);
va_end(ap);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0.0);
}
jdouble CallStaticDoubleMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
va_list args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jdouble res = (jdouble)meth->invokeDoubleStaticAP(vm, cl, args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0.0);
}
jdouble CallStaticDoubleMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
const jvalue *args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
jdouble res = (jdouble) meth->invokeDoubleStaticBuf(vm, cl, (void*)args);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
void CallStaticVoidMethod(JNIEnv *env, jclass _clazz, jmethodID methodID, ...) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
va_list ap;
va_start(ap, methodID);
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
meth->invokeIntStaticAP(vm, cl, ap);
va_end(ap);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void CallStaticVoidMethodV(JNIEnv *env, jclass _clazz, jmethodID methodID,
va_list args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
meth->invokeIntStaticAP(vm, cl, args);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void CallStaticVoidMethodA(JNIEnv *env, jclass _clazz, jmethodID methodID,
const jvalue * args) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromStaticMethod(vm, meth, clazz);
meth->invokeIntStaticBuf(vm, cl, (void*)args);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
jfieldID GetStaticFieldID(JNIEnv *env, jclass _clazz, const char *aname,
const char *sig) {
JavaObject* clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
clazz = *(JavaObject**)_clazz;
Jnjvm* vm = JavaThread::get()->getJVM();
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);
if (cl->isClass()) {
const UTF8* name = cl->classLoader->hashUTF8->lookupAsciiz(aname);
if (name) {
const UTF8* type = cl->classLoader->hashUTF8->lookupAsciiz(sig);
if (type) {
JavaField* field = cl->asClass()->lookupField(name, type, true, true,
0);
RETURN_FROM_JNI((jfieldID)field);
}
}
}
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jobject GetStaticObjectField(JNIEnv *env, jclass _clazz, jfieldID fieldID) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
JavaField* field = (JavaField*)fieldID;
obj = field->getStaticObjectField();
jobject res = (jobject)th->pushJNIRef(obj);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jboolean GetStaticBooleanField(JNIEnv *env, jclass _clazz, jfieldID fieldID) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
jboolean res = (jboolean)field->getStaticInt8Field();
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jbyte GetStaticByteField(JNIEnv *env, jclass _clazz, jfieldID fieldID) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
jbyte res = (jbyte)field->getStaticInt8Field();
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jchar GetStaticCharField(JNIEnv *env, jclass _clazz, jfieldID fieldID) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
jchar res = (jchar)field->getStaticInt16Field();
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jshort GetStaticShortField(JNIEnv *env, jclass _clazz, jfieldID fieldID) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
jshort res = (jshort)field->getStaticInt16Field();
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jint GetStaticIntField(JNIEnv *env, jclass _clazz, jfieldID fieldID) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
jint res = (jint)field->getStaticInt32Field();
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jlong GetStaticLongField(JNIEnv *env, jclass _clazz, jfieldID fieldID) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
jlong res = (jlong)field->getStaticLongField();
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jfloat GetStaticFloatField(JNIEnv *env, jclass _clazz, jfieldID fieldID) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
jfloat res = (jfloat)field->getStaticFloatField();
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jdouble GetStaticDoubleField(JNIEnv *env, jclass _clazz, jfieldID fieldID) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
jdouble res = (jdouble)field->getStaticDoubleField();
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
void SetStaticObjectField(JNIEnv *env, jclass _clazz, jfieldID fieldID,
jobject _value) {
JavaObject* value = 0;
llvm_gcroot(value, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
value = *(JavaObject**)_value;
JavaField* field = (JavaField*)fieldID;
field->setStaticObjectField(value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetStaticBooleanField(JNIEnv *env, jclass _clazz, jfieldID fieldID,
jboolean value) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
field->setStaticInt8Field((uint8)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetStaticByteField(JNIEnv *env, jclass _clazz, jfieldID fieldID,
jbyte value) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
field->setStaticInt8Field((sint8)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetStaticCharField(JNIEnv *env, jclass _clazz, jfieldID fieldID,
jchar value) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
field->setStaticInt16Field((uint16)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetStaticShortField(JNIEnv *env, jclass _clazz, jfieldID fieldID,
jshort value) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
field->setStaticInt16Field((sint16)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetStaticIntField(JNIEnv *env, jclass _clazz, jfieldID fieldID,
jint value) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
field->setStaticInt32Field((sint32)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetStaticLongField(JNIEnv *env, jclass _clazz, jfieldID fieldID,
jlong value) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
field->setStaticLongField((sint64)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetStaticFloatField(JNIEnv *env, jclass _clazz, jfieldID fieldID,
jfloat value) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
field->setStaticFloatField((float)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetStaticDoubleField(JNIEnv *env, jclass _clazz, jfieldID fieldID,
jdouble value) {
BEGIN_JNI_EXCEPTION
JavaField* field = (JavaField*)fieldID;
field->setStaticDoubleField((double)value);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
jstring NewString(JNIEnv *env, const jchar *buf, jsize len) {
JavaString* obj = NULL;
ArrayUInt16* tmp = NULL;
llvm_gcroot(obj, 0);
llvm_gcroot(tmp, 0);
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
tmp = (ArrayUInt16*)vm->upcalls->ArrayOfChar->doNew(len, vm);
for (sint32 i = 0; i < len; i++) {
ArrayUInt16::setElement(tmp, buf[i], i);
}
obj = vm->constructString(tmp);
assert(obj->count == len);
jstring ret = (jstring)th->pushJNIRef(obj);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jsize GetStringLength(JNIEnv *env, jstring _str) {
JavaString* str = 0;
llvm_gcroot(str, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
str = *(JavaString**)_str;
RETURN_FROM_JNI(str->count);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
const jchar *GetStringChars(JNIEnv *env, jstring str, jboolean *isCopy) {
NYI();
abort();
return 0;
}
void ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars) {
NYI();
abort();
}
jstring NewStringUTF(JNIEnv *env, const char *bytes) {
JavaObject* obj = NULL;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
obj = vm->asciizToStr(bytes);
jstring ret = (jstring)th->pushJNIRef(obj);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jsize GetStringUTFLength (JNIEnv *env, jstring string) {
JavaString* s = NULL;
llvm_gcroot(s, 0);
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
s = *(JavaString**)string;
RETURN_FROM_JNI(s->count);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0)
}
const char *GetStringUTFChars(JNIEnv *env, jstring _string, jboolean *isCopy) {
JavaString* string = 0;
llvm_gcroot(string, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
string = *(JavaString**)_string;
if (isCopy != 0) (*isCopy) = true;
const char* res = JavaString::strToAsciiz(string);
RETURN_FROM_JNI(res);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
void ReleaseStringUTFChars(JNIEnv *env, jstring _string, const char *utf) {
delete[] utf;
}
jsize GetArrayLength(JNIEnv *env, jarray _array) {
JavaObject* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
array = *(JavaObject**)_array;
RETURN_FROM_JNI(JavaArray::getSize(array));
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jobjectArray NewObjectArray(JNIEnv *env, jsize length, jclass _elementClass,
jobject _initialElement) {
JavaObject* elementClass = 0;
JavaObject* initialElement = 0;
ArrayObject* res = 0;
llvm_gcroot(elementClass, 0);
llvm_gcroot(initialElement, 0);
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
elementClass = *(JavaObject**)_elementClass;
initialElement = _initialElement ?
*(JavaObject**)_initialElement : 0;
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
if (length < 0) vm->negativeArraySizeException(length);
UserCommonClass* base =
UserCommonClass::resolvedImplClass(vm, elementClass, true);
JnjvmClassLoader* loader = base->classLoader;
const UTF8* name = base->getName();
const UTF8* arrayName = loader->constructArrayName(1, name);
UserClassArray* array = loader->constructArray(arrayName, base);
res = (ArrayObject*)array->doNew(length, vm);
if (initialElement) {
for (sint32 i = 0; i < length; ++i) {
ArrayObject::setElement(res, initialElement, i);
}
}
jobjectArray ret = (jobjectArray)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jobject GetObjectArrayElement(JNIEnv *env, jobjectArray _array, jsize index) {
ArrayObject* array = 0;
JavaObject* res = 0;
llvm_gcroot(array, 0);
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
array = *(ArrayObject**)_array;
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
if (index >= ArrayObject::getSize(array)) {
vm->indexOutOfBounds(array, index);
}
// Store local refererence.
res = ArrayObject::getElement(array, index);
jobject ret = (jobject)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
void SetObjectArrayElement(JNIEnv *env, jobjectArray _array, jsize index,
jobject _val) {
ArrayObject* array = 0;
JavaObject* val = 0;
llvm_gcroot(array, 0);
llvm_gcroot(val, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
array = *(ArrayObject**)_array;
val = *(JavaObject**)_val;
if (index >= ArrayObject::getSize(array)) {
JavaThread::get()->getJVM()->indexOutOfBounds(array, index);
}
// Store global reference.
ArrayObject::setElement(array, val, index);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
jbooleanArray NewBooleanArray(JNIEnv *env, jsize len) {
JavaObject* res = NULL;
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
res = vm->upcalls->ArrayOfBool->doNew(len, vm);
jbooleanArray ret = (jbooleanArray)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jbyteArray NewByteArray(JNIEnv *env, jsize len) {
JavaObject* res = NULL;
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
res = vm->upcalls->ArrayOfByte->doNew(len, vm);
jbyteArray ret = (jbyteArray)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jcharArray NewCharArray(JNIEnv *env, jsize len) {
JavaObject* res = NULL;
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
res = vm->upcalls->ArrayOfChar->doNew(len, vm);
jcharArray ret = (jcharArray)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jshortArray NewShortArray(JNIEnv *env, jsize len) {
JavaObject* res = NULL;
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
res = vm->upcalls->ArrayOfShort->doNew(len, vm);
jshortArray ret = (jshortArray)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jintArray NewIntArray(JNIEnv *env, jsize len) {
JavaObject* res = NULL;
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
res = vm->upcalls->ArrayOfInt->doNew(len, vm);
jintArray ret = (jintArray)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jlongArray NewLongArray(JNIEnv *env, jsize len) {
JavaObject* res = NULL;
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
res = vm->upcalls->ArrayOfLong->doNew(len, vm);
jlongArray ret = (jlongArray)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jfloatArray NewFloatArray(JNIEnv *env, jsize len) {
JavaObject* res = NULL;
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
res = vm->upcalls->ArrayOfFloat->doNew(len, vm);
jfloatArray ret = (jfloatArray)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jdoubleArray NewDoubleArray(JNIEnv *env, jsize len) {
JavaObject* res = NULL;
llvm_gcroot(res, 0);
BEGIN_JNI_EXCEPTION
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
res = vm->upcalls->ArrayOfDouble->doNew(len, vm);
jdoubleArray ret = (jdoubleArray)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jboolean* GetBooleanArrayElements(JNIEnv *env, jbooleanArray _array,
jboolean *isCopy) {
ArrayUInt8* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
array = *(ArrayUInt8**)_array;
if (isCopy) (*isCopy) = true;
sint32 len = ArrayUInt8::getSize(array) * sizeof(uint8);
void* buffer = malloc(len);
memcpy(buffer, ArrayUInt8::getElements(array), len);
RETURN_FROM_JNI((jboolean*)buffer);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jbyte *GetByteArrayElements(JNIEnv *env, jbyteArray _array, jboolean *isCopy) {
ArraySInt8* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
array = *(ArraySInt8**)_array;
if (isCopy) (*isCopy) = true;
sint32 len = ArraySInt8::getSize(array) * sizeof(uint8);
void* buffer = malloc(len);
memcpy(buffer, ArraySInt8::getElements(array), len);
RETURN_FROM_JNI((jbyte*)buffer);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jchar *GetCharArrayElements(JNIEnv *env, jcharArray _array, jboolean *isCopy) {
ArrayUInt16* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
array = *(ArrayUInt16**)_array;
if (isCopy) (*isCopy) = true;
sint32 len = ArrayUInt16::getSize(array) * sizeof(uint16);
void* buffer = malloc(len);
memcpy(buffer, ArrayUInt16::getElements(array), len);
RETURN_FROM_JNI((jchar*)buffer);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jshort *GetShortArrayElements(JNIEnv *env, jshortArray _array,
jboolean *isCopy) {
ArraySInt16* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
array = *(ArraySInt16**)_array;
if (isCopy) (*isCopy) = true;
sint32 len = ArraySInt16::getSize(array) * sizeof(sint16);
void* buffer = malloc(len);
memcpy(buffer, ArraySInt16::getElements(array), len);
RETURN_FROM_JNI((jshort*)buffer);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jint *GetIntArrayElements(JNIEnv *env, jintArray _array, jboolean *isCopy) {
ArraySInt32* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
array = *(ArraySInt32**)_array;
if (isCopy) (*isCopy) = true;
sint32 len = ArraySInt32::getSize(array) * sizeof(sint32);
void* buffer = malloc(len);
memcpy(buffer, ArraySInt32::getElements(array), len);
RETURN_FROM_JNI((jint*)buffer);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jlong *GetLongArrayElements(JNIEnv *env, jlongArray _array, jboolean *isCopy) {
ArrayLong* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
array = *(ArrayLong**)_array;
if (isCopy) (*isCopy) = true;
sint32 len = ArrayLong::getSize(array) * sizeof(sint64);
void* buffer = malloc(len);
memcpy(buffer, ArrayLong::getElements(array), len);
RETURN_FROM_JNI((jlong*)buffer);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jfloat *GetFloatArrayElements(JNIEnv *env, jfloatArray _array,
jboolean *isCopy) {
ArrayFloat* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
array = *(ArrayFloat**)_array;
if (isCopy) (*isCopy) = true;
sint32 len = ArrayFloat::getSize(array) * sizeof(float);
void* buffer = malloc(len);
memcpy(buffer, ArrayFloat::getElements(array), len);
RETURN_FROM_JNI((jfloat*)buffer);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jdouble *GetDoubleArrayElements(JNIEnv *env, jdoubleArray _array,
jboolean *isCopy) {
ArrayDouble* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
array = *(ArrayDouble**)_array;
if (isCopy) (*isCopy) = true;
sint32 len = ArrayDouble::getSize(array) * sizeof(double);
void* buffer = malloc(len);
memcpy(buffer, ArrayDouble::getElements(array), len);
RETURN_FROM_JNI((jdouble*)buffer);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
void ReleaseBooleanArrayElements(JNIEnv *env, jbooleanArray _array,
jboolean *elems, jint mode) {
ArrayUInt8* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
array = *(ArrayUInt8**)_array;
if (mode == JNI_ABORT) {
free(elems);
} else {
sint32 len = ArrayUInt8::getSize(array);
memcpy(ArrayUInt8::getElements(array), elems, len);
if (mode == 0) free(elems);
}
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void ReleaseByteArrayElements(JNIEnv *env, jbyteArray _array, jbyte *elems,
jint mode) {
ArraySInt16* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
array = *(ArraySInt16**)_array;
if (mode == JNI_ABORT) {
free(elems);
} else {
sint32 len = ArraySInt16::getSize(array);
memcpy(ArraySInt16::getElements(array), elems, len);
if (mode == 0) free(elems);
}
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void ReleaseCharArrayElements(JNIEnv *env, jcharArray _array, jchar *elems,
jint mode) {
ArrayUInt16* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
array = *(ArrayUInt16**)_array;
if (mode == JNI_ABORT) {
free(elems);
} else {
sint32 len = ArrayUInt16::getSize(array) << 1;
memcpy(ArrayUInt16::getElements(array), elems, len);
if (mode == 0) free(elems);
}
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void ReleaseShortArrayElements(JNIEnv *env, jshortArray _array, jshort *elems,
jint mode) {
ArraySInt16* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
array = *(ArraySInt16**)_array;
if (mode == JNI_ABORT) {
free(elems);
} else {
sint32 len = ArraySInt16::getSize(array) << 1;
memcpy(ArraySInt16::getElements(array), elems, len);
if (mode == 0) free(elems);
}
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void ReleaseIntArrayElements(JNIEnv *env, jintArray _array, jint *elems,
jint mode) {
ArraySInt32* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
array = *(ArraySInt32**)_array;
if (mode == JNI_ABORT) {
free(elems);
} else {
sint32 len = ArraySInt32::getSize(array) << 2;
memcpy(ArraySInt32::getElements(array), elems, len);
if (mode == 0) free(elems);
}
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void ReleaseLongArrayElements(JNIEnv *env, jlongArray _array, jlong *elems,
jint mode) {
ArrayLong* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
array = *(ArrayLong**)_array;
if (mode == JNI_ABORT) {
free(elems);
} else {
sint32 len = ArrayLong::getSize(array) << 3;
memcpy(ArrayLong::getElements(array), elems, len);
if (mode == 0) free(elems);
}
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void ReleaseFloatArrayElements(JNIEnv *env, jfloatArray _array, jfloat *elems,
jint mode) {
ArrayFloat* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
array = *(ArrayFloat**)_array;
if (mode == JNI_ABORT) {
free(elems);
} else {
sint32 len = ArrayFloat::getSize(array) << 2;
memcpy(ArrayFloat::getElements(array), elems, len);
if (mode == 0) free(elems);
}
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void ReleaseDoubleArrayElements(JNIEnv *env, jdoubleArray _array,
jdouble *elems, jint mode) {
ArrayDouble* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
array = *(ArrayDouble**)_array;
if (mode == JNI_ABORT) {
free(elems);
} else {
sint32 len = ArrayDouble::getSize(array) << 3;
memcpy(ArrayDouble::getElements(array), elems, len);
if (mode == 0) free(elems);
}
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void GetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start,
jsize len, jboolean *buf) {
ArrayUInt8* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArrayUInt8**)array;
memcpy(buf, ArrayUInt8::getElements(Array) + start, len * sizeof(uint8));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void GetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len,
jbyte *buf) {
ArraySInt8* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArraySInt8**)array;
memcpy(buf, ArraySInt8::getElements(Array) + start, len * sizeof(uint8));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void GetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, jsize len,
jchar *buf) {
ArrayUInt16* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArrayUInt16**)array;
memcpy(buf, ArrayUInt16::getElements(Array) + start, len * sizeof(uint16));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void GetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
jsize len, jshort *buf) {
ArraySInt16* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArraySInt16**)array;
memcpy(buf, ArraySInt16::getElements(Array) + start, len * sizeof(sint16));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void GetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, jsize len,
jint *buf) {
ArraySInt32* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArraySInt32**)array;
memcpy(buf, ArraySInt32::getElements(Array) + start, len * sizeof(sint32));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void GetLongArrayRegion(JNIEnv *env, jlongArray array, jsize start, jsize len,
jlong *buf) {
ArrayLong* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArrayLong**)array;
memcpy(buf, ArrayLong::getElements(Array) + start, len * sizeof(sint64));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void GetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start,
jsize len, jfloat *buf) {
ArrayFloat* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArrayFloat**)array;
memcpy(buf, ArrayFloat::getElements(Array) + start, len * sizeof(float));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void GetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
jsize len, jdouble *buf) {
ArrayDouble* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArrayDouble**)array;
memcpy(buf, ArrayDouble::getElements(Array) + start, len * sizeof(double));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start,
jsize len, const jboolean *buf) {
ArrayUInt8* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArrayUInt8**)array;
memcpy(ArrayUInt8::getElements(Array) + start, buf, len * sizeof(uint8));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len,
const jbyte *buf) {
ArraySInt8* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArraySInt8**)array;
memcpy(ArraySInt8::getElements(Array) + start, buf, len * sizeof(sint8));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, jsize len,
const jchar *buf) {
ArrayUInt16* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArrayUInt16**)array;
memcpy(ArrayUInt16::getElements(Array) + start, buf, len * sizeof(uint16));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
jsize len, const jshort *buf) {
ArraySInt16* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArraySInt16**)array;
memcpy(ArraySInt16::getElements(Array) + start, buf, len * sizeof(sint16));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, jsize len,
const jint *buf) {
ArraySInt32* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArraySInt32**)array;
memcpy(ArraySInt32::getElements(Array) + start, buf, len * sizeof(sint32));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize len,
const jlong *buf) {
ArrayLong* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArrayLong**)array;
memcpy(ArrayLong::getElements(Array) + start, buf, len * sizeof(sint64));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start,
jsize len, const jfloat *buf) {
ArrayFloat* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArrayFloat**)array;
memcpy(ArrayFloat::getElements(Array) + start, buf, len * sizeof(float));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void SetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
jsize len, const jdouble *buf) {
ArrayDouble* Array = 0;
llvm_gcroot(Array, 0);
BEGIN_JNI_EXCEPTION
Array = *(ArrayDouble**)array;
memcpy(ArrayDouble::getElements(Array) + start, buf, len * sizeof(double));
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
jint RegisterNatives(JNIEnv *env, jclass _clazz, const JNINativeMethod *methods,
jint nMethods) {
JavaObject * clazz = 0;
llvm_gcroot(clazz, 0);
BEGIN_JNI_EXCEPTION
clazz = *(JavaObject**)_clazz;
Jnjvm* vm = JavaThread::get()->getJVM();
UserCommonClass * Cl = UserCommonClass::resolvedImplClass(vm, clazz, false);
// TODO: Don't assert, throw exceptions!
assert(Cl);
UserClass * cl = Cl->asClass();
for(int i = 0; i < nMethods; ++i)
{
const UTF8* name = cl->classLoader->hashUTF8->lookupAsciiz(methods[i].name);
const UTF8* sign = cl->classLoader->hashUTF8->lookupAsciiz(methods[i].signature);
assert(name);
assert(sign);
JavaMethod * meth = cl->lookupMethodDontThrow(name, sign, true, true, 0);
if (!meth) meth = cl->lookupMethodDontThrow(name, sign, false, true, 0);
// TODO: Don't assert, throw exceptions!
assert(meth);
assert(isNative(meth->access));
cl->classLoader->registerNative(meth,(word_t)methods[i].fnPtr);
}
RETURN_FROM_JNI(0)
END_JNI_EXCEPTION
RETURN_FROM_JNI(0)
}
jint UnregisterNatives(JNIEnv *env, jclass clazz) {
NYI();
abort();
return 0;
}
jint MonitorEnter(JNIEnv *env, jobject _obj) {
JavaObject* Obj = 0;
llvm_gcroot(Obj, 0);
BEGIN_JNI_EXCEPTION
Obj = *(JavaObject**)_obj;
if (Obj != NULL) {
JavaObject::acquire(Obj);
RETURN_FROM_JNI(0);
} else {
RETURN_FROM_JNI(-1);
}
END_JNI_EXCEPTION
RETURN_FROM_JNI(-1);
}
jint MonitorExit(JNIEnv *env, jobject _obj) {
JavaObject* Obj = 0;
llvm_gcroot(Obj, 0);
BEGIN_JNI_EXCEPTION
Obj = *(JavaObject**)_obj;
if (Obj != NULL) {
if (!JavaObject::owner(Obj)) {
printf("IN Jni.cpp: 3854 EXCEPTION\n");
JavaThread::get()->getJVM()->illegalMonitorStateException(Obj);
}
JavaObject::release(Obj);
RETURN_FROM_JNI(0);
} else {
RETURN_FROM_JNI(-1);
}
END_JNI_EXCEPTION
RETURN_FROM_JNI(-1);
}
jint GetJavaVM(JNIEnv *env, JavaVM **vm) {
BEGIN_JNI_EXCEPTION
Jnjvm* myvm = JavaThread::get()->getJVM();
(*vm) = (JavaVM*)(void*)(&(myvm->javavmEnv));
RETURN_FROM_JNI(0);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
void GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len,
jchar *buf) {
JavaString * s = 0;
llvm_gcroot(s, 0);
BEGIN_JNI_EXCEPTION
s = *(JavaString**)str;
UserClass * cl = JavaObject::getClass(s)->asClass();
const UTF8 * utf = JavaString::javaToInternal(s, cl->classLoader->hashUTF8);
ssize_t end = start+len;
if (end > utf->size) {
assert(0 && "Throw string out of bounds exception here!");
}
Jnjvm* vm = JavaThread::get()->getJVM();
UTF8Map* map = vm->bootstrapLoader->hashUTF8;
const UTF8 * result = utf->extract(map, start, start + len);
assert(result->size == len);
for(sint32 i = 0; i < len; ++i)
buf[i] = result->elements[i];
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void GetStringUTFRegion(JNIEnv* env, jstring str, jsize start, jsize len,
char *buf) {
JavaString * s = 0;
llvm_gcroot(s, 0);
BEGIN_JNI_EXCEPTION
s = *(JavaString**)str;
int end = start+len;
if (end > s->count) {
assert(0 && "Throw string out of bounds exception here!");
}
char * internalStr = JavaString::strToAsciiz(s);
assert((int)strlen(internalStr) == len);
memcpy(buf, internalStr, len + 1);
RETURN_VOID_FROM_JNI;
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
void *GetPrimitiveArrayCritical(JNIEnv *env, jarray _array, jboolean *isCopy) {
JavaObject* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
array = *(JavaObject**)_array;
if (isCopy) (*isCopy) = true;
UserClassArray* cl = JavaObject::getClass(array)->asArrayClass();
uint32 logSize = cl->baseClass()->asPrimitiveClass()->logSize;
sint32 len = JavaArray::getSize(array) << logSize;
void* buffer = malloc(len);
memcpy(buffer, JavaArray::getElements(array), len);
RETURN_FROM_JNI((jchar*)buffer);
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
void ReleasePrimitiveArrayCritical(JNIEnv *env, jarray _array, void *carray,
jint mode) {
JavaObject* array = 0;
llvm_gcroot(array, 0);
BEGIN_JNI_EXCEPTION
array = *(JavaObject**)_array;
if (mode == JNI_ABORT) {
free(carray);
} else {
UserClassArray* cl = JavaObject::getClass(array)->asArrayClass();
uint32 logSize = cl->baseClass()->asPrimitiveClass()->logSize;
sint32 len = JavaArray::getSize(array) << logSize;
memcpy(JavaArray::getElements(array), carray, len);
if (mode == 0) free(carray);
}
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
const jchar *GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy) {
NYI();
abort();
return 0;
}
void ReleaseStringCritical(JNIEnv *env, jstring string, const jchar *cstring) {
NYI();
abort();
}
/// FIXME : I copied the code of strong references. We need to implement real
/// weak references.
///
jweak NewWeakGlobalRef(JNIEnv* env, jobject obj) {
JavaObject* Obj = NULL;
llvm_gcroot(Obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
if (obj) {
Obj = *(JavaObject**)obj;
Jnjvm* vm = JavaThread::get()->getJVM();
vm->globalRefsLock.lock();
JavaObject** res = vm->globalRefs.addJNIReference(Obj);
vm->globalRefsLock.unlock();
RETURN_FROM_JNI((jweak)(jobject)res);
} else {
RETURN_FROM_JNI(0);
}
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
void DeleteWeakGlobalRef(JNIEnv* env, jweak ref) {
BEGIN_JNI_EXCEPTION
Jnjvm* vm = myVM(env);
vm->globalRefsLock.lock();
vm->globalRefs.removeJNIReference((JavaObject**)ref);
vm->globalRefsLock.unlock();
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
jobject NewGlobalRef(JNIEnv* env, jobject obj) {
JavaObject* Obj = NULL;
llvm_gcroot(Obj, 0);
BEGIN_JNI_EXCEPTION
// Local object references.
if (obj) {
Obj = *(JavaObject**)obj;
Jnjvm* vm = JavaThread::get()->getJVM();
vm->globalRefsLock.lock();
JavaObject** res = vm->globalRefs.addJNIReference(Obj);
vm->globalRefsLock.unlock();
RETURN_FROM_JNI((jobject)res);
} else {
RETURN_FROM_JNI(0);
}
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
void DeleteGlobalRef(JNIEnv* env, jobject globalRef) {
BEGIN_JNI_EXCEPTION
Jnjvm* vm = myVM(env);
vm->globalRefsLock.lock();
vm->globalRefs.removeJNIReference((JavaObject**)globalRef);
vm->globalRefsLock.unlock();
END_JNI_EXCEPTION
RETURN_VOID_FROM_JNI;
}
jboolean ExceptionCheck(JNIEnv *env) {
BEGIN_JNI_EXCEPTION
if (JavaThread::get()->pendingException) {
RETURN_FROM_JNI(JNI_TRUE);
} else {
RETURN_FROM_JNI(JNI_FALSE);
}
END_JNI_EXCEPTION
RETURN_FROM_JNI(false);
}
jlong GetDirectBufferCapacity(JNIEnv* env, jobject buf) {
NYI();
abort();
return 0;
}
jobjectRefType GetObjectRefType(JNIEnv* env, jobject obj) {
NYI();
abort();
return (jobjectRefType)0;
}
jint DestroyJavaVM(JavaVM *vm) {
NYI();
abort();
return 0;
}
jint AttachCurrentThread(JavaVM *vm, void **env, void *thr_args) {
NYI();
abort();
return 0;
}
jint DetachCurrentThread(JavaVM *vm) {
NYI();
abort();
return 0;
}
jint GetEnv(JavaVM *vm, void **env, jint version) {
JavaObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_JNI_EXCEPTION
JavaThread* _th = JavaThread::get();
obj = _th->currentThread();
Jnjvm* myvm = _th->getJVM();
if (obj != 0) {
(*env) = &(myvm->jniEnv);
RETURN_FROM_JNI(JNI_OK);
} else {
(*env) = 0;
RETURN_FROM_JNI(JNI_EDETACHED);
}
END_JNI_EXCEPTION
RETURN_FROM_JNI(0);
}
jint AttachCurrentThreadAsDaemon(JavaVM *vm, void **par1, void *par2) {
NYI();
abort();
return 0;
}
// Pull in implementation-specific JNI methods
#ifdef USE_OPENJDK
#include "JniOpenJDK.inc"
#else
#include "JniClasspath.inc"
#endif
const struct JNIInvokeInterface_ JNI_JavaVMTable = {
NULL,
NULL,
NULL,
DestroyJavaVM,
AttachCurrentThread,
DetachCurrentThread,
GetEnv,
AttachCurrentThreadAsDaemon
};
struct JNINativeInterface_ JNI_JNIEnvTable = {
NULL,
NULL,
NULL,
NULL,
&GetVersion,
&DefineClass,
&FindClass,
&FromReflectedMethod,
&FromReflectedField,
&ToReflectedMethod,
&GetSuperclass,
&IsSubclassOf,
&ToReflectedField,
&Throw,
&ThrowNew,
&ExceptionOccurred,
&ExceptionDescribe,
&ExceptionClear,
&FatalError,
&PushLocalFrame,
&PopLocalFrame,
&NewGlobalRef,
&DeleteGlobalRef,
&DeleteLocalRef,
&IsSameObject,
&NewLocalRef,
&EnsureLocalCapacity,
&AllocObject,
&NewObject,
&NewObjectV,
&NewObjectA,
&GetObjectClass,
&IsInstanceOf,
&GetMethodID,
&CallObjectMethod,
&CallObjectMethodV,
&CallObjectMethodA,
&CallBooleanMethod,
&CallBooleanMethodV,
&CallBooleanMethodA,
&CallByteMethod,
&CallByteMethodV,
&CallByteMethodA,
&CallCharMethod,
&CallCharMethodV,
&CallCharMethodA,
&CallShortMethod,
&CallShortMethodV,
&CallShortMethodA,
&CallIntMethod,
&CallIntMethodV,
&CallIntMethodA,
&CallLongMethod,
&CallLongMethodV,
&CallLongMethodA,
&CallFloatMethod,
&CallFloatMethodV,
&CallFloatMethodA,
&CallDoubleMethod,
&CallDoubleMethodV,
&CallDoubleMethodA,
&CallVoidMethod,
&CallVoidMethodV,
&CallVoidMethodA,
&CallNonvirtualObjectMethod,
&CallNonvirtualObjectMethodV,
&CallNonvirtualObjectMethodA,
&CallNonvirtualBooleanMethod,
&CallNonvirtualBooleanMethodV,
&CallNonvirtualBooleanMethodA,
&CallNonvirtualByteMethod,
&CallNonvirtualByteMethodV,
&CallNonvirtualByteMethodA,
&CallNonvirtualCharMethod,
&CallNonvirtualCharMethodV,
&CallNonvirtualCharMethodA,
&CallNonvirtualShortMethod,
&CallNonvirtualShortMethodV,
&CallNonvirtualShortMethodA,
&CallNonvirtualIntMethod,
&CallNonvirtualIntMethodV,
&CallNonvirtualIntMethodA,
&CallNonvirtualLongMethod,
&CallNonvirtualLongMethodV,
&CallNonvirtualLongMethodA,
&CallNonvirtualFloatMethod,
&CallNonvirtualFloatMethodV,
&CallNonvirtualFloatMethodA,
&CallNonvirtualDoubleMethod,
&CallNonvirtualDoubleMethodV,
&CallNonvirtualDoubleMethodA,
&CallNonvirtualVoidMethod,
&CallNonvirtualVoidMethodV,
&CallNonvirtualVoidMethodA,
&GetFieldID,
&GetObjectField,
&GetBooleanField,
&GetByteField,
&GetCharField,
&GetShortField,
&GetIntField,
&GetLongField,
&GetFloatField,
&GetDoubleField,
&SetObjectField,
&SetBooleanField,
&SetByteField,
&SetCharField,
&SetShortField,
&SetIntField,
&SetLongField,
&SetFloatField,
&SetDoubleField,
&GetStaticMethodID,
&CallStaticObjectMethod,
&CallStaticObjectMethodV,
&CallStaticObjectMethodA,
&CallStaticBooleanMethod,
&CallStaticBooleanMethodV,
&CallStaticBooleanMethodA,
&CallStaticByteMethod,
&CallStaticByteMethodV,
&CallStaticByteMethodA,
&CallStaticCharMethod,
&CallStaticCharMethodV,
&CallStaticCharMethodA,
&CallStaticShortMethod,
&CallStaticShortMethodV,
&CallStaticShortMethodA,
&CallStaticIntMethod,
&CallStaticIntMethodV,
&CallStaticIntMethodA,
&CallStaticLongMethod,
&CallStaticLongMethodV,
&CallStaticLongMethodA,
&CallStaticFloatMethod,
&CallStaticFloatMethodV,
&CallStaticFloatMethodA,
&CallStaticDoubleMethod,
&CallStaticDoubleMethodV,
&CallStaticDoubleMethodA,
&CallStaticVoidMethod,
&CallStaticVoidMethodV,
&CallStaticVoidMethodA,
&GetStaticFieldID,
&GetStaticObjectField,
&GetStaticBooleanField,
&GetStaticByteField,
&GetStaticCharField,
&GetStaticShortField,
&GetStaticIntField,
&GetStaticLongField,
&GetStaticFloatField,
&GetStaticDoubleField,
&SetStaticObjectField,
&SetStaticBooleanField,
&SetStaticByteField,
&SetStaticCharField,
&SetStaticShortField,
&SetStaticIntField,
&SetStaticLongField,
&SetStaticFloatField,
&SetStaticDoubleField,
&NewString,
&GetStringLength,
&GetStringChars,
&ReleaseStringChars,
&NewStringUTF,
&GetStringUTFLength,
&GetStringUTFChars,
&ReleaseStringUTFChars,
&GetArrayLength,
&NewObjectArray,
&GetObjectArrayElement,
&SetObjectArrayElement,
&NewBooleanArray,
&NewByteArray,
&NewCharArray,
&NewShortArray,
&NewIntArray,
&NewLongArray,
&NewFloatArray,
&NewDoubleArray,
&GetBooleanArrayElements,
&GetByteArrayElements,
&GetCharArrayElements,
&GetShortArrayElements,
&GetIntArrayElements,
&GetLongArrayElements,
&GetFloatArrayElements,
&GetDoubleArrayElements,
&ReleaseBooleanArrayElements,
&ReleaseByteArrayElements,
&ReleaseCharArrayElements,
&ReleaseShortArrayElements,
&ReleaseIntArrayElements,
&ReleaseLongArrayElements,
&ReleaseFloatArrayElements,
&ReleaseDoubleArrayElements,
&GetBooleanArrayRegion,
&GetByteArrayRegion,
&GetCharArrayRegion,
&GetShortArrayRegion,
&GetIntArrayRegion,
&GetLongArrayRegion,
&GetFloatArrayRegion,
&GetDoubleArrayRegion,
&SetBooleanArrayRegion,
&SetByteArrayRegion,
&SetCharArrayRegion,
&SetShortArrayRegion,
&SetIntArrayRegion,
&SetLongArrayRegion,
&SetFloatArrayRegion,
&SetDoubleArrayRegion,
&RegisterNatives,
&UnregisterNatives,
&MonitorEnter,
&MonitorExit,
&GetJavaVM,
/* new JNI 1.2 functions */
&GetStringRegion,
&GetStringUTFRegion,
&GetPrimitiveArrayCritical,
&ReleasePrimitiveArrayCritical,
&GetStringCritical,
&ReleaseStringCritical,
&NewWeakGlobalRef,
&DeleteWeakGlobalRef,
&ExceptionCheck,
/* new JNI 1.4 functions */
&NewDirectByteBuffer,
&GetDirectBufferAddress,
&GetDirectBufferCapacity,
/* ---- JNI 1.6 functions ---- */
&GetObjectRefType
};