jvalue JMethodCaller::invoke(SunJVMDLL& jvm, jobject& obj, jvalue args[]) { jvalue res; res.l = 0; DEBUG("invoking " + m_clazz + ": " + m_methodname + ", " + getJavaSignature()); jclass cl = jvm.findClass(m_clazz); if (cl == 0) { DEBUG("Can't find class " + m_clazz + " !!"); return res; } jmethodID m = jvm.findMethod(cl, m_methodname, getJavaSignature(), false); if (m == 0) { DEBUG("Can't find the method " + m_methodname + " / " + getJavaSignature()); return res; } switch (m_returntype.TYPE) { case JVOID: jvm.invokeVoid(obj, m, args); break; case JBOOLEAN: res.z = jvm.invokeBoolean(obj, m, args); break; case JBYTE: res.b = jvm.invokeByte(obj, m, args); break; case JCHAR: res.c = jvm.invokeChar(obj, m, args); break; case JSHORT: res.s = jvm.invokeShort(obj, m, args); break; case JINT: res.i = jvm.invokeInt(obj, m, args); break; case JLONG: res.j = jvm.invokeLong(obj, m, args); break; case JFLOAT: res.f = jvm.invokeFloat(obj, m, args); break; case JDOUBLE: res.d = jvm.invokeDouble(obj, m, args); break; case JOBJECT: res.l = jvm.invokeObject(obj, m, args); break; } return res; }
/** * @brief toJavaSignature Convert qitype-like signature into Java-like signature. * @param signature qitype signature * @return Java signature */ std::string toJavaSignature(const std::string &signature) { std::vector<std::string> sigInfo = qi::signatureSplit(signature); std::string sig; // Compute every arguments sig.append("("); getJavaSignature(sig, sigInfo[2].substr(1, sigInfo[2].size()-2)); sig.append(")"); // Finally add return signature (or 'V' if empty) if (sigInfo[0] == "") sig.append("V"); else getJavaSignature(sig, sigInfo[0]); return sig; }
jvalue JMethodCaller::invokeStatic(SunJVMDLL& launcher, jvalue args[]) { jvalue res; jclass cl = launcher.findClass(m_clazz); jmethodID m = launcher.findMethod(cl, m_methodname, getJavaSignature(), true); DEBUG("Invoke Static " + m_methodname + " " + getJavaSignature() + " class " + m_clazz + " "); switch (m_returntype.TYPE) { case JVOID: res.l = NULL; launcher.invokeVoidStatic(cl, m, args); break; case JBOOLEAN: res.z = launcher.invokeBooleanStatic(cl, m, args); break; case JBYTE: res.b = launcher.invokeByteStatic(cl, m, args); break; case JCHAR: res.c = launcher.invokeCharStatic(cl, m, args); break; case JSHORT: res.s = launcher.invokeShortStatic(cl, m, args); break; case JINT: res.i = launcher.invokeIntStatic(cl, m, args); break; case JLONG: res.j = launcher.invokeLongStatic(cl, m, args); break; case JOBJECT: res.l = launcher.invokeObjectStatic(cl, m, args); break; } return res; }