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

📄 jni-arrays.c

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 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 + -