1766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu/*
2766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * Copyright (C) 2016 The Android Open Source Project
3766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu *
4766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * Licensed under the Apache License, Version 2.0 (the "License");
5766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * you may not use this file except in compliance with the License.
6766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * You may obtain a copy of the License at
7766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu *
8766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu *      http://www.apache.org/licenses/LICENSE-2.0
9766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu *
10766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * Unless required by applicable law or agreed to in writing, software
11766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * distributed under the License is distributed on an "AS IS" BASIS,
12766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * See the License for the specific language governing permissions and
14766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * limitations under the License.
15766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu */
16766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#define LOG_TAG "OpenGLRenderer"
17766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
18766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "jni.h"
19766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "GraphicsJNI.h"
20766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "core_jni_helpers.h"
21766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "log/log.h"
22766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
23766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "Animator.h"
24766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "Interpolator.h"
25766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "PropertyValuesAnimatorSet.h"
26766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "PropertyValuesHolder.h"
27766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "VectorDrawable.h"
28766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
29766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liunamespace android {
30766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuusing namespace uirenderer;
31766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuusing namespace VectorDrawable;
32766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
33766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustatic struct {
34766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    jclass clazz;
35766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    jmethodID callOnFinished;
36766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} gVectorDrawableAnimatorClassInfo;
37766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
38766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustatic JNIEnv* getEnv(JavaVM* vm) {
39766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    JNIEnv* env;
40766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
41766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return 0;
42766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    }
43766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    return env;
44766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
45766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
46c4bb185d41cfb960ed9a3178a4f8974c351abdb0Doris Liustatic AnimationListener* createAnimationListener(JNIEnv* env, jobject finishListener, jint id) {
47766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    class AnimationListenerBridge : public AnimationListener {
48766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    public:
49c4bb185d41cfb960ed9a3178a4f8974c351abdb0Doris Liu        AnimationListenerBridge(JNIEnv* env, jobject finishListener, jint id) {
50766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            mFinishListener = env->NewGlobalRef(finishListener);
51766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            env->GetJavaVM(&mJvm);
52c4bb185d41cfb960ed9a3178a4f8974c351abdb0Doris Liu            mId = id;
53766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        }
54766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
55766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        virtual ~AnimationListenerBridge() {
56766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            if (mFinishListener) {
57766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu                onAnimationFinished(NULL);
58766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            }
59766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        }
60766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
61766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        virtual void onAnimationFinished(BaseRenderNodeAnimator*) {
62766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            LOG_ALWAYS_FATAL_IF(!mFinishListener, "Finished listener twice?");
63766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            JNIEnv* env = getEnv(mJvm);
64766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            env->CallStaticVoidMethod(
65766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu                    gVectorDrawableAnimatorClassInfo.clazz,
66766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu                    gVectorDrawableAnimatorClassInfo.callOnFinished,
67c4bb185d41cfb960ed9a3178a4f8974c351abdb0Doris Liu                    mFinishListener, mId);
68766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            releaseJavaObject();
69766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        }
70766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
71766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    private:
72766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        void releaseJavaObject() {
73766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            JNIEnv* env = getEnv(mJvm);
74766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            env->DeleteGlobalRef(mFinishListener);
75766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            mFinishListener = NULL;
76766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        }
77766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
78766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        JavaVM* mJvm;
79766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        jobject mFinishListener;
80c4bb185d41cfb960ed9a3178a4f8974c351abdb0Doris Liu        jint mId;
81766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    };
82c4bb185d41cfb960ed9a3178a4f8974c351abdb0Doris Liu    return new AnimationListenerBridge(env, finishListener, id);
83766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
84766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
85766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustatic void addAnimator(JNIEnv*, jobject, jlong animatorSetPtr, jlong propertyHolderPtr,
86f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu        jlong interpolatorPtr, jlong startDelay, jlong duration, jint repeatCount,
87f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu        jint repeatMode) {
88766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    PropertyValuesAnimatorSet* set = reinterpret_cast<PropertyValuesAnimatorSet*>(animatorSetPtr);
89766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    PropertyValuesHolder* holder = reinterpret_cast<PropertyValuesHolder*>(propertyHolderPtr);
90766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    Interpolator* interpolator = reinterpret_cast<Interpolator*>(interpolatorPtr);
91f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu    RepeatMode mode = static_cast<RepeatMode>(repeatMode);
92f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu    set->addPropertyAnimator(holder, interpolator, startDelay, duration, repeatCount, mode);
93766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
94766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
95766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustatic jlong createAnimatorSet(JNIEnv*, jobject) {
96766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    PropertyValuesAnimatorSet* animatorSet = new PropertyValuesAnimatorSet();
97766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    return reinterpret_cast<jlong>(animatorSet);
98766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
99766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
100718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liustatic void setVectorDrawableTarget(JNIEnv*, jobject,jlong animatorPtr, jlong vectorDrawablePtr) {
101718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu    VectorDrawable::Tree* tree = reinterpret_cast<VectorDrawable::Tree*>(vectorDrawablePtr);
102718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu    PropertyValuesAnimatorSet* set = reinterpret_cast<PropertyValuesAnimatorSet*>(animatorPtr);
103718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu    set->setVectorDrawable(tree);
104718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu}
105718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu
106766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustatic jlong createGroupPropertyHolder(JNIEnv*, jobject, jlong nativePtr, jint propertyId,
107766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        jfloat startValue, jfloat endValue) {
108766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(nativePtr);
109766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    GroupPropertyValuesHolder* newHolder = new GroupPropertyValuesHolder(group, propertyId,
110766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            startValue, endValue);
111766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    return reinterpret_cast<jlong>(newHolder);
112766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
113766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
114766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustatic jlong createPathDataPropertyHolder(JNIEnv*, jobject, jlong nativePtr, jlong startValuePtr,
115766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        jlong endValuePtr) {
116766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    VectorDrawable::Path* path = reinterpret_cast<VectorDrawable::Path*>(nativePtr);
117766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    PathData* startData = reinterpret_cast<PathData*>(startValuePtr);
118766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    PathData* endData = reinterpret_cast<PathData*>(endValuePtr);
119766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    PathDataPropertyValuesHolder* newHolder = new PathDataPropertyValuesHolder(path,
120766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            startData, endData);
121766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    return reinterpret_cast<jlong>(newHolder);
122766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
123766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
124766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustatic jlong createPathColorPropertyHolder(JNIEnv*, jobject, jlong nativePtr, jint propertyId,
125766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        int startValue, jint endValue) {
126766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(nativePtr);
127766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    FullPathColorPropertyValuesHolder* newHolder = new FullPathColorPropertyValuesHolder(fullPath,
128766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            propertyId, startValue, endValue);
129766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    return reinterpret_cast<jlong>(newHolder);
130766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
131766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
132766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustatic jlong createPathPropertyHolder(JNIEnv*, jobject, jlong nativePtr, jint propertyId,
133766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float startValue, jfloat endValue) {
134766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(nativePtr);
135766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    FullPathPropertyValuesHolder* newHolder = new FullPathPropertyValuesHolder(fullPath,
136766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            propertyId, startValue, endValue);
137766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    return reinterpret_cast<jlong>(newHolder);
138766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
139766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
140766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustatic jlong createRootAlphaPropertyHolder(JNIEnv*, jobject, jlong nativePtr, jfloat startValue,
141766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float endValue) {
142766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    VectorDrawable::Tree* tree = reinterpret_cast<VectorDrawable::Tree*>(nativePtr);
143766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    RootAlphaPropertyValuesHolder* newHolder = new RootAlphaPropertyValuesHolder(tree,
144766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            startValue, endValue);
145766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    return reinterpret_cast<jlong>(newHolder);
146766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
147c9493879d7b38b9d0b5b09aa3760966a3ca33eacDoris Liustatic void setFloatPropertyHolderData(JNIEnv* env, jobject, jlong propertyHolderPtr,
148766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        jfloatArray srcData, jint length) {
149766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    jfloat* propertyData = env->GetFloatArrayElements(srcData, nullptr);
150c9493879d7b38b9d0b5b09aa3760966a3ca33eacDoris Liu    PropertyValuesHolderImpl<float>* holder =
151c9493879d7b38b9d0b5b09aa3760966a3ca33eacDoris Liu            reinterpret_cast<PropertyValuesHolderImpl<float>*>(propertyHolderPtr);
152766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    holder->setPropertyDataSource(propertyData, length);
153766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    env->ReleaseFloatArrayElements(srcData, propertyData, JNI_ABORT);
154766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
155c9493879d7b38b9d0b5b09aa3760966a3ca33eacDoris Liu
156c9493879d7b38b9d0b5b09aa3760966a3ca33eacDoris Liustatic void setIntPropertyHolderData(JNIEnv* env, jobject, jlong propertyHolderPtr,
157c9493879d7b38b9d0b5b09aa3760966a3ca33eacDoris Liu        jintArray srcData, jint length) {
158c9493879d7b38b9d0b5b09aa3760966a3ca33eacDoris Liu    jint* propertyData = env->GetIntArrayElements(srcData, nullptr);
159c9493879d7b38b9d0b5b09aa3760966a3ca33eacDoris Liu    PropertyValuesHolderImpl<int>* holder =
160c9493879d7b38b9d0b5b09aa3760966a3ca33eacDoris Liu            reinterpret_cast<PropertyValuesHolderImpl<int>*>(propertyHolderPtr);
161c9493879d7b38b9d0b5b09aa3760966a3ca33eacDoris Liu    holder->setPropertyDataSource(propertyData, length);
162c9493879d7b38b9d0b5b09aa3760966a3ca33eacDoris Liu    env->ReleaseIntArrayElements(srcData, propertyData, JNI_ABORT);
163c9493879d7b38b9d0b5b09aa3760966a3ca33eacDoris Liu}
164c9493879d7b38b9d0b5b09aa3760966a3ca33eacDoris Liu
165c4bb185d41cfb960ed9a3178a4f8974c351abdb0Doris Liustatic void start(JNIEnv* env, jobject, jlong animatorSetPtr, jobject finishListener, jint id) {
166766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    PropertyValuesAnimatorSet* set = reinterpret_cast<PropertyValuesAnimatorSet*>(animatorSetPtr);
167c4bb185d41cfb960ed9a3178a4f8974c351abdb0Doris Liu    AnimationListener* listener = createAnimationListener(env, finishListener, id);
168766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    set->start(listener);
169766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
170766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
171c4bb185d41cfb960ed9a3178a4f8974c351abdb0Doris Liustatic void reverse(JNIEnv* env, jobject, jlong animatorSetPtr, jobject finishListener, jint id) {
172c4bb185d41cfb960ed9a3178a4f8974c351abdb0Doris Liu    PropertyValuesAnimatorSet* set = reinterpret_cast<PropertyValuesAnimatorSet*>(animatorSetPtr);
173c4bb185d41cfb960ed9a3178a4f8974c351abdb0Doris Liu    AnimationListener* listener = createAnimationListener(env, finishListener, id);
174c4bb185d41cfb960ed9a3178a4f8974c351abdb0Doris Liu    set->reverse(listener);
175766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
176766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
177766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustatic void end(JNIEnv*, jobject, jlong animatorSetPtr) {
178766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    PropertyValuesAnimatorSet* set = reinterpret_cast<PropertyValuesAnimatorSet*>(animatorSetPtr);
179766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    set->end();
180766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
181766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
182766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustatic void reset(JNIEnv*, jobject, jlong animatorSetPtr) {
183766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    PropertyValuesAnimatorSet* set = reinterpret_cast<PropertyValuesAnimatorSet*>(animatorSetPtr);
184766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    set->reset();
185766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
186766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
187766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustatic const JNINativeMethod gMethods[] = {
188766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    {"nCreateAnimatorSet", "()J", (void*)createAnimatorSet},
189718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu    {"nSetVectorDrawableTarget", "(JJ)V", (void*)setVectorDrawableTarget},
190f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu    {"nAddAnimator", "(JJJJJII)V", (void*)addAnimator},
191766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    {"nCreateGroupPropertyHolder", "!(JIFF)J", (void*)createGroupPropertyHolder},
192766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    {"nCreatePathDataPropertyHolder", "!(JJJ)J", (void*)createPathDataPropertyHolder},
193766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    {"nCreatePathColorPropertyHolder", "!(JIII)J", (void*)createPathColorPropertyHolder},
194766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    {"nCreatePathPropertyHolder", "!(JIFF)J", (void*)createPathPropertyHolder},
195766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    {"nCreateRootAlphaPropertyHolder", "!(JFF)J", (void*)createRootAlphaPropertyHolder},
196c9493879d7b38b9d0b5b09aa3760966a3ca33eacDoris Liu    {"nSetPropertyHolderData", "(J[FI)V", (void*)setFloatPropertyHolderData},
197c9493879d7b38b9d0b5b09aa3760966a3ca33eacDoris Liu    {"nSetPropertyHolderData", "(J[II)V", (void*)setIntPropertyHolderData},
19828cfd20f024a56a927014351c8bdf9d8552603e3Doris Liu    {"nStart", "(JLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;I)V", (void*)start},
19928cfd20f024a56a927014351c8bdf9d8552603e3Doris Liu    {"nReverse", "(JLandroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;I)V", (void*)reverse},
200766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    {"nEnd", "!(J)V", (void*)end},
201766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    {"nReset", "!(J)V", (void*)reset},
202766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu};
203766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
20428cfd20f024a56a927014351c8bdf9d8552603e3Doris Liuconst char* const kClassPathName = "android/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT";
205766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuint register_android_graphics_drawable_AnimatedVectorDrawable(JNIEnv* env) {
206766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    gVectorDrawableAnimatorClassInfo.clazz = FindClassOrDie(env, kClassPathName);
207766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    gVectorDrawableAnimatorClassInfo.clazz = MakeGlobalRefOrDie(env,
208766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            gVectorDrawableAnimatorClassInfo.clazz);
209766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
210766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    gVectorDrawableAnimatorClassInfo.callOnFinished = GetStaticMethodIDOrDie(
211766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            env, gVectorDrawableAnimatorClassInfo.clazz, "callOnFinished",
21228cfd20f024a56a927014351c8bdf9d8552603e3Doris Liu            "(Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;I)V");
213766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    return RegisterMethodsOrDie(env, "android/graphics/drawable/AnimatedVectorDrawable",
214766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            gMethods, NELEM(gMethods));
215766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
216766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
217766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}; // namespace android
218