android_view_RenderNodeAnimator.cpp revision 987f79f60bb1f0a4bcd3ef22e57301c743f0b94f
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
28987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h"
29987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
30e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace android {
31e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
32e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckusing namespace uirenderer;
33e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
34e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic struct {
35e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    jclass clazz;
36e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
37e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    jmethodID callOnFinished;
38e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} gRenderNodeAnimatorClassInfo;
39e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
40496b8770c19c573299e4be525e877acc977a2dadJohn Reck#ifdef USE_OPENGL_RENDERER
41496b8770c19c573299e4be525e877acc977a2dadJohn Reck
42e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic JNIEnv* getEnv(JavaVM* vm) {
43e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    JNIEnv* env;
44e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
45e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        return 0;
46e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
47e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return env;
48e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
49e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
5052244fff29042926e21fa897ef5ab11148e35299John Reckclass AnimationListenerBridge : public AnimationListener {
5152244fff29042926e21fa897ef5ab11148e35299John Reckpublic:
5252244fff29042926e21fa897ef5ab11148e35299John Reck    // This holds a strong reference to a Java WeakReference<T> object. This avoids
5352244fff29042926e21fa897ef5ab11148e35299John Reck    // cyclic-references-of-doom. If you think "I know, just use NewWeakGlobalRef!"
5452244fff29042926e21fa897ef5ab11148e35299John Reck    // then you end up with basically a PhantomReference, which is totally not
5552244fff29042926e21fa897ef5ab11148e35299John Reck    // what we want.
56119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    AnimationListenerBridge(JNIEnv* env, jobject finishListener) {
57119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mFinishListener = env->NewGlobalRef(finishListener);
5852244fff29042926e21fa897ef5ab11148e35299John Reck        env->GetJavaVM(&mJvm);
5952244fff29042926e21fa897ef5ab11148e35299John Reck    }
60e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
6152244fff29042926e21fa897ef5ab11148e35299John Reck    virtual ~AnimationListenerBridge() {
62119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        if (mFinishListener) {
63119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck            onAnimationFinished(NULL);
64119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        }
6552244fff29042926e21fa897ef5ab11148e35299John Reck    }
66e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
67ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    virtual void onAnimationFinished(BaseRenderNodeAnimator*) {
68119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        LOG_ALWAYS_FATAL_IF(!mFinishListener, "Finished listener twice?");
6952244fff29042926e21fa897ef5ab11148e35299John Reck        JNIEnv* env = getEnv(mJvm);
7052244fff29042926e21fa897ef5ab11148e35299John Reck        env->CallStaticVoidMethod(
7152244fff29042926e21fa897ef5ab11148e35299John Reck                gRenderNodeAnimatorClassInfo.clazz,
7252244fff29042926e21fa897ef5ab11148e35299John Reck                gRenderNodeAnimatorClassInfo.callOnFinished,
73119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck                mFinishListener);
74119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        releaseJavaObject();
7552244fff29042926e21fa897ef5ab11148e35299John Reck    }
76e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
7752244fff29042926e21fa897ef5ab11148e35299John Reckprivate:
78119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    void releaseJavaObject() {
79119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        JNIEnv* env = getEnv(mJvm);
80119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        env->DeleteGlobalRef(mFinishListener);
81119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mFinishListener = NULL;
82119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
83119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
8452244fff29042926e21fa897ef5ab11148e35299John Reck    JavaVM* mJvm;
85119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    jobject mFinishListener;
8652244fff29042926e21fa897ef5ab11148e35299John Reck};
8752244fff29042926e21fa897ef5ab11148e35299John Reck
8852244fff29042926e21fa897ef5ab11148e35299John Reckstatic inline RenderPropertyAnimator::RenderProperty toRenderProperty(jint property) {
8952244fff29042926e21fa897ef5ab11148e35299John Reck    LOG_ALWAYS_FATAL_IF(property < 0 || property > RenderPropertyAnimator::ALPHA,
90e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck            "Invalid property %d", property);
9152244fff29042926e21fa897ef5ab11148e35299John Reck    return static_cast<RenderPropertyAnimator::RenderProperty>(property);
9252244fff29042926e21fa897ef5ab11148e35299John Reck}
9352244fff29042926e21fa897ef5ab11148e35299John Reck
9452244fff29042926e21fa897ef5ab11148e35299John Reckstatic inline CanvasPropertyPaintAnimator::PaintField toPaintField(jint field) {
9552244fff29042926e21fa897ef5ab11148e35299John Reck    LOG_ALWAYS_FATAL_IF(field < 0
9652244fff29042926e21fa897ef5ab11148e35299John Reck            || field > CanvasPropertyPaintAnimator::ALPHA,
9752244fff29042926e21fa897ef5ab11148e35299John Reck            "Invalid paint field %d", field);
9852244fff29042926e21fa897ef5ab11148e35299John Reck    return static_cast<CanvasPropertyPaintAnimator::PaintField>(field);
9952244fff29042926e21fa897ef5ab11148e35299John Reck}
10052244fff29042926e21fa897ef5ab11148e35299John Reck
101119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic jlong createAnimator(JNIEnv* env, jobject clazz,
102ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        jint propertyRaw, jfloat finalValue) {
10352244fff29042926e21fa897ef5ab11148e35299John Reck    RenderPropertyAnimator::RenderProperty property = toRenderProperty(propertyRaw);
104ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    BaseRenderNodeAnimator* animator = new RenderPropertyAnimator(property, finalValue);
10552244fff29042926e21fa897ef5ab11148e35299John Reck    return reinterpret_cast<jlong>( animator );
10652244fff29042926e21fa897ef5ab11148e35299John Reck}
10752244fff29042926e21fa897ef5ab11148e35299John Reck
10852244fff29042926e21fa897ef5ab11148e35299John Reckstatic jlong createCanvasPropertyFloatAnimator(JNIEnv* env, jobject clazz,
109119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        jlong canvasPropertyPtr, jfloat finalValue) {
11052244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPrimitive* canvasProperty = reinterpret_cast<CanvasPropertyPrimitive*>(canvasPropertyPtr);
111ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    BaseRenderNodeAnimator* animator = new CanvasPropertyPrimitiveAnimator(canvasProperty, finalValue);
11252244fff29042926e21fa897ef5ab11148e35299John Reck    return reinterpret_cast<jlong>( animator );
11352244fff29042926e21fa897ef5ab11148e35299John Reck}
114e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
11552244fff29042926e21fa897ef5ab11148e35299John Reckstatic jlong createCanvasPropertyPaintAnimator(JNIEnv* env, jobject clazz,
116119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        jlong canvasPropertyPtr, jint paintFieldRaw,
117ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        jfloat finalValue) {
11852244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPaint* canvasProperty = reinterpret_cast<CanvasPropertyPaint*>(canvasPropertyPtr);
11952244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPaintAnimator::PaintField paintField = toPaintField(paintFieldRaw);
120ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    BaseRenderNodeAnimator* animator = new CanvasPropertyPaintAnimator(
121ff941dcd815021bb20d6504eb486acb1e50592c3John Reck            canvasProperty, paintField, finalValue);
122e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return reinterpret_cast<jlong>( animator );
123e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
124e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
125119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic jlong createRevealAnimator(JNIEnv* env, jobject clazz,
126af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik        jint centerX, jint centerY, jfloat startRadius, jfloat endRadius) {
127af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik    BaseRenderNodeAnimator* animator = new RevealAnimator(centerX, centerY, startRadius, endRadius);
128d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck    return reinterpret_cast<jlong>( animator );
129d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck}
130d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck
131c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reckstatic void setStartValue(JNIEnv* env, jobject clazz, jlong animatorPtr, jfloat startValue) {
132c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
133c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck    animator->setStartValue(startValue);
134c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck}
135c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck
136ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverettestatic void setDuration(JNIEnv* env, jobject clazz, jlong animatorPtr, jlong duration) {
137e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    LOG_ALWAYS_FATAL_IF(duration < 0, "Duration cannot be negative");
138ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
139e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    animator->setDuration(duration);
140e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
141e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
142ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverettestatic jlong getDuration(JNIEnv* env, jobject clazz, jlong animatorPtr) {
143ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
144ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    return static_cast<jlong>(animator->duration());
145ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette}
146ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette
147ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverettestatic void setStartDelay(JNIEnv* env, jobject clazz, jlong animatorPtr, jlong startDelay) {
148ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    LOG_ALWAYS_FATAL_IF(startDelay < 0, "Start delay cannot be negative");
149ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
150ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    animator->setStartDelay(startDelay);
151ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette}
152ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette
153315c329544d7c593d1072b071cbb92d9afe74021John Reckstatic void setInterpolator(JNIEnv* env, jobject clazz, jlong animatorPtr, jlong interpolatorPtr) {
154ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
155315c329544d7c593d1072b071cbb92d9afe74021John Reck    Interpolator* interpolator = reinterpret_cast<Interpolator*>(interpolatorPtr);
156315c329544d7c593d1072b071cbb92d9afe74021John Reck    animator->setInterpolator(interpolator);
157315c329544d7c593d1072b071cbb92d9afe74021John Reck}
158315c329544d7c593d1072b071cbb92d9afe74021John Reck
159f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reckstatic void setAllowRunningAsync(JNIEnv* env, jobject clazz, jlong animatorPtr, jboolean mayRunAsync) {
160f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
161f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck    animator->setAllowRunningAsync(mayRunAsync);
162f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck}
163f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck
164119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic void start(JNIEnv* env, jobject clazz, jlong animatorPtr, jobject finishListener) {
1658d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
166119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    if (finishListener) {
167119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        animator->setListener(new AnimationListenerBridge(env, finishListener));
168119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
1698d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck    animator->start();
1708d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck}
1718d8af3c1b768d590754d657a7d1242dcb462454bJohn Reck
172d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckstatic void end(JNIEnv* env, jobject clazz, jlong animatorPtr) {
17368bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
174d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck    animator->end();
17568bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck}
17668bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck
177496b8770c19c573299e4be525e877acc977a2dadJohn Reck#endif
178496b8770c19c573299e4be525e877acc977a2dadJohn Reck
179e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// ----------------------------------------------------------------------------
180e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// JNI Glue
181e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// ----------------------------------------------------------------------------
182e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
183e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckconst char* const kClassPathName = "android/view/RenderNodeAnimator";
184e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
185e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic JNINativeMethod gMethods[] = {
186496b8770c19c573299e4be525e877acc977a2dadJohn Reck#ifdef USE_OPENGL_RENDERER
187119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    { "nCreateAnimator", "(IF)J", (void*) createAnimator },
188119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    { "nCreateCanvasPropertyFloatAnimator", "(JF)J", (void*) createCanvasPropertyFloatAnimator },
189119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    { "nCreateCanvasPropertyPaintAnimator", "(JIF)J", (void*) createCanvasPropertyPaintAnimator },
190119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    { "nCreateRevealAnimator", "(IIFF)J", (void*) createRevealAnimator },
191c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck    { "nSetStartValue", "(JF)V", (void*) setStartValue },
192ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    { "nSetDuration", "(JJ)V", (void*) setDuration },
193ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    { "nGetDuration", "(J)J", (void*) getDuration },
194ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    { "nSetStartDelay", "(JJ)V", (void*) setStartDelay },
195315c329544d7c593d1072b071cbb92d9afe74021John Reck    { "nSetInterpolator", "(JJ)V", (void*) setInterpolator },
196f5945a0c8bb868f978d9d0d22043a8b44464a86eJohn Reck    { "nSetAllowRunningAsync", "(JZ)V", (void*) setAllowRunningAsync },
197119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    { "nStart", "(JLandroid/view/RenderNodeAnimator;)V", (void*) start },
198d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck    { "nEnd", "(J)V", (void*) end },
199496b8770c19c573299e4be525e877acc977a2dadJohn Reck#endif
200e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
201e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
202e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckint register_android_view_RenderNodeAnimator(JNIEnv* env) {
203987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gRenderNodeAnimatorClassInfo.clazz = FindClassOrDie(env, kClassPathName);
204987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gRenderNodeAnimatorClassInfo.clazz = MakeGlobalRefOrDie(env,
205987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe                                                            gRenderNodeAnimatorClassInfo.clazz);
206e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
207987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gRenderNodeAnimatorClassInfo.callOnFinished = GetStaticMethodIDOrDie(
208987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe            env, gRenderNodeAnimatorClassInfo.clazz, "callOnFinished",
209987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe            "(Landroid/view/RenderNodeAnimator;)V");
210e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
211987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
212e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
213e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
214e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
215e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} // namespace android
216