@@ -52,37 +52,6 @@ std::list<jobject> javaReflectionGetFields(JNIEnv *env, jclass clazz) {
5252 return results;
5353}
5454
55- std::list<jobject> javaReflectionGetStaticMethods (JNIEnv *env, jclass clazz) {
56- std::list<jobject> results;
57-
58- jclass clazzclazz = env->GetObjectClass (clazz);
59- jmethodID methodId = env->GetMethodID (clazzclazz, " getDeclaredMethods" , " ()[Ljava/lang/reflect/Method;" );
60- // TODO: filter out instance and prive methods
61- jobjectArray methodObjects = (jobjectArray)env->CallObjectMethod (clazz, methodId);
62- jsize methodCount = env->GetArrayLength (methodObjects);
63- for (jsize i=0 ; i<methodCount; i++) {
64- jobject obj = env->GetObjectArrayElement (methodObjects, i);
65- results.push_back (obj);
66- }
67-
68- return results;
69- }
70-
71- std::list<jobject> javaReflectionGetConstructors (JNIEnv *env, jclass clazz) {
72- std::list<jobject> results;
73-
74- jclass clazzclazz = env->GetObjectClass (clazz);
75- jmethodID methodId = env->GetMethodID (clazzclazz, " getConstructors" , " ()[Ljava/lang/reflect/Constructor;" );
76- jobjectArray methodObjects = (jobjectArray)env->CallObjectMethod (clazz, methodId);
77- jsize methodCount = env->GetArrayLength (methodObjects);
78- for (jsize i=0 ; i<methodCount; i++) {
79- jobject obj = env->GetObjectArrayElement (methodObjects, i);
80- results.push_back (obj);
81- }
82-
83- return results;
84- }
85-
8655std::string javaToString (JNIEnv *env, jstring str) {
8756 const char * chars = env->GetStringUTFChars (str, NULL );
8857 std::string results = chars;
@@ -100,103 +69,6 @@ std::string javaObjectToString(JNIEnv *env, jobject obj) {
10069 return javaToString (env, result);
10170}
10271
103- jobject javaFindBestMatchingMethod (
104- JNIEnv *env,
105- std::list<jobject>& methods,
106- const char *methodName,
107- jobjectArray args) {
108-
109- jsize argsSize = env->GetArrayLength (args);
110-
111- std::list<jobject> possibleMatches;
112- jclass methodClazz = env->FindClass (" java/lang/reflect/Method" );
113- jmethodID method_getNameMethod = env->GetMethodID (methodClazz, " getName" , " ()Ljava/lang/String;" );
114- jmethodID method_getParameterTypes = env->GetMethodID (methodClazz, " getParameterTypes" , " ()[Ljava/lang/Class;" );
115-
116- for (std::list<jobject>::iterator it = methods.begin (); it != methods.end (); it++) {
117- std::string itMethodName = javaToString (env, (jstring)env->CallObjectMethod (*it, method_getNameMethod));
118- if (itMethodName == methodName) {
119- jobjectArray parameters = (jobjectArray)env->CallObjectMethod (*it, method_getParameterTypes);
120- if (env->GetArrayLength (parameters) == argsSize) {
121- possibleMatches.push_back (*it);
122- }
123- }
124- }
125-
126- if (possibleMatches.size () == 0 ) {
127- return NULL ;
128- }
129- if (possibleMatches.size () == 1 ) {
130- return possibleMatches.front ();
131- } else {
132- // second pass to check arguments
133- for (std::list<jobject>::iterator it = possibleMatches.begin (); it != possibleMatches.end (); it++) {
134- jobjectArray possibleMatchArgs = (jobjectArray)env->CallObjectMethod (*it, method_getParameterTypes);
135- jsize i;
136- for (i=0 ; i<argsSize; i++) {
137- jobject arg = env->GetObjectArrayElement (args, i);
138- // jclass argClass = env->GetObjectClass(arg);
139- jclass possibleMatchArgClass = (jclass)env->GetObjectArrayElement (possibleMatchArgs, i);
140- jboolean isAssignableFrom = env->IsInstanceOf (arg, possibleMatchArgClass);
141- // printf("match\n\t%s\n\t%s\n\t%d\n", javaObjectToString(env,argClass).c_str(), javaObjectToString(env,possibleMatchArgClass).c_str(), isAssignableFrom);
142- if (!isAssignableFrom)
143- break ;
144- }
145- if (i == argsSize) {
146- return *it;
147- }
148- }
149-
150- /*
151- printf("javaFindBestMatchingMethod: multiple matches (choosing the first)\n");
152- for(std::list<jobject>::iterator it = possibleMatches.begin(); it != possibleMatches.end(); it++) {
153- printf(" %s\n", javaObjectToString(env, *it).c_str());
154- }
155- */
156-
157- return possibleMatches.front ();
158- }
159-
160- return NULL ;
161- }
162-
163- jobject javaFindBestMatchingConstructor (
164- JNIEnv *env,
165- std::list<jobject>& constructors,
166- jobjectArray args) {
167-
168- jsize argsSize = env->GetArrayLength (args);
169-
170- std::list<jobject> possibleMatches;
171- jclass constructorClazz = env->FindClass (" java/lang/reflect/Constructor" );
172- jmethodID constructor_getParameterTypes = env->GetMethodID (constructorClazz, " getParameterTypes" , " ()[Ljava/lang/Class;" );
173-
174- for (std::list<jobject>::iterator it = constructors.begin (); it != constructors.end (); it++) {
175- jarray parameters = (jarray)env->CallObjectMethod (*it, constructor_getParameterTypes);
176- if (env->GetArrayLength (parameters) == argsSize) {
177- possibleMatches.push_back (*it);
178- }
179- }
180-
181- if (possibleMatches.size () == 0 ) {
182- return NULL ;
183- }
184- if (possibleMatches.size () == 1 ) {
185- return possibleMatches.front ();
186- } else {
187- // TODO: argument match
188- /*
189- printf("javaFindBestMatchingConstructor: multiple matches (choosing the first)\n");
190- for(std::list<jobject>::iterator it = possibleMatches.begin(); it != possibleMatches.end(); it++) {
191- printf(" %s\n", javaObjectToString(env, *it).c_str());
192- }
193- */
194- return possibleMatches.front ();
195- }
196-
197- return NULL ;
198- }
199-
20072JNIEnv* javaAttachCurrentThread (JavaVM* jvm) {
20173 JNIEnv* env;
20274 JavaVMAttachArgs attachArgs;
@@ -372,6 +244,7 @@ v8::Handle<v8::Value> javaExceptionToV8(JNIEnv* env, jthrowable ex, const std::s
372244v8::Handle<v8::Value> javaExceptionToV8 (JNIEnv* env, const std::string& alternateMessage) {
373245 v8::HandleScope scope;
374246 jthrowable ex = env->ExceptionOccurred ();
247+ env->ExceptionClear ();
375248 return scope.Close (javaExceptionToV8 (env, ex, alternateMessage));
376249}
377250
@@ -447,4 +320,35 @@ v8::Handle<v8::Value> javaToV8(Java* java, JNIEnv* env, jvalueType resultType, j
447320 }
448321 }
449322 return v8::Undefined ();
450- }
323+ }
324+
325+ jobjectArray javaObjectArrayToClasses (JNIEnv *env, jobjectArray objs) {
326+ jclass clazzClazz = env->FindClass (" java/lang/Class" );
327+ jsize objsLength = env->GetArrayLength (objs);
328+ jobjectArray results = env->NewObjectArray (objsLength, clazzClazz, NULL );
329+ for (jsize i=0 ; i<objsLength; i++) {
330+ jclass objClazz = env->GetObjectClass (env->GetObjectArrayElement (objs, i));
331+ env->SetObjectArrayElement (results, i, objClazz);
332+ }
333+ return results;
334+ }
335+
336+ jobject javaFindMethod (JNIEnv *env, jclass clazz, std::string& methodName, jobjectArray methodArgs) {
337+ jclass methodUtilsClazz = env->FindClass (" com/nearinfinity/org/apache/commons/lang3/reflect/MethodUtils" );
338+ jmethodID methodUtils_getMatchingAccessibleMethod = env->GetStaticMethodID (methodUtilsClazz, " getMatchingAccessibleMethod" , " (Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;" );
339+ const char *methodNameCStr = methodName.c_str ();
340+ jstring methodNameJavaStr = env->NewStringUTF (methodNameCStr);
341+ jobjectArray methodArgClasses = javaObjectArrayToClasses (env, methodArgs);
342+ jobject method = env->CallStaticObjectMethod (methodUtilsClazz, methodUtils_getMatchingAccessibleMethod, clazz, methodNameJavaStr, methodArgClasses);
343+
344+ return method;
345+ }
346+
347+ jobject javaFindConstructor (JNIEnv *env, jclass clazz, jobjectArray methodArgs) {
348+ jclass constructorUtilsClazz = env->FindClass (" com/nearinfinity/org/apache/commons/lang3/reflect/ConstructorUtils" );
349+ jmethodID constructorUtils_getMatchingAccessibleConstructor = env->GetStaticMethodID (constructorUtilsClazz, " getMatchingAccessibleConstructor" , " (Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/reflect/Constructor;" );
350+ jobjectArray methodArgClasses = javaObjectArrayToClasses (env, methodArgs);
351+ jobject method = env->CallStaticObjectMethod (constructorUtilsClazz, constructorUtils_getMatchingAccessibleConstructor, clazz, methodArgClasses);
352+
353+ return method;
354+ }
0 commit comments