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

📄 jni.c

📁 java virtual machince kaffe
💻 C
📖 第 1 页 / 共 2 页
字号:
static jmethodIDKaffe_GetMethodID(JNIEnv* env, jclass cls, const char* name, const char* sig){	Method* meth;	errorInfo info;	jclass cls_local;	BEGIN_EXCEPTION_HANDLING(NULL);	cls_local = unveil(cls);	meth = lookupClassMethod((Hjava_lang_Class*)cls_local, name, sig,				 false, &info);	if (meth == NULL) {		postError(env, &info);	}	else if (METHOD_IS_STATIC(meth)) {		postExceptionMessage(&info, JAVA_LANG(NoSuchMethodError),				     "%s", name);		postError(env, &info);		meth = NULL;	}	END_EXCEPTION_HANDLING();	return ((jmethodID)meth);}static jfieldIDKaffe_GetFieldID(JNIEnv* env, jclass cls, const char* name, const char* sig UNUSED){	Field* fld;	errorInfo info;	Utf8Const* utf8;	jclass cls_local;	BEGIN_EXCEPTION_HANDLING(NULL);	cls_local = unveil(cls);	utf8 = checkPtr(utf8ConstFromString(name));	fld = lookupClassField((Hjava_lang_Class*)cls_local, utf8, false,			       &info);	utf8ConstRelease(utf8);	if (fld == NULL) {		postError(env, &info);	}	END_EXCEPTION_HANDLING();	return ((jfieldID)fld);}static jmethodIDKaffe_GetStaticMethodID(JNIEnv* env, jclass cls, const char* name, const char* sig){	Method* meth;	errorInfo info;	jclass cls_local;	BEGIN_EXCEPTION_HANDLING(NULL);	cls_local = unveil(cls);	meth = lookupClassMethod((Hjava_lang_Class*)cls_local, name, sig,				 false, &info);	if (meth == NULL) {		postError(env, &info);	} else if (!METHOD_IS_STATIC(meth)) {		postExceptionMessage(&info, JAVA_LANG(NoSuchMethodError), "%s", name);		postError(env, &info);		meth = NULL;	}	END_EXCEPTION_HANDLING();	return ((jmethodID)meth);}static jfieldIDKaffe_GetStaticFieldID(JNIEnv* env, jclass cls, const char* name, const char* sig UNUSED){	Field* fld;	errorInfo info;	Utf8Const* utf8;	jclass cls_local;	BEGIN_EXCEPTION_HANDLING(NULL);	cls_local = unveil(cls);	utf8 = checkPtr(utf8ConstFromString(name));	fld = lookupClassField((Hjava_lang_Class*)cls_local, utf8, true, &info);	utf8ConstRelease(utf8);	if (fld == NULL) {		postError(env, &info);	}	END_EXCEPTION_HANDLING();	return ((jfieldID)fld);}static jsizeKaffe_GetArrayLength(JNIEnv* env UNUSED, jarray arr){	jsize len;	jarray arr_local;	BEGIN_EXCEPTION_HANDLING(0);	arr_local = unveil(arr);	len = obj_length((HArrayOfObject*)arr_local);	END_EXCEPTION_HANDLING();	return (len);}static jintKaffe_RegisterNatives(JNIEnv* env UNUSED, jclass cls, const JNINativeMethod* methodArray, jint nmethods){	Method* meth;	int nmeth;	int i, j;	jclass cls_local;	BEGIN_EXCEPTION_HANDLING(0);	cls_local = unveil(cls);	meth = Kaffe_get_class_methods((Hjava_lang_Class*)cls_local);	nmeth = CLASS_NMETHODS((Hjava_lang_Class*)cls_local);	for (j = 0; j < nmethods; j++) {		for (i = 0; i < nmeth; i++) {			if (strcmp(meth[i].name->data, methodArray[j].name) == 0 &&			    strcmp(METHOD_SIGD(&meth[i]), methodArray[j].signature) == 0 &&			    methodIsNative(&meth[i])) {				meth[i].kFlags |= KFLAG_JNI;				engine_create_wrapper(&meth[i], methodArray[j].fnPtr); 				goto found;			}		}		/* Failed to find method */		throwException(NoSuchMethodError(methodArray[j].name));		found:;	}	END_EXCEPTION_HANDLING();	return (0);}static jintKaffe_UnregisterNatives(JNIEnv* env UNUSED, jclass cls UNUSED){	/* We do not support unloading */	return (-1);}static jintKaffe_MonitorEnter(JNIEnv* env UNUSED, jobject obj){	jobject obj_local;	BEGIN_EXCEPTION_HANDLING(0);	/* We should never throw out of a JNI call */	obj_local = unveil(obj);	lockObject(obj_local);	END_EXCEPTION_HANDLING();	return (0);}static jintKaffe_MonitorExit(JNIEnv* env UNUSED, jobject obj){	jobject obj_local;	BEGIN_EXCEPTION_HANDLING(0);	obj_local = unveil(obj);	unlockObject(obj_local);	END_EXCEPTION_HANDLING();	return (0);}/* * Functions past this point don't bother with jni exceptions. */JavaVM*Kaffe_GetKaffeVM(void){  return &Kaffe_JavaVM;}static jintKaffe_GetJavaVM(JNIEnv* env UNUSED, JavaVM** vm){	(*vm) = &Kaffe_JavaVM;	return (0);}static jintKaffe_AttachCurrentThread(JavaVM* vm UNUSED, void** penv, void* args UNUSED){	if (KTHREAD(attach_current_thread) (false)) {		KSEM(init)(&THREAD_DATA()->sem);		KaffeVM_attachFakedThreadInstance ("thread attach", false);		*penv = THREAD_JNIENV();				return 0;	}	return -1;}static jintKaffe_AttachCurrentThreadAsDaemon(JavaVM* vm UNUSED, void** penv, void* args UNUSED){	if (KTHREAD(attach_current_thread) (true)) {		KSEM(init)(&THREAD_DATA()->sem);		KaffeVM_attachFakedThreadInstance ("daemon attach", true);		*penv = THREAD_JNIENV();	        return 0;	}	return -1;}static jintKaffe_DetachCurrentThread(JavaVM* vm UNUSED){	if (KTHREAD(detach_current_thread) ()) {		return 0;	} else {		return -1;	}}static jintKaffe_GetEnv(JavaVM* vm, void** penv, jint interface_id){	JavaVM* currentVM;	JNIEnv *je;	/* In the event of any error condition, we side effect the argument	   pointer as well as return an error code */	(*penv) = NULL;	je = THREAD_JNIENV();	/* Insure that the current thread is associated with the	   given VM. This gets the JavaVM to which the current thread	   is attached.  I *think* this is a good way to do this. */	Kaffe_GetJavaVM(je, &currentVM);	if (!KaffeJNI_IsSameObject(je, currentVM, vm))		return (JNI_EDETACHED);	/* Is the requested version of the interface known? */	switch (interface_id) {	case JNI_VERSION_1_1:		(*penv) = je;		return (JNI_OK);	case JNI_VERSION_1_2:		(*penv) = je;		return (JNI_OK);	case JNI_VERSION_1_4:		(*penv) = je;		return (JNI_OK);#if defined(ENABLE_JVMPI)	case JVMPI_VERSION_1:	case JVMPI_VERSION_1_1:	case JVMPI_VERSION_1_2:		(*penv) = jvmpiCreateInterface(interface_id);		return (JNI_OK);#endif			default:		return (JNI_EVERSION);	}}/* * Setup the Kaffe JNI interfaces. */struct JNINativeInterface Kaffe_JNINativeInterface = {	NULL,	NULL,	NULL,	NULL,	Kaffe_GetVersion,	Kaffe_DefineClass,	Kaffe_FindClass,	KaffeJNI_FromReflectedMethod,	KaffeJNI_FromReflectedField,	KaffeJNI_ToReflectedMethod,	Kaffe_GetSuperClass,	Kaffe_IsAssignableFrom,	KaffeJNI_ToReflectedField,	Kaffe_Throw,	Kaffe_ThrowNew,	Kaffe_ExceptionOccurred,	Kaffe_ExceptionDescribe,	Kaffe_ExceptionClear,	KaffeJNI_FatalError,	KaffeJNI_PushLocalFrame,	KaffeJNI_PopLocalFrame,	KaffeJNI_NewGlobalRef,	KaffeJNI_DeleteGlobalRef,	KaffeJNI_DeleteLocalRef,	KaffeJNI_IsSameObject,	KaffeJNI_NewLocalRef,	KaffeJNI_EnsureLocalCapacity,	Kaffe_AllocObject,	Kaffe_NewObject,	Kaffe_NewObjectV,	Kaffe_NewObjectA,	Kaffe_GetObjectClass,	Kaffe_IsInstanceOf,	Kaffe_GetMethodID,	KaffeJNI_CallObjectMethod,	KaffeJNI_CallObjectMethodV,	KaffeJNI_CallObjectMethodA,	KaffeJNI_CallBooleanMethod,	KaffeJNI_CallBooleanMethodV,	KaffeJNI_CallBooleanMethodA,	KaffeJNI_CallByteMethod,	KaffeJNI_CallByteMethodV,	KaffeJNI_CallByteMethodA,	KaffeJNI_CallCharMethod,	KaffeJNI_CallCharMethodV,	KaffeJNI_CallCharMethodA,	KaffeJNI_CallShortMethod,	KaffeJNI_CallShortMethodV,	KaffeJNI_CallShortMethodA,	KaffeJNI_CallIntMethod,	KaffeJNI_CallIntMethodV,	KaffeJNI_CallIntMethodA,	KaffeJNI_CallLongMethod,	KaffeJNI_CallLongMethodV,	KaffeJNI_CallLongMethodA,	KaffeJNI_CallFloatMethod,	KaffeJNI_CallFloatMethodV,	KaffeJNI_CallFloatMethodA,	KaffeJNI_CallDoubleMethod,	KaffeJNI_CallDoubleMethodV,	KaffeJNI_CallDoubleMethodA,	KaffeJNI_CallVoidMethod,	KaffeJNI_CallVoidMethodV,	KaffeJNI_CallVoidMethodA,	KaffeJNI_CallNonvirtualObjectMethod,	KaffeJNI_CallNonvirtualObjectMethodV,	KaffeJNI_CallNonvirtualObjectMethodA,	KaffeJNI_CallNonvirtualBooleanMethod,	KaffeJNI_CallNonvirtualBooleanMethodV,	KaffeJNI_CallNonvirtualBooleanMethodA,	KaffeJNI_CallNonvirtualByteMethod,	KaffeJNI_CallNonvirtualByteMethodV,	KaffeJNI_CallNonvirtualByteMethodA,	KaffeJNI_CallNonvirtualCharMethod,	KaffeJNI_CallNonvirtualCharMethodV,	KaffeJNI_CallNonvirtualCharMethodA,	KaffeJNI_CallNonvirtualShortMethod,	KaffeJNI_CallNonvirtualShortMethodV,	KaffeJNI_CallNonvirtualShortMethodA,	KaffeJNI_CallNonvirtualIntMethod,	KaffeJNI_CallNonvirtualIntMethodV,	KaffeJNI_CallNonvirtualIntMethodA,	KaffeJNI_CallNonvirtualLongMethod,	KaffeJNI_CallNonvirtualLongMethodV,	KaffeJNI_CallNonvirtualLongMethodA,	KaffeJNI_CallNonvirtualFloatMethod,	KaffeJNI_CallNonvirtualFloatMethodV,	KaffeJNI_CallNonvirtualFloatMethodA,	KaffeJNI_CallNonvirtualDoubleMethod,	KaffeJNI_CallNonvirtualDoubleMethodV,	KaffeJNI_CallNonvirtualDoubleMethodA,	KaffeJNI_CallNonvirtualVoidMethod,	KaffeJNI_CallNonvirtualVoidMethodV,	KaffeJNI_CallNonvirtualVoidMethodA,	Kaffe_GetFieldID,	KaffeJNI_GetObjectField,	KaffeJNI_GetBooleanField,	KaffeJNI_GetByteField,	KaffeJNI_GetCharField,	KaffeJNI_GetShortField,	KaffeJNI_GetIntField,	KaffeJNI_GetLongField,	KaffeJNI_GetFloatField,	KaffeJNI_GetDoubleField,	KaffeJNI_SetObjectField,	KaffeJNI_SetBooleanField,	KaffeJNI_SetByteField,	KaffeJNI_SetCharField,	KaffeJNI_SetShortField,	KaffeJNI_SetIntField,	KaffeJNI_SetLongField,	KaffeJNI_SetFloatField,	KaffeJNI_SetDoubleField,	Kaffe_GetStaticMethodID,	KaffeJNI_CallStaticObjectMethod,	KaffeJNI_CallStaticObjectMethodV,	KaffeJNI_CallStaticObjectMethodA,	KaffeJNI_CallStaticBooleanMethod,	KaffeJNI_CallStaticBooleanMethodV,	KaffeJNI_CallStaticBooleanMethodA,	KaffeJNI_CallStaticByteMethod,	KaffeJNI_CallStaticByteMethodV,	KaffeJNI_CallStaticByteMethodA,	KaffeJNI_CallStaticCharMethod,	KaffeJNI_CallStaticCharMethodV,	KaffeJNI_CallStaticCharMethodA,	KaffeJNI_CallStaticShortMethod,	KaffeJNI_CallStaticShortMethodV,	KaffeJNI_CallStaticShortMethodA,	KaffeJNI_CallStaticIntMethod,	KaffeJNI_CallStaticIntMethodV,	KaffeJNI_CallStaticIntMethodA,	KaffeJNI_CallStaticLongMethod,	KaffeJNI_CallStaticLongMethodV,	KaffeJNI_CallStaticLongMethodA,	KaffeJNI_CallStaticFloatMethod,	KaffeJNI_CallStaticFloatMethodV,	KaffeJNI_CallStaticFloatMethodA,	KaffeJNI_CallStaticDoubleMethod,	KaffeJNI_CallStaticDoubleMethodV,	KaffeJNI_CallStaticDoubleMethodA,	KaffeJNI_CallStaticVoidMethod,	KaffeJNI_CallStaticVoidMethodV,	KaffeJNI_CallStaticVoidMethodA,	Kaffe_GetStaticFieldID,	KaffeJNI_GetStaticObjectField,	KaffeJNI_GetStaticBooleanField,	KaffeJNI_GetStaticByteField,	KaffeJNI_GetStaticCharField,	KaffeJNI_GetStaticShortField,	KaffeJNI_GetStaticIntField,	KaffeJNI_GetStaticLongField,	KaffeJNI_GetStaticFloatField,	KaffeJNI_GetStaticDoubleField,	KaffeJNI_SetStaticObjectField,	KaffeJNI_SetStaticBooleanField,	KaffeJNI_SetStaticByteField,	KaffeJNI_SetStaticCharField,	KaffeJNI_SetStaticShortField,	KaffeJNI_SetStaticIntField,	KaffeJNI_SetStaticLongField,	KaffeJNI_SetStaticFloatField,	KaffeJNI_SetStaticDoubleField,	KaffeJNI_NewString,	KaffeJNI_GetStringLength,	KaffeJNI_GetStringChars,	KaffeJNI_ReleaseStringChars,	KaffeJNI_NewStringUTF,	KaffeJNI_GetStringUTFLength,	KaffeJNI_GetStringUTFChars,	KaffeJNI_ReleaseStringUTFChars,	Kaffe_GetArrayLength,	KaffeJNI_NewObjectArray,	KaffeJNI_GetObjectArrayElement,	KaffeJNI_SetObjectArrayElement,	KaffeJNI_NewBooleanArray,	KaffeJNI_NewByteArray,	KaffeJNI_NewCharArray,	KaffeJNI_NewShortArray,	KaffeJNI_NewIntArray,	KaffeJNI_NewLongArray,	KaffeJNI_NewFloatArray,	KaffeJNI_NewDoubleArray,	KaffeJNI_GetBooleanArrayElements,	KaffeJNI_GetByteArrayElements,	KaffeJNI_GetCharArrayElements,	KaffeJNI_GetShortArrayElements,	KaffeJNI_GetIntArrayElements,	KaffeJNI_GetLongArrayElements,	KaffeJNI_GetFloatArrayElements,	KaffeJNI_GetDoubleArrayElements,	KaffeJNI_ReleaseBooleanArrayElements,	KaffeJNI_ReleaseByteArrayElements,	KaffeJNI_ReleaseCharArrayElements,	KaffeJNI_ReleaseShortArrayElements,	KaffeJNI_ReleaseIntArrayElements,	KaffeJNI_ReleaseLongArrayElements,	KaffeJNI_ReleaseFloatArrayElements,	KaffeJNI_ReleaseDoubleArrayElements,	KaffeJNI_GetBooleanArrayRegion,	KaffeJNI_GetByteArrayRegion,	KaffeJNI_GetCharArrayRegion,	KaffeJNI_GetShortArrayRegion,	KaffeJNI_GetIntArrayRegion,	KaffeJNI_GetLongArrayRegion,	KaffeJNI_GetFloatArrayRegion,	KaffeJNI_GetDoubleArrayRegion,	KaffeJNI_SetBooleanArrayRegion,	KaffeJNI_SetByteArrayRegion,	KaffeJNI_SetCharArrayRegion,	KaffeJNI_SetShortArrayRegion,	KaffeJNI_SetIntArrayRegion,	KaffeJNI_SetLongArrayRegion,	KaffeJNI_SetFloatArrayRegion,	KaffeJNI_SetDoubleArrayRegion,	Kaffe_RegisterNatives,	Kaffe_UnregisterNatives,	Kaffe_MonitorEnter,	Kaffe_MonitorExit,	Kaffe_GetJavaVM,	KaffeJNI_GetStringRegion,	KaffeJNI_GetStringUTFRegion,	KaffeJNI_GetPrimitiveArrayCritical,	KaffeJNI_ReleasePrimitiveArrayCritical,	KaffeJNI_GetStringChars,	KaffeJNI_ReleaseStringChars,	KaffeJNI_NewWeakGlobalRef, //	KaffeJNI_DeleteWeakGlobalRef, //	Kaffe_ExceptionCheck,	KaffeJNI_NewDirectByteBuffer,	KaffeJNI_GetDirectBufferAddress,	KaffeJNI_GetDirectBufferCapacity};/* * Setup the Kaffe invoke interface. */const struct JNIInvokeInterface Kaffe_JNIInvokeInterface = {	NULL,	NULL,	NULL,	KaffeJNI_DestroyJavaVM,	Kaffe_AttachCurrentThread,	Kaffe_DetachCurrentThread,	Kaffe_GetEnv,	Kaffe_AttachCurrentThreadAsDaemon};/* * Setup the Kaffe VM. */static JavaVM Kaffe_JavaVM = {	&Kaffe_JNIInvokeInterface,};KaffeVM_Arguments Kaffe_JavaVMInitArgs = {	0,		/* Version */	NULL,		/* Properties */	0,		/* Check source */	THREADSTACKSIZE,/* Native stack size */	0,		/* Java stack size */	MIN_HEAPSIZE,	/* Min heap size */	MAX_HEAPSIZE,	/* Max heap size */	/*	2,	*/	/* Verify mode ... verify remote by default */	0,		/* Verify mode ... noverify by default */	".",		/* Classpath */	NULL,		/* Bootclasspath */	(void*)&vfprintf,/* Vprintf */	&exit,	/* Exit */	&abort,	/* Abort */	1,		/* Enable class GC */	0,		/* Enable verbose GC */	1,		/* Disable async GC */	0,		/* Enable verbose class loading */	0,		/* Enable verbose JIT */	0,		/* Enable verbose calls */	ALLOC_HEAPSIZE,	/* Inc heap size */	NULL,		/* Class home */	NULL,		/* Library home */	NULL,           /* No profiler */	NULL            /* No arguments to profiler */};/* * Array of VMs. */KaffeVM_Arguments Kaffe_JavaVMArgs;

⌨️ 快捷键说明

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