📄 jni.c
字号:
SET_STATIC_FIELD(jobject, fld, val); END_EXCEPTION_HANDLING();}static voidKaffe_SetStaticBooleanField(JNIEnv* env, jclass cls, jfieldID fld, jbool val){ BEGIN_EXCEPTION_HANDLING_VOID(); SET_STATIC_FIELD(jboolean, fld, val); END_EXCEPTION_HANDLING();}static voidKaffe_SetStaticByteField(JNIEnv* env, jclass cls, jfieldID fld, jbyte val){ BEGIN_EXCEPTION_HANDLING_VOID(); SET_STATIC_FIELD(jbyte, fld, val); END_EXCEPTION_HANDLING();}static voidKaffe_SetStaticCharField(JNIEnv* env, jclass cls, jfieldID fld, jchar val){ BEGIN_EXCEPTION_HANDLING_VOID(); SET_STATIC_FIELD(jchar, fld, val); END_EXCEPTION_HANDLING();}static voidKaffe_SetStaticShortField(JNIEnv* env, jclass cls, jfieldID fld, jshort val){ BEGIN_EXCEPTION_HANDLING_VOID(); SET_STATIC_FIELD(jshort, fld, val); END_EXCEPTION_HANDLING();}static voidKaffe_SetStaticIntField(JNIEnv* env, jclass cls, jfieldID fld, jint val){ BEGIN_EXCEPTION_HANDLING_VOID(); SET_STATIC_FIELD(jint, fld, val); END_EXCEPTION_HANDLING();}static voidKaffe_SetStaticLongField(JNIEnv* env, jclass cls, jfieldID fld, jlong val){ BEGIN_EXCEPTION_HANDLING_VOID(); SET_STATIC_FIELD(jlong, fld, val); END_EXCEPTION_HANDLING();}static voidKaffe_SetStaticFloatField(JNIEnv* env, jclass cls, jfieldID fld, jfloat val){ BEGIN_EXCEPTION_HANDLING_VOID(); SET_STATIC_FIELD(jfloat, fld, val); END_EXCEPTION_HANDLING();}static voidKaffe_SetStaticDoubleField(JNIEnv* env, jclass cls, jfieldID fld, jdouble val){ BEGIN_EXCEPTION_HANDLING_VOID(); SET_STATIC_FIELD(jdouble, fld, val); END_EXCEPTION_HANDLING();}static jstringKaffe_NewString(JNIEnv* env, const jchar* data, jsize len){ Hjava_lang_String* str; BEGIN_EXCEPTION_HANDLING(0); str = (Hjava_lang_String*)newObject(StringClass); unhand(str)->offset = 0; unhand(str)->count = len; unhand(str)->value = (HArrayOfChar*)newArray(TYPE_CLASS(TYPE_Char), len); unhand(str)->interned = 0; memcpy(STRING_DATA(str), data, len * sizeof(jchar)); END_EXCEPTION_HANDLING(); return (str);}static jsizeKaffe_GetStringLength(JNIEnv* env, jstring data){ jsize ret; BEGIN_EXCEPTION_HANDLING(0); ret = STRING_SIZE((Hjava_lang_String*)data); END_EXCEPTION_HANDLING(); return (ret);}static const jchar*Kaffe_GetStringChars(JNIEnv* env, jstring data, jboolean* copy){ jchar* ret; BEGIN_EXCEPTION_HANDLING(0); if (copy != NULL) { *copy = JNI_FALSE; } ret = STRING_DATA(((Hjava_lang_String*)data)); END_EXCEPTION_HANDLING(); return (ret);}static jstringKaffe_NewStringUTF(JNIEnv* env, const char* data){ Hjava_lang_String* str; Utf8Const* utf8; int len; BEGIN_EXCEPTION_HANDLING(0); len = strlen(data); if (!utf8ConstIsValidUtf8(data, len)) { str = NULL; } else { utf8 = checkPtr(utf8ConstNew(data, len)); str = utf8Const2Java(utf8); utf8ConstRelease(utf8); if (!str) { errorInfo info; postOutOfMemory(&info); throwError(&info); } } END_EXCEPTION_HANDLING(); return (str);}static jsizeKaffe_GetStringUTFLength(JNIEnv* env, jstring data){ Hjava_lang_String* const str = (Hjava_lang_String*)data; jchar* ptr; jsize len; jsize count; jsize i; BEGIN_EXCEPTION_HANDLING(0); ptr = STRING_DATA(str); len = STRING_SIZE(str); count = 0; for (i = 0; i < len; i++) { if (ptr[i] >= 0x0001 && ptr[i] <= 0x007F) { count += 1; } else if (ptr[i] >= 0x0080 && ptr[i] <= 0x07FF) { count += 2; } else { count += 3; } } END_EXCEPTION_HANDLING(); return (count);}static const jbyte*Kaffe_GetStringUTFChars(JNIEnv* env, jstring data, jbool* copy){ Hjava_lang_String* const str = (Hjava_lang_String*)data; jchar* ptr; jbyte* buf; jsize len; jsize i; jsize j; BEGIN_EXCEPTION_HANDLING(0); /* We always copy data */ if (copy != NULL) { *copy = JNI_TRUE; } buf = checkPtr(KMALLOC(Kaffe_GetStringUTFLength(env, data) + 1)); ptr = STRING_DATA(str); len = STRING_SIZE(str); for (j = 0, i = 0; i < len; i++) { if (ptr[i] >= 0x0001 && ptr[i] <= 0x007F) { buf[j++] = ptr[i] & 0x7F; } else if (ptr[i] >= 0x0080 && ptr[i] <= 0x07FF) { buf[j++] = 0xC0 | ((ptr[i] >> 6) & 0x1F); buf[j++] = 0x80 | (ptr[i] & 0x3F); } else { buf[j++] = 0xE0 | ((ptr[i] >> 12) & 0x0F); buf[j++] = 0x80 | ((ptr[i] >> 6) & 0x3F); buf[j++] = 0x80 | (ptr[i] & 0x3F); } } END_EXCEPTION_HANDLING(); return (buf);}static voidKaffe_ReleaseStringUTFChars(JNIEnv* env, jstring data, const jbyte* chars){ BEGIN_EXCEPTION_HANDLING_VOID(); KFREE(chars); END_EXCEPTION_HANDLING();}static jsizeKaffe_GetArrayLength(JNIEnv* env, jarray arr){ jsize ret; BEGIN_EXCEPTION_HANDLING(0); ret = obj_length((HArrayOfObject*)arr); END_EXCEPTION_HANDLING(); return (ret);}static jobjectArrayKaffe_NewObjectArray(JNIEnv* env, jsize len, jclass cls, jobject init){ HArrayOfObject* obj; int i; BEGIN_EXCEPTION_HANDLING(0); obj = (HArrayOfObject*)newArray((Hjava_lang_Class*)cls, len); /* I assume this is what init is for */ for (i = 0; i < len; i++) { unhand_array(obj)->body[i] = (Hjava_lang_Object*)init; } ADD_REF(obj); END_EXCEPTION_HANDLING(); return (obj);}static jobjectKaffe_GetObjectArrayElement(JNIEnv* env, jobjectArray arr, jsize elem){ jobject obj; BEGIN_EXCEPTION_HANDLING(0); if (elem >= obj_length((HArrayOfObject*)arr)) { throwException(ArrayIndexOutOfBoundsException); } obj = unhand_array((HArrayOfObject*)arr)->body[elem]; ADD_REF(obj); END_EXCEPTION_HANDLING(); return (obj);}static voidKaffe_SetObjectArrayElement(JNIEnv* env, jobjectArray arr, jsize elem, jobject val){ BEGIN_EXCEPTION_HANDLING_VOID(); if (elem >= obj_length((HArrayOfObject*)arr)) { throwException(ArrayIndexOutOfBoundsException); } unhand_array((HArrayOfObject*)arr)->body[elem] = (Hjava_lang_Object*)val; END_EXCEPTION_HANDLING();}static jbooleanArrayKaffe_NewBooleanArray(JNIEnv* env, jsize len){ jbooleanArray arr; BEGIN_EXCEPTION_HANDLING(0); arr = newArray(booleanClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}static jbyteArrayKaffe_NewByteArray(JNIEnv* env, jsize len){ jbyteArray arr; BEGIN_EXCEPTION_HANDLING(0); arr = newArray(byteClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}static jcharArrayKaffe_NewCharArray(JNIEnv* env, jsize len){ jcharArray arr; BEGIN_EXCEPTION_HANDLING(0); arr = newArray(charClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}static jshortArrayKaffe_NewShortArray(JNIEnv* env, jsize len){ jshortArray arr; BEGIN_EXCEPTION_HANDLING(0); arr = newArray(shortClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}static jintArrayKaffe_NewIntArray(JNIEnv* env, jsize len){ jintArray arr; BEGIN_EXCEPTION_HANDLING(0); arr = newArray(intClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}static jlongArrayKaffe_NewLongArray(JNIEnv* env, jsize len){ jlongArray arr; BEGIN_EXCEPTION_HANDLING(0); arr = newArray(longClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}static jfloatArrayKaffe_NewFloatArray(JNIEnv* env, jsize len){ jfloatArray arr; BEGIN_EXCEPTION_HANDLING(0); arr = newArray(floatClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}static jdoubleArrayKaffe_NewDoubleArray(JNIEnv* env, jsize len){ jdoubleArray arr; BEGIN_EXCEPTION_HANDLING(0); arr = newArray(doubleClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}static jboolean*Kaffe_GetBooleanArrayElements(JNIEnv* env, jbooleanArray arr, jbool* iscopy){ jboolean* ret; BEGIN_EXCEPTION_HANDLING(0); if (iscopy != NULL) { *iscopy = JNI_FALSE; } ret = unhand_array((HArrayOfBoolean*)arr)->body; END_EXCEPTION_HANDLING(); return (ret);}static jbyte*Kaffe_GetByteArrayElements(JNIEnv* env, jbyteArray arr, jbool* iscopy){ jbyte* ret; BEGIN_EXCEPTION_HANDLING(0); if (iscopy != NULL) { *iscopy = JNI_FALSE; } ret = unhand_array((HArrayOfByte*)arr)->body; END_EXCEPTION_HANDLING(); return (ret);}static void*Kaffe_GetPrimitiveArrayCritical(JNIEnv* env, jarray arr, jbool* iscopy){ return (Kaffe_GetByteArrayElements(env, (jbyteArray)arr, iscopy));}static jchar*Kaffe_GetCharArrayElements(JNIEnv* env, jcharArray arr, jbool* iscopy){ jchar* ret; BEGIN_EXCEPTION_HANDLING(0); if (iscopy != NULL) { *iscopy = JNI_FALSE; } ret = unhand_array((HArrayOfChar*)arr)->body; END_EXCEPTION_HANDLING(); return (ret);}static jshort*Kaffe_GetShortArrayElements(JNIEnv* env, jshortArray arr, jbool* iscopy){ jshort* ret; BEGIN_EXCEPTION_HANDLING(0); if (iscopy != NULL) { *iscopy = JNI_FALSE; } ret = unhand_array((HArrayOfShort*)arr)->body; END_EXCEPTION_HANDLING(); return (ret);}static jint*Kaffe_GetIntArrayElements(JNIEnv* env, jintArray arr, jbool* iscopy){ jint* ret; BEGIN_EXCEPTION_HANDLING(0); if (iscopy != NULL) { *iscopy = JNI_FALSE; } ret = unhand_array((HArrayOfInt*)arr)->body; END_EXCEPTION_HANDLING(); return (ret);}static jlong*Kaffe_GetLongArrayElements(JNIEnv* env, jlongArray arr, jbool* iscopy){ jlong* ret; BEGIN_EXCEPTION_HANDLING(0); if (iscopy != NULL) { *iscopy = JNI_FALSE; } ret = unhand_array((HArrayOfLong*)arr)->body; END_EXCEPTION_HANDLING(); return (ret);}static jfloat*Kaffe_GetFloatArrayElements(JNIEnv* env, jfloatArray arr, jbool* iscopy){ jfloat* ret; BEGIN_EXCEPTION_HANDLING(0); if (iscopy != NULL) { *iscopy = JNI_FALSE; } ret = unhand_array((HArrayOfFloat*)arr)->body; END_EXCEPTION_HANDLING(); return (ret);}static jdouble*Kaffe_GetDoubleArrayElements(JNIEnv* env, jdoubleArray arr, jbool* iscopy){ jdouble* ret; BEGIN_EXCEPTION_HANDLING(0); if (iscopy != NULL) { *iscopy = JNI_FALSE; } ret = unhand_array((HArrayOfDouble*)arr)->body; END_EXCEPTION_HANDLING(); return (ret);}static voidKaffe_ReleaseBooleanArrayElements(JNIEnv* env, jbooleanArray arr, jbool* elems, jint mode){ BEGIN_EXCEPTION_HANDLING_VOID(); if (elems != unhand_array((HArrayOfBoolean*)arr)->body) { switch (mode) { case JNI_COMMIT: memcpy(unhand_array((HArrayOfBoolean*)arr)->body, elems, obj_length((HArrayOfBoolean*)arr) * sizeof(jboolean)); break; case 0: memcpy(unhand_array((HArrayOfBoolean*)arr)->body, elems, obj_length((HArrayOfBoolean*)arr) * sizeof(jboolean)); KFREE(elems); break; case JNI_ABORT: KFREE(elems); break; } } END_EXCEPTION_HANDLING();}static voidKaffe_ReleaseByteArrayElements(JNIEnv* env, jbyteArray arr, jbyte* elems, jint mode){ BEGIN_EXCEPTION_HANDLING_VOID(); if (elems != unhand_array((HArrayOfByte*)arr)->body) { switch (mode) { case JNI_COMMIT: memcpy(unhand_array((HArrayOfByte*)arr)->body, elems, obj_length((HArrayOfByte*)arr) * sizeof(jbyte)); break; case 0: memcpy(unhand_array((HArrayOfByte*)arr)->body, elems, obj_length((HArrayOfByte*)arr) * sizeof(jbyte)); KFREE(elems); break; case JNI_ABORT: KFREE(elems); break; } } END_EXCEPTION_HANDLING();}static voidKaffe_ReleasePrimitiveArrayCritical(JNIEnv* env, jbyteArray arr, void* elems, jint mode){ Kaffe_ReleaseByteArrayElements(env, (jbyteArray)arr, (jbyte*)elems, mode);}static voidKaffe_ReleaseCharArrayElements(JNIEnv* env, jcharArray arr, jchar* elems, jint mode){ BEGIN_EXCEPTION_HANDLING_VOID(); if (elems != unhand_array((HArrayOfChar*)arr)->body) { switch (mode) { case JNI_COMMIT: memcpy(unhand_array((HArrayOfChar*)arr)->body, elems, obj_length((HArrayOfChar*)arr) * sizeof(jchar)); break; case 0: memcpy(unhand_array((HArrayOfChar*)arr)->body, elems, obj_length((HArrayOfChar*)arr) * sizeof(jchar)); KFREE(elems); break; case JNI_ABORT: KFREE(elems); break; } } END_EXCEPTION_HANDLING();}static voidKaffe_ReleaseShortArrayElements(JNIEnv* env, jshortArray arr, jshort* elems, jint mode){ BEGIN_EXCEPTION_HANDLING_VOID(); if (elems != unhand_array((HArrayOfShort*)arr)->body) { switch (mode) { case JNI_COMMIT: memcpy(unhand_array((HArrayOfShort*)arr)->body, elems, obj_length((HArrayOfShort*)arr) * sizeof(jshort)); break; case 0: memcpy(unhand_array((HArrayOfShort*)arr)->body, elems, obj_length((HArrayOfShort*)arr) * sizeof(jshort)); KFREE(elems); break; case JNI_ABORT: KFREE(elems); break; } } END_EXCEPTION_HANDLING();}static voidKaffe_ReleaseIntArrayElements(JNIEnv* env, jintArray arr, jint* elems, jint mode){ BEGIN_EXCEPTION_HANDLING_VOID(); if (elems != unhand_array((HArrayOfInt*)arr)->body) { switc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -