⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jni-callmethod.c

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * jni-callmethod.c * Java Native Interface - CallXMethod JNI functions. * * Copyright (c) 1996, 1997 *	Transvirtual Technologies, Inc.  All rights reserved. * * Copyright (c) 2004 *      The Kaffe.org's developers. See ChangeLog for details. * * See the file "license.terms" for information on usage and redistribution  * of this file.  */#include "config.h"#include "baseClasses.h"#include "threadData.h"#include "classMethod.h"#include "exception.h"#include "jni.h"#include "jni_i.h"#include "jnirefs.h"#include "jni_funcs.h"/* * Find the function to be called when meth is invoked on obj */static inline void*getMethodFunc (Method* meth, Hjava_lang_Object *obj){  if (obj && CLASS_IS_INTERFACE (meth->class)) {    register void ***implementors;    register Hjava_lang_Class *clazz;		    assert (meth->idx >= 0);    implementors = meth->class->implementors;    clazz = OBJECT_CLASS(obj);    assert (implementors != NULL && clazz->impl_index <= (int)implementors[0]);    return implementors[clazz->impl_index][meth->idx + 1]; 	  } else {    return meth->idx >= 0 ? obj->vtable->method[meth->idx] : METHOD_NATIVECODE (meth);  }}/* * The JNI functions. *//* ------------------------------------------------------------------------------ * Virtual method calls returning VOID * ------------------------------------------------------------------------------ */voidKaffeJNI_CallVoidMethodV(JNIEnv* env UNUSED, jobject obj, jmethodID meth, va_list args){  jobject obj_local;  Hjava_lang_Object* o;  Method* m = (Method*)meth;  BEGIN_EXCEPTION_HANDLING_VOID();  obj_local = unveil(obj);  o = (Hjava_lang_Object*)obj_local;  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  /*   * callMethodA will have to unveil the objects contained in the argument lists.   * This is not really pretty but more efficient because we do not parse the signature   * twice.   */  KaffeVM_callMethodV(m, getMethodFunc (m, o), o, args, NULL);  END_EXCEPTION_HANDLING();}voidKaffeJNI_CallVoidMethod(JNIEnv* env, jobject obj, jmethodID meth, ...){  va_list args;  BEGIN_EXCEPTION_HANDLING_VOID();  va_start(args, meth);  KaffeJNI_CallVoidMethodV(env, obj, meth, args);  va_end(args);  END_EXCEPTION_HANDLING();}voidKaffeJNI_CallVoidMethodA(JNIEnv* env UNUSED, jobject obj, jmethodID meth, jvalue* args){  jobject obj_local;  Hjava_lang_Object* o;  Method* m = (Method*)meth;  BEGIN_EXCEPTION_HANDLING_VOID();  obj_local = unveil(obj);  o = (Hjava_lang_Object*)obj_local;  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  /*   * callMethodA will have to unveil the objects contained in the argument lists.   * This is not really pretty but more efficient because we do not parse the signature   * twice.   */  KaffeVM_callMethodA(m, getMethodFunc (m, o), o, args, NULL, 0);  END_EXCEPTION_HANDLING();}/* ------------------------------------------------------------------------------ * Non-virtual method calls returning Object * ------------------------------------------------------------------------------ */jobjectKaffeJNI_CallNonvirtualObjectMethodV(JNIEnv* env UNUSED, jobject obj, jclass cls UNUSED, jmethodID meth, va_list args){  jvalue retval;  Method* m = (Method*)meth;  jobject obj_local;  BEGIN_EXCEPTION_HANDLING(NULL);  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  obj_local = unveil(obj);  KaffeVM_callMethodV(m, METHOD_NATIVECODE(m), obj_local, args, &retval);  ADD_REF(retval.l);  END_EXCEPTION_HANDLING();  return (retval.l);}jobjectKaffeJNI_CallNonvirtualObjectMethod(JNIEnv* env, jobject obj, jclass cls, jmethodID meth, ...){  va_list args;  jobject r;  BEGIN_EXCEPTION_HANDLING(NULL);  va_start(args, meth);  r = KaffeJNI_CallNonvirtualObjectMethodV(env, obj, cls, meth, args);  va_end(args);  END_EXCEPTION_HANDLING();  return (r);}jobjectKaffeJNI_CallNonvirtualObjectMethodA(JNIEnv* env UNUSED, jobject obj, jclass cls UNUSED, jmethodID meth, jvalue* args){  jvalue retval;  Method* m = (Method*)meth;  jobject obj_local;  BEGIN_EXCEPTION_HANDLING(NULL);    obj_local = unveil(obj);  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  KaffeVM_callMethodA(m, METHOD_NATIVECODE(m), obj_local, args, &retval, 0);  ADD_REF(retval.l);  END_EXCEPTION_HANDLING();  return (retval.l);}/* ------------------------------------------------------------------------------ * Non-virtual method calls returning boolean * ------------------------------------------------------------------------------ */jbooleanKaffeJNI_CallNonvirtualBooleanMethodV(JNIEnv* env UNUSED, jobject obj, jclass cls UNUSED, jmethodID meth, va_list args){  jvalue retval;  Method* m = (Method*)meth;  jobject obj_local;  BEGIN_EXCEPTION_HANDLING(0);  obj_local = unveil(obj);  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  KaffeVM_callMethodV(m, METHOD_NATIVECODE(m), obj_local, args, &retval);  END_EXCEPTION_HANDLING();  return ((jboolean) retval.i);}jbooleanKaffeJNI_CallNonvirtualBooleanMethod(JNIEnv* env, jobject obj, jclass cls, jmethodID meth, ...){  va_list args;  jboolean r;  BEGIN_EXCEPTION_HANDLING(0);  va_start(args, meth);  r = KaffeJNI_CallNonvirtualBooleanMethodV(env, obj, cls, meth, args);  va_end(args);  END_EXCEPTION_HANDLING();  return (r);}jbooleanKaffeJNI_CallNonvirtualBooleanMethodA(JNIEnv* env UNUSED, jobject obj, jclass cls UNUSED, jmethodID meth, jvalue* args){  jvalue retval;  Method* m = (Method*)meth;  jobject obj_local;  BEGIN_EXCEPTION_HANDLING(0);  obj_local = unveil(obj);  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  KaffeVM_callMethodA(m, METHOD_NATIVECODE(m), obj_local, args, &retval, 0);  END_EXCEPTION_HANDLING();  return ((jboolean) retval.i);}/* ------------------------------------------------------------------------------ * Non-virtual method calls returning byte * ------------------------------------------------------------------------------ */jbyteKaffeJNI_CallNonvirtualByteMethodV(JNIEnv* env UNUSED, jobject obj, jclass cls UNUSED, jmethodID meth, va_list args){  jvalue retval;  Method* m = (Method*)meth;  jobject obj_local;  BEGIN_EXCEPTION_HANDLING(0);  obj_local = unveil(obj);  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  KaffeVM_callMethodV(m, METHOD_NATIVECODE(m), obj_local, args, &retval);  END_EXCEPTION_HANDLING();  return ((jbyte) retval.i);}jbyteKaffeJNI_CallNonvirtualByteMethod(JNIEnv* env, jobject obj, jclass cls, jmethodID meth, ...){  va_list args;  jbyte r;  BEGIN_EXCEPTION_HANDLING(0);  va_start(args, meth);  r = KaffeJNI_CallNonvirtualByteMethodV(env, obj, cls, meth, args);  va_end(args);  END_EXCEPTION_HANDLING();  return (r);}jbyteKaffeJNI_CallNonvirtualByteMethodA(JNIEnv* env UNUSED, jobject obj, jclass cls UNUSED, jmethodID meth, jvalue* args){  jvalue retval;  Method* m = (Method*)meth;  jobject obj_local;  BEGIN_EXCEPTION_HANDLING(0);  obj_local = unveil(obj);  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  KaffeVM_callMethodA(m, METHOD_NATIVECODE(m), obj_local, args, &retval, 0);  END_EXCEPTION_HANDLING();  return ((jbyte) retval.i);}/* ------------------------------------------------------------------------------ * Non-virtual method calls returning char * ------------------------------------------------------------------------------ */jcharKaffeJNI_CallNonvirtualCharMethodV(JNIEnv* env UNUSED, jobject obj, jclass cls UNUSED, jmethodID meth, va_list args){  jvalue retval;  Method* m = (Method*)meth;  jobject obj_local;  BEGIN_EXCEPTION_HANDLING(0);  obj_local = unveil(obj);  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  KaffeVM_callMethodV(m, METHOD_NATIVECODE(m), obj_local, args, &retval);  END_EXCEPTION_HANDLING();  return ((jchar) retval.i);}jcharKaffeJNI_CallNonvirtualCharMethod(JNIEnv* env, jobject obj, jclass cls, jmethodID meth, ...){  va_list args;  jchar r;  BEGIN_EXCEPTION_HANDLING(0);  va_start(args, meth);  r = KaffeJNI_CallNonvirtualCharMethodV(env, obj, cls, meth, args);  va_end(args);  END_EXCEPTION_HANDLING();  return (r);}jcharKaffeJNI_CallNonvirtualCharMethodA(JNIEnv* env UNUSED, jobject obj, jclass cls UNUSED, jmethodID meth, jvalue* args){  jvalue retval;  Method* m = (Method*)meth;  jobject obj_local;  BEGIN_EXCEPTION_HANDLING(0);  obj_local = unveil(obj);  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  KaffeVM_callMethodA(m, METHOD_NATIVECODE(m), obj_local, args, &retval, 0);  END_EXCEPTION_HANDLING();  return ((jchar) retval.i);}/* ------------------------------------------------------------------------------ * Non-virtual method calls returning short * ------------------------------------------------------------------------------ */jshortKaffeJNI_CallNonvirtualShortMethodV(JNIEnv* env UNUSED, jobject obj, jclass cls UNUSED, jmethodID meth, va_list args){  jvalue retval;  Method* m = (Method*)meth;  jobject obj_local;  BEGIN_EXCEPTION_HANDLING(0);  obj_local = unveil(obj);  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  KaffeVM_callMethodV(m, METHOD_NATIVECODE(m), obj_local, args, &retval);  END_EXCEPTION_HANDLING();  return ((jshort) retval.i);}jshortKaffeJNI_CallNonvirtualShortMethod(JNIEnv* env, jobject obj, jclass cls, jmethodID meth, ...){  va_list args;  jshort r;  BEGIN_EXCEPTION_HANDLING(0);  va_start(args, meth);  r = KaffeJNI_CallNonvirtualShortMethodV(env, obj, cls, meth, args);  va_end(args);  END_EXCEPTION_HANDLING();  return (r);}jshortKaffeJNI_CallNonvirtualShortMethodA(JNIEnv* env UNUSED, jobject obj, jclass cls UNUSED, jmethodID meth, jvalue* args){  jvalue retval;  Method* m = (Method*)meth;  jobject obj_local;  BEGIN_EXCEPTION_HANDLING(0);  obj_local = unveil(obj);  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  KaffeVM_callMethodA(m, METHOD_NATIVECODE(m), obj_local, args, &retval, 0);  END_EXCEPTION_HANDLING();  return ((jshort) retval.i);}/* ------------------------------------------------------------------------------ * Non-virtual method calls returning int * ------------------------------------------------------------------------------ */jintKaffeJNI_CallNonvirtualIntMethodV(JNIEnv* env UNUSED, jobject obj, jclass cls UNUSED, jmethodID meth, va_list args){  jvalue retval;  Method* m = (Method*)meth;  jobject obj_local;  BEGIN_EXCEPTION_HANDLING(0);  obj_local = unveil(obj);  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  KaffeVM_callMethodV(m, METHOD_NATIVECODE(m), obj_local, args, &retval);  END_EXCEPTION_HANDLING();  return (retval.i);}jintKaffeJNI_CallNonvirtualIntMethod(JNIEnv* env, jobject obj, jclass cls, jmethodID meth, ...){  va_list args;  jint r;  BEGIN_EXCEPTION_HANDLING(0);  va_start(args, meth);  r = KaffeJNI_CallNonvirtualIntMethodV(env, obj, cls, meth, args);  va_end(args);  END_EXCEPTION_HANDLING();  return (r);}jintKaffeJNI_CallNonvirtualIntMethodA(JNIEnv* env UNUSED, jobject obj, jclass cls UNUSED, jmethodID meth, jvalue* args){  jvalue retval;  Method* m = (Method*)meth;  jobject obj_local;  BEGIN_EXCEPTION_HANDLING(0);  obj_local = unveil(obj);  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  KaffeVM_callMethodA(m, METHOD_NATIVECODE(m), obj_local, args, &retval, 0);  END_EXCEPTION_HANDLING();  return (retval.i);}/* ------------------------------------------------------------------------------ * Virtual method calls returning Object * ------------------------------------------------------------------------------ */jobjectKaffeJNI_CallObjectMethodV(JNIEnv* env UNUSED, jobject obj, jmethodID meth, va_list args){  jvalue retval;  jobject obj_local;  Hjava_lang_Object* o;  Method* m = (Method*)meth;  BEGIN_EXCEPTION_HANDLING(NULL);  obj_local = unveil(obj);  o = (Hjava_lang_Object*)obj_local;  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  KaffeVM_callMethodV(m, getMethodFunc (m, o), o, args, &retval);  ADD_REF(retval.l);  END_EXCEPTION_HANDLING();  return (retval.l);}jobjectKaffeJNI_CallObjectMethod(JNIEnv* env, jobject obj, jmethodID meth, ...){  va_list args;  jobject r;  BEGIN_EXCEPTION_HANDLING(NULL);  va_start(args, meth);  r = KaffeJNI_CallObjectMethodV(env, obj, meth, args);  va_end(args);  END_EXCEPTION_HANDLING();  return (r);}jobjectKaffeJNI_CallObjectMethodA(JNIEnv* env UNUSED, jobject obj, jmethodID meth, jvalue* args){  jvalue retval;  jobject obj_local;  Hjava_lang_Object* o;  Method* m = (Method*)meth;  BEGIN_EXCEPTION_HANDLING(NULL);  obj_local = unveil(obj);  o = (Hjava_lang_Object*)obj_local;  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  KaffeVM_callMethodA(m, getMethodFunc (m, o), o, args, &retval, 0);  END_EXCEPTION_HANDLING();  return (retval.l);}/* ------------------------------------------------------------------------------ * Virtual method calls returning boolean * ------------------------------------------------------------------------------ */jbooleanKaffeJNI_CallBooleanMethodV(JNIEnv* env UNUSED, jobject obj, jmethodID meth, va_list args){  jvalue retval;  jobject obj_local;  Hjava_lang_Object* o;  Method* m = (Method*)meth;  BEGIN_EXCEPTION_HANDLING(0);  obj_local = unveil(obj);  o = (Hjava_lang_Object*)obj_local;  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  KaffeVM_callMethodV(m, getMethodFunc (m, o), o, args, &retval);  END_EXCEPTION_HANDLING();  return ((jboolean) retval.i);}jbooleanKaffeJNI_CallBooleanMethod(JNIEnv* env, jobject obj, jmethodID meth, ...){  va_list args;  jboolean r;  BEGIN_EXCEPTION_HANDLING(0);  va_start(args, meth);  r = KaffeJNI_CallBooleanMethodV(env, obj, meth, args);  va_end(args);  END_EXCEPTION_HANDLING();  return (r);}jbooleanKaffeJNI_CallBooleanMethodA(JNIEnv* env UNUSED, jobject obj, jmethodID meth, jvalue* args){  jvalue retval;  jobject obj_local;  Hjava_lang_Object* o;  Method* m = (Method*)meth;  BEGIN_EXCEPTION_HANDLING(0);  obj_local = unveil(obj);  o = (Hjava_lang_Object*)obj_local;  if (METHOD_IS_STATIC(m)) {    throwException(NoSuchMethodError(m->name->data));  }  KaffeVM_callMethodA(m, getMethodFunc (m, o), o, args, &retval, 0);  END_EXCEPTION_HANDLING();  return ((jboolean) retval.i);}/* ------------------------------------------------------------------------------ * Virtual method calls returning byte * ------------------------------------------------------------------------------ */jbyteKaffeJNI_CallByteMethodV(JNIEnv* env UNUSED, jobject obj, jmethodID meth, va_list args)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -