diff options
| author | Derek Sollenberger <djsollen@google.com> | 2009-12-01 10:53:06 -0500 |
|---|---|---|
| committer | Derek Sollenberger <djsollen@google.com> | 2009-12-01 10:53:06 -0500 |
| commit | c1cf958cf053d63e0f2a09d2af1ec2fafdd32cd9 (patch) | |
| tree | cd574b3d196e2deb3030168ea7957d2d644f6543 /WebKit/android/plugins | |
| parent | ec48e7e106a9287efddd3a1f5a72431d51b6ca38 (diff) | |
| download | external_webkit-c1cf958cf053d63e0f2a09d2af1ec2fafdd32cd9.zip external_webkit-c1cf958cf053d63e0f2a09d2af1ec2fafdd32cd9.tar.gz external_webkit-c1cf958cf053d63e0f2a09d2af1ec2fafdd32cd9.tar.bz2 | |
cleaning up local JNI references for plugins and caching appropriate JNI ids.
Diffstat (limited to 'WebKit/android/plugins')
| -rw-r--r-- | WebKit/android/plugins/ANPSurfaceInterface.cpp | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/WebKit/android/plugins/ANPSurfaceInterface.cpp b/WebKit/android/plugins/ANPSurfaceInterface.cpp index e64f6e4..02ff77e 100644 --- a/WebKit/android/plugins/ANPSurfaceInterface.cpp +++ b/WebKit/android/plugins/ANPSurfaceInterface.cpp @@ -39,23 +39,48 @@ using namespace android; +// used to cache JNI method and field IDs for Surface Objects +static struct ANPSurfaceInterfaceJavaGlue { + bool initialized; + jmethodID getSurfaceHolder; + jmethodID getSurface; + jfieldID surfacePointer; +} gSurfaceJavaGlue; + static inline sp<Surface> getSurface(JNIEnv* env, jobject view) { if (!env || !view) { return NULL; } - jclass clazz = env->FindClass("android/view/Surface"); - jfieldID surfaceField = env->GetFieldID(clazz, "mSurface", "I"); + if (!gSurfaceJavaGlue.initialized) { + + jclass surfaceViewClass = env->FindClass("android/view/SurfaceView"); + gSurfaceJavaGlue.getSurfaceHolder = env->GetMethodID(surfaceViewClass, "getHolder", + "()Landroid/view/SurfaceHolder;"); + + jclass surfaceHolderClass = env->FindClass("android/view/SurfaceHolder"); + gSurfaceJavaGlue.getSurface = env->GetMethodID(surfaceHolderClass, "getSurface", + "()Landroid/view/Surface;"); + + jclass surfaceClass = env->FindClass("android/view/Surface"); + gSurfaceJavaGlue.surfacePointer = env->GetFieldID(surfaceClass, + "mSurface", "I"); - clazz = env->FindClass("android/view/SurfaceView"); - jmethodID getHolder = env->GetMethodID(clazz, "getHolder", "()Landroid/view/SurfaceHolder;"); + env->DeleteLocalRef(surfaceClass); + env->DeleteLocalRef(surfaceViewClass); + env->DeleteLocalRef(surfaceHolderClass); - clazz = env->FindClass("android/view/SurfaceHolder"); - jmethodID getSurface = env->GetMethodID(clazz, "getSurface", "()Landroid/view/Surface;"); + gSurfaceJavaGlue.initialized = true; + } + + jobject holder = env->CallObjectMethod(view, gSurfaceJavaGlue.getSurfaceHolder); + jobject surface = env->CallObjectMethod(holder, gSurfaceJavaGlue.getSurface); + jint surfacePointer = env->GetIntField(surface, gSurfaceJavaGlue.surfacePointer); - jobject holder = env->CallObjectMethod(view, getHolder); - jobject surface = env->CallObjectMethod(holder, getSurface); - return sp<Surface>((Surface*) env->GetIntField(surface, surfaceField)); + env->DeleteLocalRef(holder); + env->DeleteLocalRef(surface); + + return sp<Surface>((Surface*) surfacePointer); } static inline ANPBitmapFormat convertPixelFormat(PixelFormat format) { @@ -133,4 +158,7 @@ void ANPSurfaceInterfaceV0_Init(ANPInterface* value) { ASSIGN(i, lock); ASSIGN(i, unlock); + + // setup the java glue struct + gSurfaceJavaGlue.initialized = false; } |
