/**************************************************************************** ** ** Copyright (C) 2010-2012 UC Mobile Ltd. All Rights Reserved ** File : CanvasHelper.java ** ** Description : Use reflection to call methods on Canvas above Android 2.2 ** ** Creation : 2012/11/07 ** Author : Roger (yixx@ucweb.com) ** History : ** Creation, 2012/11/07, Roger, Create the file ** ****************************************************************************/ package com.uc.webkit.helper; import java.lang.ref.WeakReference; import java.lang.reflect.Method; import android.graphics.Canvas; public final class CanvasHelper { public static final boolean IS_HARDWARE_ACCELERATED_FAST_CALL = true; private static final Class<Canvas> canvasClass = Canvas.class; private static Class<?> hwCanvasClass; private static Method methodIsHardwareAccelerated; private static Method methodCallDrawGLFunctionInt; private static Method methodCallDrawGLFunctionLong; private static WeakReference<Canvas> sLastCanvas; private static boolean sLastCanvasIsHardwareAccelerated; static { try { methodIsHardwareAccelerated = canvasClass.getMethod("isHardwareAccelerated"); hwCanvasClass = Class.forName("android.view.HardwareCanvas"); // In Android L, to support 64bits, the native-ptr pass through JNI // has been changed from Integer to Long type try { methodCallDrawGLFunctionInt = hwCanvasClass.getMethod("callDrawGLFunction", new Class<?>[] {Integer.TYPE}); } catch (Throwable t) { methodCallDrawGLFunctionLong = hwCanvasClass.getMethod("callDrawGLFunction", new Class<?>[] {Long.TYPE}); } } catch (Throwable t) { } } static public boolean isHardwareAccelerated(Canvas canvas) { // Return cached value, faster than use reflection if (sLastCanvas != null && sLastCanvas.get() == canvas) { return sLastCanvasIsHardwareAccelerated; } sLastCanvasIsHardwareAccelerated = false; if (methodIsHardwareAccelerated != null) { try { Object result = methodIsHardwareAccelerated.invoke(canvas); sLastCanvasIsHardwareAccelerated = (Boolean) result; } catch (Throwable t) { } } if (IS_HARDWARE_ACCELERATED_FAST_CALL) sLastCanvas = new WeakReference<Canvas>(canvas); return sLastCanvasIsHardwareAccelerated; } static public int callDrawGLFunction(Canvas canvas, long functor) { if (methodCallDrawGLFunctionInt != null) { try { Object result = methodCallDrawGLFunctionInt.invoke(canvas, (int) functor); return (Integer) result; } catch (Throwable t) { t.printStackTrace(); } } else if (methodCallDrawGLFunctionLong != null) { try { Object result = methodCallDrawGLFunctionLong.invoke(canvas, functor); return (Integer) result; } catch (Throwable t) { t.printStackTrace(); } } return 0; } }