From f5caf93c6e8c47fe9e3099baa08e14196b0a98a9 Mon Sep 17 00:00:00 2001 From: Emil Sjolander Date: Thu, 4 Aug 2016 08:20:05 -0700 Subject: [PATCH] Only perform class and method lookup once Summary: This caches the class and method id references between calls. The class lookup is done once per method still but I think that is ok for now as the code becomes somewhat cleaner and more self contained. Reviewed By: lucasr Differential Revision: D3661989 fbshipit-source-id: 68d4557364bb8957400aefb2603c2e46424ccec3 --- java/jni/CSSJNI.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/java/jni/CSSJNI.c b/java/jni/CSSJNI.c index a2e79124..f10888b3 100644 --- a/java/jni/CSSJNI.c +++ b/java/jni/CSSJNI.c @@ -39,11 +39,17 @@ static void _jniPrint(void *context) { JNIEnv *env = NULL; CSS_ASSERT((*jvm)->GetEnv(jvm, (void**) &env, JNI_VERSION) == JNI_OK, "Must have valid jni env"); - jclass cssNodeClass = (*env)->FindClass(env, "com/facebook/csslayout/CSSNodeJNI"); - CSS_ASSERT(cssNodeClass, "Could not find CSSNode class"); + static jclass cssNodeClass = NULL; + if (!cssNodeClass) { + cssNodeClass = (*env)->FindClass(env, "com/facebook/csslayout/CSSNodeJNI"); + CSS_ASSERT(cssNodeClass, "Could not find CSSNode class"); + } - jmethodID toStringID = (*env)->GetMethodID(env, cssNodeClass, "toString", "()Ljava/lang/String"); - CSS_ASSERT(toStringID, "Could not find toString method"); + static jmethodID toStringID = NULL; + if (!toStringID) { + toStringID = (*env)->GetMethodID(env, cssNodeClass, "toString", "()Ljava/lang/String"); + CSS_ASSERT(toStringID, "Could not find toString method"); + } jstring javaString = (jstring) (*env)->CallObjectMethod(env, context, toStringID); const char *nativeString = (*env)->GetStringUTFChars(env, javaString, 0); @@ -56,11 +62,17 @@ static CSSSize _jniMeasureFunc(void *context, float width, CSSMeasureMode widthM JNIEnv *env = NULL; CSS_ASSERT((*jvm)->GetEnv(jvm, (void**) &env, JNI_VERSION) == JNI_OK, "Must have valid jni env"); - jclass cssNodeClass = (*env)->FindClass(env, "com/facebook/csslayout/CSSNodeJNI"); - CSS_ASSERT(cssNodeClass, "Could not find CSSNode class"); + static jclass cssNodeClass = NULL; + if (!cssNodeClass) { + cssNodeClass = (*env)->FindClass(env, "com/facebook/csslayout/CSSNodeJNI"); + CSS_ASSERT(cssNodeClass, "Could not find CSSNode class"); + } - jmethodID measureID = (*env)->GetMethodID(env, cssNodeClass, "measure", "(FIFI)J"); - CSS_ASSERT(measureID, "Could not find measure method"); + static jmethodID measureID = NULL; + if (!measureID) { + measureID = (*env)->GetMethodID(env, cssNodeClass, "measure", "(FIFI)J"); + CSS_ASSERT(measureID, "Could not find measure method"); + } jlong measureResult = (*env)->CallLongMethod(env, context, measureID, width, widthMode, height, heightMode); CSSSize size = {