android_view_RenderNodeAnimator.cpp revision 72d6e4facb1abd81809fdaddbe42f41ad885189c
1e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/*
2e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Copyright (C) 2013 The Android Open Source Project
3e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *
4e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Licensed under the Apache License, Version 2.0 (the "License");
5e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * you may not use this file except in compliance with the License.
6e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * You may obtain a copy of the License at
7e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *
8e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *      http://www.apache.org/licenses/LICENSE-2.0
9e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *
10e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Unless required by applicable law or agreed to in writing, software
11e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * distributed under the License is distributed on an "AS IS" BASIS,
12e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * See the License for the specific language governing permissions and
14e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * limitations under the License.
15e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck */
16e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
17e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#define LOG_TAG "OpenGLRenderer"
18e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
19e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "jni.h"
20e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "GraphicsJNI.h"
21e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <nativehelper/JNIHelp.h>
22e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <android_runtime/AndroidRuntime.h>
23e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
24e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <Animator.h>
25e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <Interpolator.h>
26e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <RenderProperties.h>
27e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
28e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace android {
29e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
30e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckusing namespace uirenderer;
31e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
32e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic struct {
33e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    jclass clazz;
34e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
35e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    jmethodID callOnFinished;
36e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} gRenderNodeAnimatorClassInfo;
37e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
38496b8770c19c573299e4be525e877acc977a2dadJohn Reck#ifdef USE_OPENGL_RENDERER
39496b8770c19c573299e4be525e877acc977a2dadJohn Reck
40e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic JNIEnv* getEnv(JavaVM* vm) {
41e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    JNIEnv* env;
42e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
43e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        return 0;
44e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
45e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return env;
46e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
47e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
4872d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reckclass AnimationListenerLifecycleChecker : public AnimationListener {
4972d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reckpublic:
5072d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck    virtual void onAnimationFinished(BaseRenderNodeAnimator* animator) {
5172d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck        LOG_ALWAYS_FATAL("Lifecycle failure, nStart(%p) wasn't called", animator);
5272d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck    }
5372d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck};
5472d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck
5572d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reckstatic AnimationListenerLifecycleChecker sLifecycleChecker;
5672d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck
5752244fff29042926e21fa897ef5ab11148e35299John Reckclass AnimationListenerBridge : public AnimationListener {
5852244fff29042926e21fa897ef5ab11148e35299John Reckpublic:
5952244fff29042926e21fa897ef5ab11148e35299John Reck    // This holds a strong reference to a Java WeakReference<T> object. This avoids
6052244fff29042926e21fa897ef5ab11148e35299John Reck    // cyclic-references-of-doom. If you think "I know, just use NewWeakGlobalRef!"
6152244fff29042926e21fa897ef5ab11148e35299John Reck    // then you end up with basically a PhantomReference, which is totally not
6252244fff29042926e21fa897ef5ab11148e35299John Reck    // what we want.
63119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    AnimationListenerBridge(JNIEnv* env, jobject finishListener) {
64119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mFinishListener = env->NewGlobalRef(finishListener);
6552244fff29042926e21fa897ef5ab11148e35299John Reck        env->GetJavaVM(&mJvm);
6652244fff29042926e21fa897ef5ab11148e35299John Reck    }
67e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
6852244fff29042926e21fa897ef5ab11148e35299John Reck    virtual ~AnimationListenerBridge() {
69119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        if (mFinishListener) {
70119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck            onAnimationFinished(NULL);
71119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        }
7252244fff29042926e21fa897ef5ab11148e35299John Reck    }
73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
74ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    virtual void onAnimationFinished(BaseRenderNodeAnimator*) {
75119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        LOG_ALWAYS_FATAL_IF(!mFinishListener, "Finished listener twice?");
7652244fff29042926e21fa897ef5ab11148e35299John Reck        JNIEnv* env = getEnv(mJvm);
7752244fff29042926e21fa897ef5ab11148e35299John Reck        env->CallStaticVoidMethod(
7852244fff29042926e21fa897ef5ab11148e35299John Reck                gRenderNodeAnimatorClassInfo.clazz,
7952244fff29042926e21fa897ef5ab11148e35299John Reck                gRenderNodeAnimatorClassInfo.callOnFinished,
80119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck                mFinishListener);
81119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        releaseJavaObject();
8252244fff29042926e21fa897ef5ab11148e35299John Reck    }
83e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
8452244fff29042926e21fa897ef5ab11148e35299John Reckprivate:
85119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    void releaseJavaObject() {
86119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        JNIEnv* env = getEnv(mJvm);
87119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        env->DeleteGlobalRef(mFinishListener);
88119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mFinishListener = NULL;
89119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
90119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
9152244fff29042926e21fa897ef5ab11148e35299John Reck    JavaVM* mJvm;
92119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    jobject mFinishListener;
9352244fff29042926e21fa897ef5ab11148e35299John Reck};
9452244fff29042926e21fa897ef5ab11148e35299John Reck
9552244fff29042926e21fa897ef5ab11148e35299John Reckstatic inline RenderPropertyAnimator::RenderProperty toRenderProperty(jint property) {
9652244fff29042926e21fa897ef5ab11148e35299John Reck    LOG_ALWAYS_FATAL_IF(property < 0 || property > RenderPropertyAnimator::ALPHA,
97e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck            "Invalid property %d", property);
9852244fff29042926e21fa897ef5ab11148e35299John Reck    return static_cast<RenderPropertyAnimator::RenderProperty>(property);
9952244fff29042926e21fa897ef5ab11148e35299John Reck}
10052244fff29042926e21fa897ef5ab11148e35299John Reck
10152244fff29042926e21fa897ef5ab11148e35299John Reckstatic inline CanvasPropertyPaintAnimator::PaintField toPaintField(jint field) {
10252244fff29042926e21fa897ef5ab11148e35299John Reck    LOG_ALWAYS_FATAL_IF(field < 0
10352244fff29042926e21fa897ef5ab11148e35299John Reck            || field > CanvasPropertyPaintAnimator::ALPHA,
10452244fff29042926e21fa897ef5ab11148e35299John Reck            "Invalid paint field %d", field);
10552244fff29042926e21fa897ef5ab11148e35299John Reck    return static_cast<CanvasPropertyPaintAnimator::PaintField>(field);
10652244fff29042926e21fa897ef5ab11148e35299John Reck}
10752244fff29042926e21fa897ef5ab11148e35299John Reck
108119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic jlong createAnimator(JNIEnv* env, jobject clazz,
109ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        jint propertyRaw, jfloat finalValue) {
11052244fff29042926e21fa897ef5ab11148e35299John Reck    RenderPropertyAnimator::RenderProperty property = toRenderProperty(propertyRaw);
111ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    BaseRenderNodeAnimator* animator = new RenderPropertyAnimator(property, finalValue);
11272d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck    animator->setListener(&sLifecycleChecker);
11352244fff29042926e21fa897ef5ab11148e35299John Reck    return reinterpret_cast<jlong>( animator );
11452244fff29042926e21fa897ef5ab11148e35299John Reck}
11552244fff29042926e21fa897ef5ab11148e35299John Reck
11652244fff29042926e21fa897ef5ab11148e35299John Reckstatic jlong createCanvasPropertyFloatAnimator(JNIEnv* env, jobject clazz,
117119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        jlong canvasPropertyPtr, jfloat finalValue) {
11852244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPrimitive* canvasProperty = reinterpret_cast<CanvasPropertyPrimitive*>(canvasPropertyPtr);
119ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    BaseRenderNodeAnimator* animator = new CanvasPropertyPrimitiveAnimator(canvasProperty, finalValue);
12072d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck    animator->setListener(&sLifecycleChecker);
12152244fff29042926e21fa897ef5ab11148e35299John Reck    return reinterpret_cast<jlong>( animator );
12252244fff29042926e21fa897ef5ab11148e35299John Reck}
123e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
12452244fff29042926e21fa897ef5ab11148e35299John Reckstatic jlong createCanvasPropertyPaintAnimator(JNIEnv* env, jobject clazz,
125119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        jlong canvasPropertyPtr, jint paintFieldRaw,
126ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        jfloat finalValue) {
12752244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPaint* canvasProperty = reinterpret_cast<CanvasPropertyPaint*>(canvasPropertyPtr);
12852244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPaintAnimator::PaintField paintField = toPaintField(paintFieldRaw);
129ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    BaseRenderNodeAnimator* animator = new CanvasPropertyPaintAnimator(
130ff941dcd815021bb20d6504eb486acb1e50592c3John Reck            canvasProperty, paintField, finalValue);
13172d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck    animator->setListener(&sLifecycleChecker);
132e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return reinterpret_cast<jlong>( animator );
133e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
134e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
135119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic jlong createRevealAnimator(JNIEnv* env, jobject clazz,
136af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik        jint centerX, jint centerY, jfloat startRadius, jfloat endRadius) {
137af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik    BaseRenderNodeAnimator* animator = new RevealAnimator(centerX, centerY, startRadius, endRadius);
13872d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck    animator->setListener(&sLifecycleChecker);
139d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck    return reinterpret_cast<jlong>( animator );
140d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck}
141d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck
142c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reckstatic void setStartValue(JNIEnv* env, jobject clazz, jlong animatorPtr, jfloat startValue) {
143c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
144c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck    animator->setStartValue(startValue);
145c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck}
146c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck
147ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverettestatic void setDuration(JNIEnv* env, jobject clazz, jlong animatorPtr, jlong duration) {
148e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    LOG_ALWAYS_FATAL_IF(duration < 0, "Duration cannot be negative");
149ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
150e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    animator->setDuration(duration);
151e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
152e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
153ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverettestatic jlong getDuration(JNIEnv* env, jobject clazz, jlong animatorPtr) {
154ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
155ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    return static_cast<jlong>(animator->duration());
156ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette}
157ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette
158ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverettestatic void setStartDelay(JNIEnv* env, jobject clazz, jlong animatorPtr, jlong startDelay) {
159ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    LOG_ALWAYS_FATAL_IF(startDelay < 0, "Start delay cannot be negative");
160ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
161ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    animator->setStartDelay(startDelay);
162ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette}
163ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette
164ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverettestatic jlong getStartDelay(JNIEnv* env, jobject clazz, jlong animatorPtr) {
165ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
166ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    return static_cast<jlong>(animator->startDelay());
167315c329544d7c593d1072b071cbb92d9afe74021John Reck}
168315c329544d7c593d1072b071cbb92d9afe74021John Reck
169315c329544d7c593d1072b071cbb92d9afe74021John Reckstatic void setInterpolator(JNIEnv* env, jobject clazz, jlong animatorPtr, jlong interpolatorPtr) {
170ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
171315c329544d7c593d1072b071cbb92d9afe74021John Reck    Interpolator* interpolator = reinterpret_cast<Interpolator*>(interpolatorPtr);
172315c329544d7c593d1072b071cbb92d9afe74021John Reck    animator->setInterpolator(interpolator);
173315c329544d7c593d1072b071cbb92d9afe74021John Reck}
174315c329544d7c593d1072b071cbb92d9afe74021John Reck
175f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reckstatic void setAllowRunningAsync(JNIEnv* env, jobject clazz, jlong animatorPtr, jboolean mayRunAsync) {
176f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
177f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck    animator->setAllowRunningAsync(mayRunAsync);
178f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck}
179f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck
180119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic void start(JNIEnv* env, jobject clazz, jlong animatorPtr, jobject finishListener) {
1818d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
18272d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck    animator->setListener(new AnimationListenerBridge(env, finishListener));
1838d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck    animator->start();
1848d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck}
1858d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck
186d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckstatic void end(JNIEnv* env, jobject clazz, jlong animatorPtr) {
18768bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
188d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck    animator->end();
18968bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck}
19068bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck
191496b8770c19c573299e4be525e877acc977a2dadJohn Reck#endif
192496b8770c19c573299e4be525e877acc977a2dadJohn Reck
193e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// ----------------------------------------------------------------------------
194e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// JNI Glue
195e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// ----------------------------------------------------------------------------
196e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
197e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckconst char* const kClassPathName = "android/view/RenderNodeAnimator";
198e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
199e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic JNINativeMethod gMethods[] = {
200496b8770c19c573299e4be525e877acc977a2dadJohn Reck#ifdef USE_OPENGL_RENDERER
201119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    { "nCreateAnimator", "(IF)J", (void*) createAnimator },
202119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    { "nCreateCanvasPropertyFloatAnimator", "(JF)J", (void*) createCanvasPropertyFloatAnimator },
203119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    { "nCreateCanvasPropertyPaintAnimator", "(JIF)J", (void*) createCanvasPropertyPaintAnimator },
204119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    { "nCreateRevealAnimator", "(IIFF)J", (void*) createRevealAnimator },
205c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck    { "nSetStartValue", "(JF)V", (void*) setStartValue },
206ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    { "nSetDuration", "(JJ)V", (void*) setDuration },
207ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    { "nGetDuration", "(J)J", (void*) getDuration },
208ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    { "nSetStartDelay", "(JJ)V", (void*) setStartDelay },
209315c329544d7c593d1072b071cbb92d9afe74021John Reck    { "nSetInterpolator", "(JJ)V", (void*) setInterpolator },
210f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck    { "nSetAllowRunningAsync", "(JZ)V", (void*) setAllowRunningAsync },
211119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    { "nStart", "(JLandroid/view/RenderNodeAnimator;)V", (void*) start },
212d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck    { "nEnd", "(J)V", (void*) end },
213496b8770c19c573299e4be525e877acc977a2dadJohn Reck#endif
214e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
215e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
216e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#define FIND_CLASS(var, className) \
217e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        var = env->FindClass(className); \
218e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        LOG_FATAL_IF(! var, "Unable to find class " className);
219e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
220e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#define GET_STATIC_METHOD_ID(var, clazz, methodName, methodDescriptor) \
221e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        var = env->GetStaticMethodID(clazz, methodName, methodDescriptor); \
222e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        LOG_FATAL_IF(! var, "Unable to find method " methodName);
223e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
224e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckint register_android_view_RenderNodeAnimator(JNIEnv* env) {
22572d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck#ifdef USE_OPENGL_RENDERER
22672d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck    sLifecycleChecker.incStrong(0);
22772d6e4facb1abd81809fdaddbe42f41ad885189cJohn Reck#endif
228e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    FIND_CLASS(gRenderNodeAnimatorClassInfo.clazz, kClassPathName);
229e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    gRenderNodeAnimatorClassInfo.clazz = jclass(env->NewGlobalRef(gRenderNodeAnimatorClassInfo.clazz));
230e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
231e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    GET_STATIC_METHOD_ID(gRenderNodeAnimatorClassInfo.callOnFinished, gRenderNodeAnimatorClassInfo.clazz,
232119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck            "callOnFinished", "(Landroid/view/RenderNodeAnimator;)V");
233e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
234e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
235e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
236e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
237e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
238e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} // namespace android
239