|
30 | 30 | jclass methodClazz = env->FindClass("java/lang/reflect/Method"); |
31 | 31 | jmethodID method_getName = env->GetMethodID(methodClazz, "getName", "()Ljava/lang/String;"); |
32 | 32 | for(std::list<jobject>::iterator it = methods.begin(); it != methods.end(); it++) { |
33 | | - std::string methodNameStr = javaToString(env, (jstring)env->CallObjectMethod(*it, method_getName)); |
| 33 | + jstring methodNameJava = (jstring)env->CallObjectMethod(*it, method_getName); |
| 34 | + std::string methodNameStr = javaToString(env, methodNameJava); |
34 | 35 |
|
35 | 36 | v8::Handle<v8::String> methodName = v8::String::New(methodNameStr.c_str()); |
36 | 37 | v8::Local<v8::FunctionTemplate> methodCallTemplate = v8::FunctionTemplate::New(methodCall, methodName); |
|
39 | 40 | v8::Handle<v8::String> methodNameSync = v8::String::New((methodNameStr + "Sync").c_str()); |
40 | 41 | v8::Local<v8::FunctionTemplate> methodCallSyncTemplate = v8::FunctionTemplate::New(methodCallSync, methodName); |
41 | 42 | javaObjectObj->Set(methodNameSync, methodCallSyncTemplate->GetFunction()); |
| 43 | + |
| 44 | + env->DeleteLocalRef(methodNameJava); |
| 45 | + env->DeleteLocalRef(*it); |
42 | 46 | } |
43 | 47 |
|
44 | | - self->m_fields = javaReflectionGetFields(env, self->m_class); |
| 48 | + std::list<jobject> fields = javaReflectionGetFields(env, self->m_class); |
45 | 49 | jclass fieldClazz = env->FindClass("java/lang/reflect/Field"); |
46 | 50 | jmethodID field_getName = env->GetMethodID(fieldClazz, "getName", "()Ljava/lang/String;"); |
47 | | - for(std::list<jobject>::iterator it = self->m_fields.begin(); it != self->m_fields.end(); it++) { |
48 | | - std::string fieldNameStr = javaToString(env, (jstring)env->CallObjectMethod(*it, field_getName)); |
| 51 | + for(std::list<jobject>::iterator it = fields.begin(); it != fields.end(); it++) { |
| 52 | + jstring fieldNameJava = (jstring)env->CallObjectMethod(*it, field_getName); |
| 53 | + std::string fieldNameStr = javaToString(env, fieldNameJava); |
49 | 54 |
|
50 | 55 | v8::Handle<v8::String> fieldName = v8::String::New(fieldNameStr.c_str()); |
51 | 56 | javaObjectObj->SetAccessor(fieldName, fieldGetter, fieldSetter); |
| 57 | + |
| 58 | + env->DeleteLocalRef(fieldNameJava); |
| 59 | + env->DeleteLocalRef(*it); |
52 | 60 | } |
53 | 61 |
|
54 | 62 | return scope.Close(javaObjectObj); |
@@ -105,6 +113,9 @@ JavaObject::~JavaObject() { |
105 | 113 | InstanceMethodCallBaton* baton = new InstanceMethodCallBaton(self->m_java, self, method, methodArgs, callback); |
106 | 114 | baton->run(); |
107 | 115 |
|
| 116 | + env->DeleteLocalRef(methodArgs); |
| 117 | + env->DeleteLocalRef(method); |
| 118 | + |
108 | 119 | END_CALLBACK_FUNCTION("\"Method '" << methodNameStr << "' called without a callback did you mean to use the Sync version?\""); |
109 | 120 | } |
110 | 121 |
|
|
0 commit comments