jvm.c
来自「This is a resource based on j2me embedde」· C语言 代码 · 共 2,294 行 · 第 1/5 页
C
2,294 行
return NULL; } return obj;#else /* CVM_REFLECT */ CVMthrowUnsupportedOperationException(CVMjniEnv2ExecEnv(env), NULL); return NULL;#endif /* CVM_REFLECT */}JNIEXPORT jobjectArray JNICALLJVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which){#ifdef CVM_REFLECT CVMExecEnv* ee = CVMjniEnv2ExecEnv(env); jobject obj = CVMjniCreateLocalRef(ee); if (obj == NULL) /* exception thrown */ return NULL; CVMreflectConstructors(ee, CVMgcSafeClassRef2ClassBlock(ee, cls), which, (CVMArrayOfRefICell*) obj); if (CVMexceptionOccurred(ee)) { CVMjniDeleteLocalRef(env, obj); return NULL; } return obj;#else /* CVM_REFLECT */ CVMthrowUnsupportedOperationException(CVMjniEnv2ExecEnv(env), NULL); return NULL;#endif /* CVM_REFLECT */}JNIEXPORT jobject JNICALLJVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which){#ifdef CVM_REFLECT CVMExecEnv* ee = CVMjniEnv2ExecEnv(env); jobject obj; const char *nameChars; if (name == NULL) { CVMthrowNullPointerException(ee, NULL); return NULL; } obj = CVMjniCreateLocalRef(ee); if (obj == NULL) /* exception thrown */ return NULL; nameChars = (*env)->GetStringUTFChars(env, name, NULL); if (nameChars == NULL) { (*env)->DeleteLocalRef(env, obj); return NULL; } CVMreflectField(ee, CVMgcSafeClassRef2ClassBlock(ee, cls), nameChars, which, (CVMObjectICell*) obj); (*env)->ReleaseStringUTFChars(env, name, nameChars); if (CVMexceptionOccurred(ee)) { CVMjniDeleteLocalRef(env, obj); return NULL; } return obj;#else /* CVM_REFLECT */ CVMthrowUnsupportedOperationException(CVMjniEnv2ExecEnv(env), NULL); return NULL;#endif /* CVM_REFLECT */}JNIEXPORT jobject JNICALLJVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which){#ifdef CVM_REFLECT CVMExecEnv* ee = CVMjniEnv2ExecEnv(env); jobject obj; const char *nameChars; if (name == NULL) { CVMthrowNullPointerException(ee, NULL); return NULL; } obj = CVMjniCreateLocalRef(ee); if (obj == NULL) /* exception thrown */ return NULL; nameChars = (*env)->GetStringUTFChars(env, name, NULL); if (nameChars == NULL) { (*env)->DeleteLocalRef(env, obj); return NULL; } CVMreflectMethod(ee, CVMgcSafeClassRef2ClassBlock(ee, cls), nameChars, (CVMArrayOfRefICell*) types, which, (CVMObjectICell*) obj); (*env)->ReleaseStringUTFChars(env, name, nameChars); if (CVMexceptionOccurred(ee)) { CVMjniDeleteLocalRef(env, obj); return NULL; } return obj;#else /* CVM_REFLECT */ CVMthrowUnsupportedOperationException(CVMjniEnv2ExecEnv(env), NULL); return NULL;#endif /* CVM_REFLECT */}JNIEXPORT jobject JNICALLJVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which){#ifdef CVM_REFLECT CVMExecEnv* ee = CVMjniEnv2ExecEnv(env); jobject obj = CVMjniCreateLocalRef(ee); if (obj == NULL) /* exception thrown */ return NULL; CVMreflectConstructor(ee, CVMgcSafeClassRef2ClassBlock(ee, cls), (CVMArrayOfRefICell*) types, which, (CVMObjectICell*) obj); if (CVMexceptionOccurred(ee)) { CVMjniDeleteLocalRef(env, obj); return NULL; } return obj;#else /* CVM_REFLECT */ CVMthrowUnsupportedOperationException(CVMjniEnv2ExecEnv(env), NULL); return NULL;#endif /* CVM_REFLECT */}JNIEXPORT jobjectArray JNICALLJVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass){#ifdef CVM_REFLECT CVMExecEnv *ee = CVMjniEnv2ExecEnv(env); CVMClassBlock* cb = CVMgcSafeClassRef2ClassBlock(ee, ofClass); jobject obj = CVMjniCreateLocalRef(ee); if (obj == NULL) return NULL; CVMreflectInnerClasses(ee, cb, (CVMArrayOfRefICell*) obj); if (CVMexceptionOccurred(ee)) { CVMjniDeleteLocalRef(env, obj); return NULL; } return obj;#else /* CVM_REFLECT */ CVMthrowUnsupportedOperationException(CVMjniEnv2ExecEnv(env), NULL); return NULL;#endif /* CVM_REFLECT */}JNIEXPORT jclass JNICALLJVM_GetDeclaringClass(JNIEnv *env, jclass ofClass){#ifdef CVM_REFLECT CVMExecEnv *ee = CVMjniEnv2ExecEnv(env); CVMClassBlock* cb = CVMgcSafeClassRef2ClassBlock(ee, ofClass); CVMClassBlock* parentCb; parentCb = CVMreflectGetDeclaringClass(ee, cb); if (parentCb == NULL) { return NULL; } return (*env)->NewLocalRef(env, CVMcbJavaInstance(parentCb));#else /* CVM_REFLECT */ CVMthrowUnsupportedOperationException(CVMjniEnv2ExecEnv(env), NULL); return NULL;#endif /* CVM_REFLECT */}JNIEXPORT jclass JNICALLJVM_GetCallerClass(JNIEnv *env, int n){ CVMExecEnv* ee = CVMjniEnv2ExecEnv(env); CVMClassBlock* cb = CVMgetCallerClass(ee, n); if (cb == NULL) { return NULL; } else { return (*env)->NewLocalRef(env, CVMcbJavaInstance(cb)); }}#ifndef CDC_10/* Assertion support. */jbooleanJVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls){ CVMExecEnv* ee = CVMjniEnv2ExecEnv(env); CVMClassBlock* cb; char* classname; jboolean result; CVMassert(cls != NULL); cb = CVMgcSafeClassRef2ClassBlock(ee, cls); CVMassert(!CVMcbIs(cb, PRIMITIVE)); classname = CVMtypeidClassNameToAllocatedCString(CVMcbClassName(cb)); if (classname == NULL) { CVMthrowOutOfMemoryError(ee, NULL); return CVM_FALSE; } result = CVMJavaAssertions_enabled(classname, CVMcbClassLoader(cb) == NULL); free(classname); return result;}/* Return a new AssertionStatusDirectives object with the fields filled in with command-line assertion arguments (i.e., -ea, -da). */jobjectJVM_AssertionStatusDirectives(JNIEnv *env, jclass unused){ CVMExecEnv* ee = CVMjniEnv2ExecEnv(env); jobject asd = CVMJavaAssertions_createAssertionStatusDirectives(ee); if (CVMlocalExceptionOccurred(ee)) { return NULL; } return asd;}#endif /* !CDC_10 *//* Note: JVM_NewInstance is not needed in CVM because Class.newInstance is implemented in Java. *//* * Called from System.c */JNIEXPORT jlong JNICALLJVM_CurrentTimeMillis(JNIEnv *env, jclass ignored){ return CVMtimeMillis();}/* * Copies an array of refs to another array of refs where an assignability * check is required for every element copied to the destination array. */voidCVMcopyRefArrays(CVMExecEnv* ee, CVMArrayOfRef* srcArr, jint src_pos, CVMArrayOfRef* dstArr, jint dst_pos, CVMClassBlock* dstElemCb, jint length){ CVMJavaInt i, j; if ((dstArr != srcArr) || (dst_pos < src_pos)) { for (i = src_pos, j = dst_pos; i < src_pos + length; i++, j++) { CVMObject* elem; CVMD_arrayReadRef(srcArr, i, elem); if (elem != NULL) { CVMClassBlock* rhsType = CVMobjectGetClass(elem); if ((rhsType != dstElemCb) && !CVMisAssignable(ee, rhsType, dstElemCb)) { if (!CVMlocalExceptionOccurred(ee)) { CVMthrowArrayStoreException(ee, NULL); } return; } } CVMD_arrayWriteRef(dstArr, j, elem); } } else { for (i = src_pos + length - 1, j = dst_pos + length - 1; i >= src_pos; i--, j--) { CVMObject* elem; CVMD_arrayReadRef(srcArr, i, elem); if (elem != NULL) { CVMClassBlock* rhsType = CVMobjectGetClass(elem); if ((rhsType != dstElemCb) && !CVMisAssignable(ee, rhsType, dstElemCb)) { if (!CVMlocalExceptionOccurred(ee)) { CVMthrowArrayStoreException(ee, NULL); } return; } } CVMD_arrayWriteRef(dstArr, j, elem); } }}JNIEXPORT void JNICALLJVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length){ CVMExecEnv *ee = CVMjniEnv2ExecEnv(env); CVMClassBlock *srcCb, *dstCb; CVMClassBlock *srcElemCb, *dstElemCb; CVMArrayOfAnyType *srcArr; CVMArrayOfAnyType *dstArr; size_t srclen; size_t dstlen; if ((src == 0) || (dst == 0)) { CVMthrowNullPointerException(ee, NULL); return; } CVMD_gcUnsafeExec(ee, { srcArr = (CVMArrayOfAnyType *)CVMID_icellDirect(ee, src); dstArr = (CVMArrayOfAnyType *)CVMID_icellDirect(ee, dst); srcCb = CVMobjectGetClass(srcArr); dstCb = CVMobjectGetClass(dstArr); /* * First check whether we are dealing with source and destination * arrays here. If not, bail out quickly. */ if (!CVMisArrayClass(srcCb) || !CVMisArrayClass(dstCb)) { CVMthrowArrayStoreException(ee, NULL); goto bail; } srcElemCb = CVMarrayElementCb(srcCb); dstElemCb = CVMarrayElementCb(dstCb); srclen = CVMD_arrayGetLength(srcArr); dstlen = CVMD_arrayGetLength(dstArr); /* * If we are trying to copy between * arrays that don't have the same type of primitive elements, * bail out quickly. * * The more refined assignability checks for reference arrays * will be performed in the CVM_T_CLASS case below. */ /* * We could make this check slightly faster by comparing * type-codes of the elements of the array, if we had a * quick way of getting to that. */ if ((srcElemCb != dstElemCb) && (CVMcbIs(srcElemCb, PRIMITIVE) || CVMcbIs(dstElemCb, PRIMITIVE))) { CVMthrowArrayStoreException(ee, NULL); goto bail; } else if ((length < 0) || (src_pos < 0) || (dst_pos < 0) || (length + src_pos > srclen) || (length + dst_pos > dstlen)) { CVMthrowArrayIndexOutOfBoundsException(ee, NULL); goto bail; } switch(CVMarrayElemTypeCode(srcCb)) { case CVM_T_BOOLEAN: CVMD_arrayCopyBoolean((CVMArrayOfBoolean*)srcArr, src_pos, (CVMArrayOfBoolean*)dstArr, dst_pos, length); break; case CVM_T_BYTE: CVMD_arrayCopyByte((CVMArrayOfByte*)srcArr, src_pos, (CVMArrayOfByte*)dstArr, dst_pos, length); break; case CVM_T_SHORT: CVMD_arrayCopyShort((CVMArrayOfShort*)srcArr, src_pos, (CVMArrayOfShort*)dstArr, dst_pos, length); break; case CVM_T_CHAR: CVMD_arrayCopyChar((CVMArrayOfChar*)srcArr, src_pos, (CVMArrayOfChar*)dstArr, dst_pos, length); break; case CVM_T_INT: CVMD_arrayCopyInt((CVMArrayOfInt*)srcArr, src_pos, (CVMArrayOfInt*)dstArr, dst_pos, length); break; case CVM_T_LONG: CVMD_arrayCopyLong((CVMArrayOfLong*)srcArr, src_pos, (CVMArrayOfLong*)dstArr, dst_pos, length); break; case CVM_T_FLOAT: CVMD_arrayCopyFloat((CVMArrayOfFloat*)srcArr, src_pos, (CVMArrayOfFloat*)dstArr, dst_pos, length); break; case CVM_T_DOUBLE: CVMD_arrayCopyDouble((CVMArrayOfDouble*)srcArr, src_pos, (CVMArrayOfDouble*)dstArr, dst_pos, length); break; case CVM_T_CLASS: { /* * Do a quick check here for the easy case of the same * array type, or copying into an array of objects. No * need for element-wise checks in that case. */ if ((srcElemCb == dstElemCb) || (dstElemCb == CVMsystemClass(java_lang_Object))) { CVMD_arrayCopyRef((CVMArrayOfRef*)srcArr, src_pos, (CVMArrayOfRef*)dstArr, dst_pos, length); } else { /* Do it the hard way. */ CVMcopyRefArrays(ee, (CVMArrayOfRef*)srcArr, src_pos, (CVMArrayOfRef*)dstArr, dst_pos, dstElemCb, length); } break; case CVM_T_VOID: CVMassert(CVM_FALSE); } } bail:; });}/* For compatibility only; no longer called by java.lang.Runtime */#ifdef JDK12JNIEXPORT void JNICALLJVM_Exit(jint code){ if (code == 0) { RunFinalizersOnExit(); } Exit((int)code);}#endifJNIEXPORT void JNICALLJVM_Halt(jint code) /* Called from java.lang.Shutdown */{#ifdef CVM_LVM /* %begin lvm */ CVMExecEnv* ee = CVMgetEE(); if (CVMLVMinMainLVM(ee)) { CVMexit(code); } else { CVMLVMcontextHalt(ee); }#else /* %end lvm */ CVMexit(code);#endif /* %begin,end lvm */}JNIEXPORT void JNICALLJVM_OnExit(void (*func)(void)){ CVMatExit(func);}JNIEXPORT void JNICALLJVM_GC(void){ CVMgcRunGC(CVMgetEE());}JNIEXPORT jlong JNICALLJVM_MaxObjectInspectionAge(){
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?