@@ -213,7 +213,7 @@ jvalueType javaGetType(JNIEnv *env, jclass type) {
213213 }
214214}
215215
216- jclass javaFindClass (JNIEnv* env, std::string& className) {
216+ jclass javaFindClass (JNIEnv* env, const std::string& className) {
217217 std::string searchClassName = className;
218218 std::replace (searchClassName.begin (), searchClassName.end (), ' .' , ' /' );
219219
@@ -234,7 +234,7 @@ jclass javaFindClass(JNIEnv* env, std::string& className) {
234234 return clazz;
235235}
236236
237- jobject javaFindField (JNIEnv* env, jclass clazz, std::string& fieldName) {
237+ jobject javaFindField (JNIEnv* env, jclass clazz, const std::string& fieldName) {
238238 jobject result = NULL ;
239239 jclass clazzclazz = env->GetObjectClass (clazz);
240240 jclass fieldClazz = env->FindClass (" java/lang/reflect/Field" );
@@ -789,18 +789,18 @@ jobjectArray javaObjectArrayToClasses(JNIEnv *env, jobjectArray objs) {
789789 return results;
790790}
791791
792- jobject javaFindMethod (JNIEnv *env, jclass clazz, std::string& methodName, jobjectArray methodArgs) {
792+ jobject javaFindMethod (JNIEnv *env, jclass clazz, const std::string& methodName, jobjectArray methodArgs) {
793793 std::string::size_type parenLoc = methodName.find (" (" );
794794 if (parenLoc != std::string::npos) {
795795 jobject method = NULL ;
796796
797797 std::string methodSig = methodName.substr (parenLoc);
798- methodName = methodName.substr (0 , parenLoc);
799- jmethodID methodID = env->GetStaticMethodID (clazz, methodName .c_str (), methodSig.c_str ());
798+ std::string methodRealName = methodName.substr (0 , parenLoc);
799+ jmethodID methodID = env->GetStaticMethodID (clazz, methodRealName .c_str (), methodSig.c_str ());
800800 if (methodID != 0 ) {
801801 method = env->ToReflectedMethod (clazz, methodID, true );
802802 } else {
803- methodID = env->GetMethodID (clazz, methodName .c_str (), methodSig.c_str ());
803+ methodID = env->GetMethodID (clazz, methodRealName .c_str (), methodSig.c_str ());
804804 if (methodID != 0 ) {
805805 method = env->ToReflectedMethod (clazz, methodID, true );
806806 }
@@ -810,6 +810,10 @@ jobject javaFindMethod(JNIEnv *env, jclass clazz, std::string& methodName, jobje
810810 // cast arguments
811811 if (method != NULL ) {
812812 javaCastArguments (env, methodArgs, method);
813+ if (env->ExceptionCheck ()) {
814+ env->ExceptionClear ();
815+ method = NULL ;
816+ }
813817 }
814818
815819 return method;
@@ -856,14 +860,20 @@ int dynamicProxyDataVerify(DynamicProxyData* data) {
856860 return 0 ;
857861}
858862
859- std::string methodNotFoundToString (JNIEnv *env, jclass clazz, std::string methodName , bool constructor, Nan::NAN_METHOD_ARGS_TYPE args, int argStart, int argEnd) {
863+ std::string methodNotFoundToString (JNIEnv *env, jclass clazz, const std::string& methodNameSig , bool constructor, Nan::NAN_METHOD_ARGS_TYPE args, int argStart, int argEnd) {
860864 std::ostringstream startOfMessage;
861865 std::ostringstream msg;
866+ std::string methodName = methodNameSig.substr (0 , methodNameSig.find (' (' ));
862867
863868 jclass classClazz = env->FindClass (" java/lang/Class" );
864869 jmethodID class_getName = env->GetMethodID (classClazz, " getName" , " ()Ljava/lang/String;" );
865870
866- startOfMessage << " Could not find method \" " << methodName.c_str () << " (" ;
871+ if (methodName != methodNameSig) {
872+ startOfMessage << " Could not find method for signature \" " << methodNameSig.c_str () << " \" and arguments \" (" ;
873+ } else {
874+ startOfMessage << " Could not find method \" " << methodName.c_str () << " (" ;
875+ }
876+
867877 for (int i=argStart; i<argEnd; i++) {
868878 jobject val = v8ToJava (env, args[i]);
869879 if (i != argStart) {
0 commit comments