📄 jni.c
字号:
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, ¤tVM); 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 + -