android_view_ThreadedRenderer.cpp revision 19b6bcfd83eb7fb92ebd06d2fec89e308311f1d0
1cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck/*
2cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Copyright (C) 2010 The Android Open Source Project
3cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck *
4cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Licensed under the Apache License, Version 2.0 (the "License");
5cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * you may not use this file except in compliance with the License.
6cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * You may obtain a copy of the License at
7cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck *
8cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck *      http://www.apache.org/licenses/LICENSE-2.0
9cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck *
10cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Unless required by applicable law or agreed to in writing, software
11cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * distributed under the License is distributed on an "AS IS" BASIS,
12cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * See the License for the specific language governing permissions and
14cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * limitations under the License.
15cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck */
16cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
1723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#define LOG_TAG "ThreadedRenderer"
18cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
19cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include "jni.h"
20cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <nativehelper/JNIHelp.h>
21cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <android_runtime/AndroidRuntime.h>
22cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
234f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <utils/StrongPointer.h>
244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <android_runtime/android_view_Surface.h>
254f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <system/window.h>
264f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
274f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <renderthread/RenderProxy.h>
28cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderTask.h>
29cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderThread.h>
30cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
31cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace android {
32cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
33cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#ifdef USE_OPENGL_RENDERER
34cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer;
364f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer::renderthread;
37cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
38cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckstatic jmethodID gRunnableMethod;
39cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
404f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass JavaTask : public RenderTask {
41cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckpublic:
42cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    JavaTask(JNIEnv* env, jobject jrunnable) {
43cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        env->GetJavaVM(&mVm);
44cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        mRunnable = env->NewGlobalRef(jrunnable);
45cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    }
46cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
47cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    virtual void run() {
48cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        env()->CallVoidMethod(mRunnable, gRunnableMethod);
494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        env()->DeleteGlobalRef(mRunnable);
504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        delete this;
51cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    };
52cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
53cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckprivate:
54cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    JNIEnv* env() {
55cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        JNIEnv* env;
56cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
57cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck            return 0;
58cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        }
59cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        return env;
60cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    }
61cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
62cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    JavaVM* mVm;
63cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    jobject mRunnable;
64cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck};
65cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
66cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckstatic void android_view_ThreadedRenderer_postToRenderThread(JNIEnv* env, jobject clazz,
67cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        jobject jrunnable) {
684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderTask* task = new JavaTask(env, jrunnable);
694f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderThread::getInstance().queue(task);
704f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
714f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
724f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic jlong android_view_ThreadedRenderer_createProxy(JNIEnv* env, jobject clazz,
734f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jboolean translucent) {
744f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    return (jlong) new RenderProxy(translucent);
754f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
764f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
774f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz,
784f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr) {
7919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
804f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    delete proxy;
814f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
824f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
834f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz,
844f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr, jobject jsurface) {
8519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
864f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    sp<ANativeWindow> window = android_view_Surface_getNativeWindow(env, jsurface);
874f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    return proxy->initialize(window.get());
884f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
894f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
904f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject clazz,
914f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr, jobject jsurface) {
9219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
934f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    sp<ANativeWindow> window;
944f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    if (jsurface) {
954f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        window = android_view_Surface_getNativeWindow(env, jsurface);
964f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    }
974f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    proxy->updateSurface(window.get());
984f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
994f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
1004f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz,
1014f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr, jint width, jint height) {
10219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
1034f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    proxy->setup(width, height);
1044f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
1054f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
1064f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_drawDisplayList(JNIEnv* env, jobject clazz,
1074f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr, jlong displayListPtr, jint dirtyLeft, jint dirtyTop,
1084f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jint dirtyRight, jint dirtyBottom) {
10919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
11019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DisplayList* displayList = reinterpret_cast<DisplayList*>(displayListPtr);
1114f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    proxy->drawDisplayList(displayList, dirtyLeft, dirtyTop, dirtyRight, dirtyBottom);
1124f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
1134f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
1144f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_destroyCanvas(JNIEnv* env, jobject clazz,
1154f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr) {
11619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
1174f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    proxy->destroyCanvas();
1184f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
1194f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
1204f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_attachFunctor(JNIEnv* env, jobject clazz,
1214f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr, jlong functorPtr) {
12219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
1234f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
1244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    proxy->attachFunctor(functor);
1254f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
1264f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
1274f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_detachFunctor(JNIEnv* env, jobject clazz,
1284f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr, jlong functorPtr) {
12919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
1304f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
1314f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    proxy->detachFunctor(functor);
132cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}
133cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
134fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reckstatic void android_view_ThreadedRenderer_runWithGlContext(JNIEnv* env, jobject clazz,
135fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck        jlong proxyPtr, jobject jrunnable) {
13619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
137fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck    RenderTask* task = new JavaTask(env, jrunnable);
138fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck    proxy->runWithGlContext(task);
139fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck}
140fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck
14119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jlong android_view_ThreadedRenderer_createDisplayListLayer(JNIEnv* env, jobject clazz,
14219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck        jlong proxyPtr, jint width, jint height) {
14319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
14419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DeferredLayerUpdater* layer = proxy->createDisplayListLayer(width, height);
14519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    return reinterpret_cast<jlong>(layer);
14619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}
14719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
14819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz,
14919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck        jlong proxyPtr) {
15019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
15119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DeferredLayerUpdater* layer = proxy->createTextureLayer();
15219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    return reinterpret_cast<jlong>(layer);
15319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}
15419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
15519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jboolean android_view_ThreadedRenderer_copyLayerInto(JNIEnv* env, jobject clazz,
15619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck        jlong proxyPtr, jlong layerPtr, jlong bitmapPtr) {
15719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
15819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
15919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
16019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    return proxy->copyLayerInto(layer, bitmap);
16119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}
16219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
16319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic void android_view_ThreadedRenderer_destroyLayer(JNIEnv* env, jobject clazz,
16419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck        jlong proxyPtr, jlong layerPtr) {
16519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
16619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
16719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    proxy->destroyLayer(layer);
16819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}
16919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
170cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif
171cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
172cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ----------------------------------------------------------------------------
173cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// JNI Glue
174cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ----------------------------------------------------------------------------
175cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
176cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckconst char* const kClassPathName = "android/view/ThreadedRenderer";
177cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
178cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckstatic JNINativeMethod gMethods[] = {
179cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#ifdef USE_OPENGL_RENDERER
180cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    { "postToRenderThread", "(Ljava/lang/Runnable;)V",   (void*) android_view_ThreadedRenderer_postToRenderThread },
1814f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nCreateProxy", "(Z)J", (void*) android_view_ThreadedRenderer_createProxy },
1824f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy },
1834f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize },
1844f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface },
1854f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nSetup", "(JII)V", (void*) android_view_ThreadedRenderer_setup },
1864f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nDrawDisplayList", "(JJIIII)V", (void*) android_view_ThreadedRenderer_drawDisplayList},
1874f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nDestroyCanvas", "(J)V", (void*) android_view_ThreadedRenderer_destroyCanvas},
1884f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nAttachFunctor", "(JJ)V", (void*) android_view_ThreadedRenderer_attachFunctor},
1894f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nDetachFunctor", "(JJ)V", (void*) android_view_ThreadedRenderer_detachFunctor},
190fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck    { "nRunWithGlContext", "(JLjava/lang/Runnable;)V", (void*) android_view_ThreadedRenderer_runWithGlContext },
19119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    { "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer },
19219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer },
19319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    { "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto },
19419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    { "nDestroyLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_destroyLayer },
195cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif
196cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck};
197cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
198cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckint register_android_view_ThreadedRenderer(JNIEnv* env) {
199cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#ifdef USE_OPENGL_RENDERER
200cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    jclass cls = env->FindClass("java/lang/Runnable");
201cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    gRunnableMethod = env->GetMethodID(cls, "run", "()V");
202cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    env->DeleteLocalRef(cls);
203cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif
204cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
205cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}
206cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
207cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; // namespace android
208