@@ -20,6 +20,7 @@ void javaReflectionGetMethods(JNIEnv *env, jclass clazz, std::list<jobject>* met
2020 jobject method = env->GetObjectArrayElement (methodObjects, i);
2121 jint methodModifiers = env->CallIntMethod (method, method_getModifiers);
2222 if ((methodModifiers & MODIFIER_STATIC ) == MODIFIER_STATIC ) {
23+ env->DeleteLocalRef (method);
2324 continue ;
2425 }
2526 methods->push_back (method);
@@ -39,6 +40,7 @@ void javaReflectionGetFields(JNIEnv *env, jclass clazz, std::list<jobject>* fiel
3940 jobject field = env->GetObjectArrayElement (fieldObjects, i);
4041 jint fieldModifiers = env->CallIntMethod (field, field_getModifiers);
4142 if ((fieldModifiers & MODIFIER_STATIC ) == MODIFIER_STATIC ) {
43+ env->DeleteLocalRef (field);
4244 continue ;
4345 }
4446 fields->push_back (field);
@@ -130,6 +132,7 @@ jclass javaFindClass(JNIEnv* env, std::string& className) {
130132}
131133
132134jobject javaFindField (JNIEnv* env, jclass clazz, std::string& fieldName) {
135+ jobject result = NULL ;
133136 jclass clazzclazz = env->GetObjectClass (clazz);
134137 jclass fieldClazz = env->FindClass (" java/lang/reflect/Field" );
135138 jmethodID field_getName = env->GetMethodID (fieldClazz, " getName" , " ()Ljava/lang/String;" );
@@ -141,11 +144,16 @@ jobject javaFindField(JNIEnv* env, jclass clazz, std::string& fieldName) {
141144 jobject field = env->GetObjectArrayElement (fieldObjects, i);
142145 std::string itFieldName = javaToString (env, (jstring)env->CallObjectMethod (field, field_getName));
143146 if (strcmp (itFieldName.c_str (), fieldName.c_str ()) == 0 ) {
144- return field;
147+ result = field;
148+ break ;
145149 }
150+ env->DeleteLocalRef (field);
146151 }
147152
148- return NULL ;
153+ env->DeleteLocalRef (fieldObjects);
154+ env->DeleteLocalRef (clazzclazz);
155+ env->DeleteLocalRef (fieldClazz);
156+ return result;
149157}
150158
151159jobject v8ToJava (JNIEnv* env, v8::Local<v8::Value> arg) {
@@ -325,9 +333,10 @@ v8::Handle<v8::Value> javaArrayToV8(Java* java, JNIEnv* env, jobjectArray objArr
325333
326334v8::Handle<v8::Value> javaToV8 (Java* java, JNIEnv* env, jobject obj) {
327335 v8::HandleScope scope;
336+ PUSH_LOCAL_JAVA_FRAME ();
328337
329338 if (obj == NULL ) {
330- return v8::Null ();
339+ POP_LOCAL_JAVA_FRAME_AND_RETURN ( v8::Null () );
331340 }
332341
333342 jclass objClazz = env->GetObjectClass (obj);
@@ -339,55 +348,55 @@ v8::Handle<v8::Value> javaToV8(Java* java, JNIEnv* env, jobject obj) {
339348 case TYPE_ARRAY :
340349 {
341350 v8::Handle<v8::Value> result = javaArrayToV8 (java, env, (jobjectArray)obj);
342- return scope.Close (result);
351+ POP_LOCAL_JAVA_FRAME_AND_RETURN ( scope.Close (result) );
343352 }
344353 case TYPE_VOID :
345- return v8::Undefined ();
354+ POP_LOCAL_JAVA_FRAME_AND_RETURN ( v8::Undefined () );
346355 case TYPE_BOOLEAN :
347356 {
348357 jclass booleanClazz = env->FindClass (" java/lang/Boolean" );
349358 jmethodID boolean_booleanValue = env->GetMethodID (booleanClazz, " booleanValue" , " ()Z" );
350359 bool result = env->CallBooleanMethod (obj, boolean_booleanValue);
351- return scope.Close (v8::Boolean::New (result));
360+ POP_LOCAL_JAVA_FRAME_AND_RETURN ( scope.Close (v8::Boolean::New (result) ));
352361 }
353362 case TYPE_BYTE :
354363 {
355364 jclass byteClazz = env->FindClass (" java/lang/Byte" );
356365 jmethodID byte_byteValue = env->GetMethodID (byteClazz, " byteValue" , " ()B" );
357366 jbyte result = env->CallByteMethod (obj, byte_byteValue);
358- return scope.Close (v8::Number::New (result));
367+ POP_LOCAL_JAVA_FRAME_AND_RETURN ( scope.Close (v8::Number::New (result) ));
359368 }
360369 case TYPE_LONG :
361370 {
362371 jclass longClazz = env->FindClass (" java/lang/Long" );
363372 jmethodID long_longValue = env->GetMethodID (longClazz, " longValue" , " ()J" );
364373 jlong result = env->CallLongMethod (obj, long_longValue);
365- return scope.Close (v8::Number::New (result));
374+ POP_LOCAL_JAVA_FRAME_AND_RETURN ( scope.Close (v8::Number::New (result) ));
366375 }
367376 case TYPE_INT :
368377 {
369378 jclass integerClazz = env->FindClass (" java/lang/Integer" );
370379 jmethodID integer_intValue = env->GetMethodID (integerClazz, " intValue" , " ()I" );
371380 jint result = env->CallIntMethod (obj, integer_intValue);
372- return scope.Close (v8::Integer::New (result));
381+ POP_LOCAL_JAVA_FRAME_AND_RETURN ( scope.Close (v8::Integer::New (result) ));
373382 }
374383 case TYPE_DOUBLE :
375384 {
376385 jclass doubleClazz = env->FindClass (" java/lang/Double" );
377386 jmethodID double_doubleValue = env->GetMethodID (doubleClazz, " doubleValue" , " ()D" );
378387 jdouble result = env->CallDoubleMethod (obj, double_doubleValue);
379- return scope.Close (v8::Number::New (result));
388+ POP_LOCAL_JAVA_FRAME_AND_RETURN ( scope.Close (v8::Number::New (result) ));
380389 }
381390 case TYPE_STRING :
382- return scope.Close (v8::String::New (javaObjectToString (env, obj).c_str ()));
391+ POP_LOCAL_JAVA_FRAME_AND_RETURN ( scope.Close (v8::String::New (javaObjectToString (env, obj).c_str () )));
383392 case TYPE_OBJECT :
384- return scope.Close (JavaObject::New (java, obj));
393+ POP_LOCAL_JAVA_FRAME_AND_RETURN ( scope.Close (JavaObject::New (java, obj) ));
385394 default :
386395 printf (" unhandled type: 0x%03x\n " , resultType);
387- return scope.Close (JavaObject::New (java, obj));
396+ POP_LOCAL_JAVA_FRAME_AND_RETURN ( scope.Close (JavaObject::New (java, obj) ));
388397 }
389398
390- return v8::Undefined ();
399+ POP_LOCAL_JAVA_FRAME_AND_RETURN ( v8::Undefined () );
391400}
392401
393402jobjectArray javaObjectArrayToClasses (JNIEnv *env, jobjectArray objs) {
0 commit comments