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