static jint RegisterNatives(JNIEnv* env, jclass clazz, const JNINativeMethod* methods, jint nMethods) { NativeMethod* nativeMethods[nMethods]; jint i; for (i = 0; i < nMethods; i++) { nativeMethods[i] = (NativeMethod*) rvmGetMethod((Env*) env, (Class*) clazz, methods[i].name, methods[i].signature); if (nativeMethods[i] == NULL || !METHOD_IS_NATIVE(&nativeMethods[i]->method)) { rvmThrowNoSuchMethodError((Env*) env, methods[i].name); return JNI_ERR; } } for (i = 0; i < nMethods; i++) { if (!rvmRegisterNative((Env*) env, nativeMethods[i], methods[i].fnPtr)) { return JNI_ERR; } } return 0; }
ObjectArray* rvmCallStackToStackTraceElements(Env* env, CallStack* callStack, jint first) { if (!callStack || callStack->length == 0) { return empty_java_lang_StackTraceElement_array; } // Count the number of methods jint index = first; jint length = 0; while (rvmGetNextCallStackMethod(env, callStack, &index)) { length++; } if (length == 0) { return empty_java_lang_StackTraceElement_array; } ObjectArray* array = rvmNewObjectArray(env, length, java_lang_StackTraceElement, NULL, NULL); if (!array) return NULL; if (length > 0) { jvalue args[4]; index = first; jint i; for (i = 0; i < length; i++) { Method* m = rvmGetNextCallStackMethod(env, callStack, &index); args[0].l = (jobject) m->clazz; args[1].l = (jobject) rvmNewStringUTF(env, m->name, -1); if (!args[1].l) return NULL; args[2].l = (jobject) rvmAttributeGetClassSourceFile(env, m->clazz); if (rvmExceptionOccurred(env)) { return NULL; } args[3].i = METHOD_IS_NATIVE(m) ? -2 : -1; // TODO: Line numbers array->values[i] = rvmNewObjectA(env, java_lang_StackTraceElement, java_lang_StackTraceElement_constructor, args); if (!array->values[i]) return NULL; } } return array; }