jmethodID methodIdFromClass(const char *className, const char *methName, const char *methSignature, MethType methType, JNIEnv *env) { jclass cls = globalClassReference(className, env); if (cls == NULL) { fprintf(stderr, "could not find class %s\n", className); return NULL; } jmethodID mid = 0; if (!validateMethodType(methType)) { fprintf(stderr, "invalid method type\n"); return NULL; } if (methType == STATIC) { mid = (*env)->GetStaticMethodID(env, cls, methName, methSignature); } else if (methType == INSTANCE) { mid = (*env)->GetMethodID(env, cls, methName, methSignature); } if (mid == NULL) { fprintf(stderr, "could not find method %s from class %s with signature %s\n",methName, className, methSignature); } return mid; }
int invokeMethod2(JNIEnv *env, jobjectArray *retval, Exc *exc, MethType methType, jobject instObj, const char *className, const char *methName, const char *methSignature, ...) { va_list args; jclass cls; jmethodID mid; jthrowable jthr; const char *str; char returnType; if (! validateMethodType(methType)) { return -1; } cls = globalClassReference(className, env); if (cls == NULL) { return -2; } mid = methodIdFromClass(className, methName, methSignature, methType, env); if (mid == NULL) { (*env)->ExceptionDescribe(env); return -3; } str = methSignature; while (*str != ')') str++; str++; returnType = *str; va_start(args, methSignature); if (returnType == JARRAYOBJECT) { jobjectArray jobj = NULL; if (methType == STATIC) { jobj = (*env)->CallStaticObjectMethodV(env, cls, mid, args); } else if (methType == INSTANCE) { jobj = (*env)->CallObjectMethodV(env, instObj, mid, args); } *retval = jobj; } else { *retval = NULL; return -1; } va_end(args); jthr = (*env)->ExceptionOccurred(env); if (jthr != NULL) { if (exc != NULL) *exc = jthr; else (*env)->ExceptionDescribe(env); return -1; } return 0; }
int invokeMethod(JNIEnv *env, RetVal *retval, Exc *exc, MethType methType, jobject instObj, const char *className, const char *methName, const char *methSignature, ...) { va_list args; jclass cls; jmethodID mid; jthrowable jthr; const char *str; char returnType; if (! validateMethodType(methType)) { return -1; } cls = globalClassReference(className, env); if (cls == NULL) { return -2; } mid = methodIdFromClass(className, methName, methSignature, methType, env); if (mid == NULL) { (*env)->ExceptionDescribe(env); return -3; } str = methSignature; while (*str != ')') str++; str++; returnType = *str; va_start(args, methSignature); if (returnType == JOBJECT || returnType == JARRAYOBJECT) { jobject jobj = NULL; if (methType == STATIC) { jobj = (*env)->CallStaticObjectMethodV(env, cls, mid, args); } else if (methType == INSTANCE) { jobj = (*env)->CallObjectMethodV(env, instObj, mid, args); } retval->l = jobj; } else if (returnType == VOID) { if (methType == STATIC) { (*env)->CallStaticVoidMethodV(env, cls, mid, args); } else if (methType == INSTANCE) { (*env)->CallVoidMethodV(env, instObj, mid, args); } } else if (returnType == JBOOLEAN) { jboolean jbool = 0; if (methType == STATIC) { jbool = (*env)->CallStaticBooleanMethodV(env, cls, mid, args); } else if (methType == INSTANCE) { jbool = (*env)->CallBooleanMethodV(env, instObj, mid, args); } retval->z = jbool; } else if (returnType == JSHORT) { jshort js = 0; if (methType == STATIC) { js = (*env)->CallStaticShortMethodV(env, cls, mid, args); } else if (methType == INSTANCE) { js = (*env)->CallShortMethodV(env, instObj, mid, args); } retval->s = js; } else if (returnType == JLONG) { jlong jl = -1; if (methType == STATIC) { jl = (*env)->CallStaticLongMethodV(env, cls, mid, args); } else if (methType == INSTANCE) { jl = (*env)->CallLongMethodV(env, instObj, mid, args); } retval->j = jl; } else if (returnType == JINT) { jint ji = -1; if (methType == STATIC) { ji = (*env)->CallStaticIntMethodV(env, cls, mid, args); } else if (methType == INSTANCE) { ji = (*env)->CallIntMethodV(env, instObj, mid, args); } retval->i = ji; } va_end(args); jthr = (*env)->ExceptionOccurred(env); if (jthr != NULL) { if (exc != NULL) *exc = jthr; else (*env)->ExceptionDescribe(env); return -1; } return 0; }