📄 jni-arrays.c
字号:
/* * jni-arrays.c * Java Native Interface - Array handling JNI functions. * * Copyright (c) 1996, 1997 * Transvirtual Technologies, Inc. All rights reserved. * * Copyright (c) 2004, 2005 * 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"#ifdef HAVE_STRING_H#include <string.h>#endif#include "jni_i.h"#include "jni.h"#include "jni_funcs.h"#include "Arrays.h"#include "jnirefs.h"#include "exception.h"#include "object.h"jobjectKaffeJNI_GetObjectArrayElement(JNIEnv* env UNUSED, jobjectArray arr, jsize elem){ jobject obj; jobjectArray arr_local; BEGIN_EXCEPTION_HANDLING(NULL); arr_local = unveil(arr); if (elem >= (jsize)obj_length((HArrayOfObject*)arr_local)) { throwException(ArrayIndexOutOfBoundsException); } obj = unhand_array((HArrayOfObject*)arr_local)->body[elem]; ADD_REF(obj); END_EXCEPTION_HANDLING(); return (obj);}voidKaffeJNI_SetObjectArrayElement(JNIEnv* env UNUSED, jobjectArray arr, jsize elem, jobject val){ jobjectArray arr_local; jobject val_local; BEGIN_EXCEPTION_HANDLING_VOID(); arr_local = unveil(arr); val_local = unveil(val); if (elem >= (jsize)obj_length((HArrayOfObject*)arr_local)) { throwException(ArrayIndexOutOfBoundsException); } unhand_array((HArrayOfObject*)arr_local)->body[elem] = (Hjava_lang_Object*)val_local; END_EXCEPTION_HANDLING();}jobjectArrayKaffeJNI_NewObjectArray(JNIEnv* env UNUSED, jsize len, jclass cls, jobject init){ HArrayOfObject* obj; jsize i; jclass cls_local; jobject init_local; BEGIN_EXCEPTION_HANDLING(NULL); cls_local = unveil(cls); init_local = unveil(init); obj = (HArrayOfObject*)newArray((Hjava_lang_Class*)cls_local, len); /* I assume this is what init is for */ for (i = 0; i < len; i++) { unhand_array(obj)->body[i] = (Hjava_lang_Object*)init_local; } ADD_REF(obj); END_EXCEPTION_HANDLING(); return (obj);}jbooleanArrayKaffeJNI_NewBooleanArray(JNIEnv* env UNUSED, jsize len){ jbooleanArray arr; BEGIN_EXCEPTION_HANDLING(NULL); arr = newArray(booleanClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}jbyteArrayKaffeJNI_NewByteArray(JNIEnv* env UNUSED, jsize len){ jbyteArray arr; BEGIN_EXCEPTION_HANDLING(NULL); arr = newArray(byteClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}jcharArrayKaffeJNI_NewCharArray(JNIEnv* env UNUSED, jsize len){ jcharArray arr; BEGIN_EXCEPTION_HANDLING(NULL); arr = newArray(charClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}jshortArrayKaffeJNI_NewShortArray(JNIEnv* env UNUSED, jsize len){ jshortArray arr; BEGIN_EXCEPTION_HANDLING(NULL); arr = newArray(shortClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}jintArrayKaffeJNI_NewIntArray(JNIEnv* env UNUSED, jsize len){ jintArray arr; BEGIN_EXCEPTION_HANDLING(NULL); arr = newArray(intClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}jlongArrayKaffeJNI_NewLongArray(JNIEnv* env UNUSED, jsize len){ jlongArray arr; BEGIN_EXCEPTION_HANDLING(NULL); arr = newArray(longClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}jfloatArrayKaffeJNI_NewFloatArray(JNIEnv* env UNUSED, jsize len){ jfloatArray arr; BEGIN_EXCEPTION_HANDLING(NULL); arr = newArray(floatClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}jdoubleArrayKaffeJNI_NewDoubleArray(JNIEnv* env UNUSED, jsize len){ jdoubleArray arr; BEGIN_EXCEPTION_HANDLING(NULL); arr = newArray(doubleClass, len); ADD_REF(arr); END_EXCEPTION_HANDLING(); return (arr);}jboolean*KaffeJNI_GetBooleanArrayElements(JNIEnv* env UNUSED, jbooleanArray arr, jboolean* iscopy){ jboolean* array; jbooleanArray arr_local; BEGIN_EXCEPTION_HANDLING(NULL); arr_local = unveil(arr); if (iscopy != NULL) { *iscopy = JNI_FALSE; } array = unhand_array((HArrayOfBoolean*)arr_local)->body; END_EXCEPTION_HANDLING(); return (array);}jbyte*KaffeJNI_GetByteArrayElements(JNIEnv* env UNUSED, jbyteArray arr, jboolean* iscopy){ jbyte* array; jbyteArray arr_local; BEGIN_EXCEPTION_HANDLING(NULL); arr_local = unveil(arr); if (iscopy != NULL) { *iscopy = JNI_FALSE; } array = unhand_array((HArrayOfByte*)arr_local)->body; END_EXCEPTION_HANDLING(); return (array);}void*KaffeJNI_GetPrimitiveArrayCritical(JNIEnv* env, jarray arr, jboolean* iscopy){ return (KaffeJNI_GetByteArrayElements(env, (jbyteArray)arr, iscopy));}jchar*KaffeJNI_GetCharArrayElements(JNIEnv* env UNUSED, jcharArray arr, jboolean* iscopy){ jchar* array; jcharArray arr_local; BEGIN_EXCEPTION_HANDLING(NULL); arr_local = unveil(arr); if (iscopy != NULL) { *iscopy = JNI_FALSE; } array = unhand_array((HArrayOfChar*)arr_local)->body; END_EXCEPTION_HANDLING(); return (array);}jshort*KaffeJNI_GetShortArrayElements(JNIEnv* env UNUSED, jshortArray arr, jboolean* iscopy){ jshort* array; jshortArray arr_local; BEGIN_EXCEPTION_HANDLING(NULL); arr_local = unveil(arr); if (iscopy != NULL) { *iscopy = JNI_FALSE; } array = unhand_array((HArrayOfShort*)arr_local)->body; END_EXCEPTION_HANDLING(); return (array);}jint*KaffeJNI_GetIntArrayElements(JNIEnv* env UNUSED, jintArray arr, jboolean* iscopy){ jint* array; jintArray arr_local; BEGIN_EXCEPTION_HANDLING(NULL); arr_local = unveil(arr); if (iscopy != NULL) { *iscopy = JNI_FALSE; } array = unhand_array((HArrayOfInt*)arr_local)->body; END_EXCEPTION_HANDLING(); return (array);}jlong*KaffeJNI_GetLongArrayElements(JNIEnv* env UNUSED, jlongArray arr, jboolean* iscopy){ jlong* array; jlongArray arr_local; BEGIN_EXCEPTION_HANDLING(NULL); arr_local = unveil(arr); if (iscopy != NULL) { *iscopy = JNI_FALSE; } array = unhand_array((HArrayOfLong*)arr_local)->body; END_EXCEPTION_HANDLING(); return (array);}jfloat*KaffeJNI_GetFloatArrayElements(JNIEnv* env UNUSED, jfloatArray arr, jboolean* iscopy){ jfloat* array; jfloatArray arr_local; BEGIN_EXCEPTION_HANDLING(NULL); arr_local = unveil(arr); if (iscopy != NULL) { *iscopy = JNI_FALSE; } array = unhand_array((HArrayOfFloat*)arr_local)->body; END_EXCEPTION_HANDLING(); return (array);}jdouble*KaffeJNI_GetDoubleArrayElements(JNIEnv* env UNUSED, jdoubleArray arr, jboolean* iscopy){ jdouble* array; jdoubleArray arr_local; BEGIN_EXCEPTION_HANDLING(NULL); arr_local = unveil(arr); if (iscopy != NULL) { *iscopy = JNI_FALSE; } array = unhand_array((HArrayOfDouble*)arr_local)->body; END_EXCEPTION_HANDLING(); return (array);}voidKaffeJNI_ReleaseBooleanArrayElements(JNIEnv* env UNUSED, jbooleanArray arr, jboolean* elems, jint mode){ jbooleanArray arr_local; BEGIN_EXCEPTION_HANDLING_VOID(); arr_local = unveil(arr); if (elems != unhand_array((HArrayOfBoolean*)arr_local)->body) { switch (mode) { case JNI_COMMIT: memcpy(unhand_array((HArrayOfBoolean*)arr_local)->body, elems, obj_length((HArrayOfBoolean*)arr_local) * sizeof(jboolean)); break; case 0: memcpy(unhand_array((HArrayOfBoolean*)arr_local)->body, elems, obj_length((HArrayOfBoolean*)arr_local) * sizeof(jboolean)); KFREE(elems); break; case JNI_ABORT: KFREE(elems); break; default: break; } } END_EXCEPTION_HANDLING();}voidKaffeJNI_ReleaseByteArrayElements(JNIEnv* env UNUSED, jbyteArray arr, jbyte* elems, jint mode){ jbyteArray arr_local; BEGIN_EXCEPTION_HANDLING_VOID(); arr_local = unveil(arr); if (elems != unhand_array((HArrayOfByte*)arr_local)->body) { switch (mode) { case JNI_COMMIT: memcpy(unhand_array((HArrayOfByte*)arr_local)->body, elems, obj_length((HArrayOfByte*)arr_local) * sizeof(jbyte)); break; case 0: memcpy(unhand_array((HArrayOfByte*)arr_local)->body, elems, obj_length((HArrayOfByte*)arr_local) * sizeof(jbyte)); KFREE(elems); break; case JNI_ABORT: KFREE(elems); break; default: break; } } END_EXCEPTION_HANDLING();}voidKaffeJNI_ReleasePrimitiveArrayCritical(JNIEnv* env, jbyteArray arr, void* elems, jint mode){ KaffeJNI_ReleaseByteArrayElements(env, (jbyteArray)arr, (jbyte*)elems, mode);}voidKaffeJNI_ReleaseCharArrayElements(JNIEnv* env UNUSED, jcharArray arr, jchar* elems, jint mode){ jcharArray arr_local; BEGIN_EXCEPTION_HANDLING_VOID(); arr_local = unveil(arr); if (elems != unhand_array((HArrayOfChar*)arr_local)->body) { switch (mode) { case JNI_COMMIT: memcpy(unhand_array((HArrayOfChar*)arr_local)->body, elems, obj_length((HArrayOfChar*)arr_local) * sizeof(jchar)); break; case 0: memcpy(unhand_array((HArrayOfChar*)arr_local)->body, elems, obj_length((HArrayOfChar*)arr_local) * sizeof(jchar)); KFREE(elems); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -