Skip to content

Commit 70d84f9

Browse files
committed
speed up method calls by caching method invoke method id
1 parent f461e96 commit 70d84f9

2 files changed

Lines changed: 16 additions & 5 deletions

File tree

src/methodCallBaton.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ NanCallback* toNanCallback(v8::Handle<v8::Value>& callback) {
1212
}
1313

1414
MethodCallBaton::MethodCallBaton(Java* java, jobject method, jarray args, v8::Handle<v8::Value>& callback) :
15-
NanAsyncWorker(toNanCallback(callback)) {
15+
NanAsyncWorker(toNanCallback(callback)),
16+
m_methodInvokeMethodId(0) {
1617
JNIEnv *env = java->getJavaEnv();
1718
m_java = java;
1819
m_args = (jarray)env->NewGlobalRef(args);
@@ -34,6 +35,14 @@ MethodCallBaton::~MethodCallBaton() {
3435
env->DeleteGlobalRef(m_method);
3536
}
3637

38+
jmethodID MethodCallBaton::getMethodInvokeMethodId() {
39+
if(m_methodInvokeMethodId == 0) {
40+
jclass methodClazz = m_env->FindClass("java/lang/reflect/Method");
41+
m_methodInvokeMethodId = m_env->GetMethodID(methodClazz, "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");
42+
}
43+
return m_methodInvokeMethodId;
44+
}
45+
3746
void MethodCallBaton::run() {
3847
NanAsyncQueueWorker(this);
3948
}
@@ -112,8 +121,7 @@ void NewInstanceBaton::ExecuteInternal() {
112121
}
113122

114123
void StaticMethodCallBaton::ExecuteInternal() {
115-
jclass methodClazz = m_env->FindClass("java/lang/reflect/Method");
116-
jmethodID method_invoke = m_env->GetMethodID(methodClazz, "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");
124+
jmethodID method_invoke = getMethodInvokeMethodId();
117125

118126
/*
119127
printf("calling %s\n", javaObjectToString(m_env, m_method).c_str());
@@ -137,8 +145,7 @@ void StaticMethodCallBaton::ExecuteInternal() {
137145
}
138146

139147
void InstanceMethodCallBaton::ExecuteInternal() {
140-
jclass methodClazz = m_env->FindClass("java/lang/reflect/Method");
141-
jmethodID method_invoke = m_env->GetMethodID(methodClazz, "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");
148+
jmethodID method_invoke = getMethodInvokeMethodId();
142149

143150
/*
144151
printf("calling %s\n", javaObjectToString(m_env, m_method).c_str());

src/methodCallBaton.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class MethodCallBaton : public NanAsyncWorker {
2525
virtual void Execute();
2626
virtual void WorkComplete();
2727
virtual void ExecuteInternal() = 0;
28+
jmethodID getMethodInvokeMethodId();
2829

2930
JNIEnv *m_env;
3031
Java* m_java;
@@ -33,6 +34,9 @@ class MethodCallBaton : public NanAsyncWorker {
3334
jarray m_args;
3435
jobject m_result;
3536
jobject m_method;
37+
38+
private:
39+
jmethodID m_methodInvokeMethodId;
3640
};
3741

3842
class InstanceMethodCallBaton : public MethodCallBaton {

0 commit comments

Comments
 (0)