Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: libadblockplus-android/jni/Utils.cpp

Issue 29354787: Issue 4442 - Cache class and ctors references in JNI_Load/UnLoad (Closed)
Patch Set: reverted to NewTuple Created Nov. 21, 2016, 8:25 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « libadblockplus-android/jni/Utils.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: libadblockplus-android/jni/Utils.cpp
diff --git a/libadblockplus-android/jni/Utils.cpp b/libadblockplus-android/jni/Utils.cpp
index 6c1b9274c417a4cfa8f93b37314d858bae94c188..a7b3e6fb481aadb68cc21ca17644b62e004fa589 100644
--- a/libadblockplus-android/jni/Utils.cpp
+++ b/libadblockplus-android/jni/Utils.cpp
@@ -19,6 +19,71 @@
#include "Utils.h"
+// precached in JNI_OnLoad and released in JNI_OnUnload
+JniGlobalReference<jclass>* arrayListClass;
+jmethodID arrayListCtor;
+
+JniGlobalReference<jclass>* filterClass;
+jmethodID filterCtor;
+
+JniGlobalReference<jclass>* subscriptionClass;
+jmethodID subscriptionCtor;
+
+JniGlobalReference<jclass>* notificationClass;
+jmethodID notificationCtor;
+
+JniGlobalReference<jclass>* exceptionClass;
+
+void JniUtils_OnLoad(JavaVM* vm, JNIEnv* env, void* reserved)
+{
+ arrayListClass = new JniGlobalReference<jclass>(env, env->FindClass("java/util/ArrayList"));
+ arrayListCtor = env->GetMethodID(arrayListClass->Get(), "<init>", "()V");
+
+ filterClass = new JniGlobalReference<jclass>(env, env->FindClass(PKG("Filter")));
+ filterCtor = env->GetMethodID(filterClass->Get(), "<init>", "(J)V");
+
+ subscriptionClass = new JniGlobalReference<jclass>(env, env->FindClass(PKG("Subscription")));
+ subscriptionCtor = env->GetMethodID(subscriptionClass->Get(), "<init>", "(J)V");
+
+ notificationClass = new JniGlobalReference<jclass>(env, env->FindClass(PKG("Notification")));
+ notificationCtor = env->GetMethodID(notificationClass->Get(), "<init>", "(J)V");
+
+ exceptionClass = new JniGlobalReference<jclass>(env, env->FindClass(PKG("AdblockPlusException")));
+}
+
+void JniUtils_OnUnload(JavaVM* vm, JNIEnv* env, void* reserved)
+{
+ if (arrayListClass)
+ {
+ delete arrayListClass;
+ arrayListClass = NULL;
+ }
+
+ if (filterClass)
+ {
+ delete filterClass;
+ filterClass = NULL;
+ }
+
+ if (subscriptionClass)
+ {
+ delete subscriptionClass;
+ subscriptionClass = NULL;
+ }
+
+ if (notificationClass)
+ {
+ delete notificationClass;
+ notificationClass = NULL;
+ }
+
+ if (exceptionClass)
+ {
+ delete exceptionClass;
+ exceptionClass = NULL;
+ }
+}
+
std::string JniJavaToStdString(JNIEnv* env, jstring str)
{
if (!str)
@@ -35,23 +100,29 @@ std::string JniJavaToStdString(JNIEnv* env, jstring str)
jobject NewJniArrayList(JNIEnv* env)
{
- JniLocalReference<jclass> clazz(env, env->FindClass("java/util/ArrayList"));
- jmethodID ctor = env->GetMethodID(*clazz, "<init>", "()V");
- return env->NewObject(*clazz, ctor);
+ return env->NewObject(arrayListClass->Get(), arrayListCtor);
}
-void JniAddObjectToList(JNIEnv* env, jobject list, jobject value)
+jmethodID JniGetAddToListMethod(JNIEnv* env, jobject list)
{
JniLocalReference<jclass> clazz(env, env->GetObjectClass(list));
- jmethodID add = env->GetMethodID(*clazz, "add", "(Ljava/lang/Object;)Z");
- env->CallBooleanMethod(list, add, value);
+ return env->GetMethodID(*clazz, "add", "(Ljava/lang/Object;)Z");
+}
+
+void JniAddObjectToList(JNIEnv* env, jobject list, jmethodID addMethod, jobject value)
+{
+ env->CallBooleanMethod(list, addMethod, value);
+}
+
+void JniAddObjectToList(JNIEnv* env, jobject list, jobject value)
+{
+ jmethodID addMethod = JniGetAddToListMethod(env, list);
+ JniAddObjectToList(env, list, addMethod, value);
}
void JniThrowException(JNIEnv* env, const std::string& message)
{
- JniLocalReference<jclass> clazz(env,
- env->FindClass(PKG("AdblockPlusException")));
- env->ThrowNew(*clazz, message.c_str());
+ env->ThrowNew(exceptionClass->Get(), message.c_str());
}
void JniThrowException(JNIEnv* env, const std::exception& e)
@@ -88,37 +159,37 @@ JNIEnvAcquire::~JNIEnvAcquire()
}
template<typename T>
-static jobject NewJniObject(JNIEnv* env, const T& value, const char* javaClass)
+static jobject NewJniObject(JNIEnv* env, const T& value, jclass clazz, jmethodID ctor)
{
if (!value.get())
{
return 0;
}
- JniLocalReference<jclass> clazz(
- env,
- env->FindClass(javaClass));
- jmethodID method = env->GetMethodID(*clazz, "<init>", "(J)V");
+ return env->NewObject(clazz, ctor, JniPtrToLong(new T(value)));
+}
- return env->NewObject(
- *clazz,
- method,
- JniPtrToLong(new T(value)));
+template<typename T>
+static jobject NewJniObject(JNIEnv* env, const T& value, const char* javaClass)
+{
+ JniLocalReference<jclass> clazz( env, env->FindClass(javaClass));
+ jmethodID ctor = env->GetMethodID(*clazz, "<init>", "(J)V");
+ return NewJniObject(env, value, *clazz, ctor);
}
jobject NewJniFilter(JNIEnv* env, const AdblockPlus::FilterPtr& filter)
{
- return NewJniObject(env, filter, PKG("Filter"));
+ return NewJniObject(env, filter, filterClass->Get(), filterCtor);
}
jobject NewJniSubscription(JNIEnv* env,
const AdblockPlus::SubscriptionPtr& subscription)
{
- return NewJniObject(env, subscription, PKG("Subscription"));
+ return NewJniObject(env, subscription, subscriptionClass->Get(), subscriptionCtor);
}
jobject NewJniNotification(JNIEnv* env,
const AdblockPlus::NotificationPtr& notification)
{
- return NewJniObject(env, notification, PKG("Notification"));
+ return NewJniObject(env, notification, notificationClass->Get(), notificationCtor);
}
« no previous file with comments | « libadblockplus-android/jni/Utils.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld