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

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

Issue 29345737: Issue 4146 - Fix failing UpdateCheckTest.testApplicationUpdateAvailable test in libadblockplus-andr… (Closed)
Patch Set: Created June 10, 2016, 1:33 p.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 | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: libadblockplus-android/jni/JniJsValue.cpp
===================================================================
--- a/libadblockplus-android/jni/JniJsValue.cpp
+++ b/libadblockplus-android/jni/JniJsValue.cpp
@@ -14,16 +14,37 @@
* You should have received a copy of the GNU General Public License
* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
*/
#include <AdblockPlus.h>
#include "Utils.h"
#include "JniJsValue.h"
+// precached in JNI_OnLoad and released in JNI_OnUnload
+jclass globalJsValueClass;
+jmethodID jsValueClassCtor;
+
+jint JNI_OnLoad(JavaVM* vm, void* reserved)
+{
+ JNIEnv* env;
+ if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK)
+ {
+ return JNI_ERR;
+ }
+
+ // precache for performance and avoid attaching threads
+ jclass localJsValueClass = env->FindClass(PKG("JsValue"));
+ globalJsValueClass = (jclass)env->NewGlobalRef(localJsValueClass);
+ jsValueClassCtor = env->GetMethodID(globalJsValueClass, "<init>", "(J)V");
+ env->DeleteLocalRef(localJsValueClass);
+
+ return JNI_VERSION_1_6;
+}
+
static jboolean JNICALL JniIsUndefined(JNIEnv* env, jclass clazz, jlong ptr)
{
try
{
return JniGetJsValue(ptr)->IsUndefined() ? JNI_TRUE : JNI_FALSE;
}
CATCH_THROW_AND_RETURN(env, JNI_FALSE)
}
@@ -145,27 +166,18 @@
jobject NewJniJsValue(JNIEnv* env, const AdblockPlus::JsValuePtr& jsValue, jclass jsValueClass)
{
if (!jsValue.get())
{
return 0;
}
- jclass clazz = jsValueClass ? jsValueClass : env->FindClass(PKG("JsValue"));
- jmethodID ctor = env->GetMethodID(clazz, "<init>", "(J)V");
jlong ptr = JniPtrToLong(new AdblockPlus::JsValuePtr(jsValue));
- jobject ret = env->NewObject(clazz, ctor, ptr);
-
- if (!jsValueClass)
- {
- env->DeleteLocalRef(clazz);
- }
-
- return ret;
+ return env->NewObject(globalJsValueClass, jsValueClassCtor, ptr);
}
AdblockPlus::JsValue* JniGetJsValue(jlong ptr)
{
return JniLongToTypePtr<AdblockPlus::JsValuePtr>(ptr)->get();
}
AdblockPlus::JsValuePtr& JniGetJsValuePtr(jlong ptr)
@@ -214,8 +226,22 @@
{ (char*)"getProperty", (char*)"(JLjava/lang/String;)" TYP("JsValue"), (void*)JniGetProperty },
{ (char*)"dtor", (char*)"(J)V", (void*)JniDtor }
};
extern "C" JNIEXPORT void JNICALL Java_org_adblockplus_libadblockplus_JsValue_registerNatives(JNIEnv *env, jclass clazz)
{
env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(methods[0]));
}
+
+void JNI_OnUnload(JavaVM *vm, void *reserved)
+{
+ JNIEnv* env;
+ if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK)
+ {
+ return;
+ }
+
+ if (globalJsValueClass)
+ {
+ env->DeleteGlobalRef(globalJsValueClass);
+ }
+}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld