16e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase/*
26e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase * Copyright (C) 2010 The Android Open Source Project
36e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase *
46e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase * Licensed under the Apache License, Version 2.0 (the "License");
56e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase * you may not use this file except in compliance with the License.
66e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase * You may obtain a copy of the License at
76e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase *
86e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase *      http://www.apache.org/licenses/LICENSE-2.0
96e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase *
106e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase * Unless required by applicable law or agreed to in writing, software
116e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase * distributed under the License is distributed on an "AS IS" BASIS,
126e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase * See the License for the specific language governing permissions and
146e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase * limitations under the License.
156e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase */
166e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase
176e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase#include <stdio.h>
186e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase#include <assert.h>
196e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase
206e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase#include "jni.h"
21ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#include "core_jni_helpers.h"
226e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase#include <utils/misc.h>
236e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase
246e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase// ----------------------------------------------------------------------------
256e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase
266e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haasenamespace android {
276e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase
286e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase// ----------------------------------------------------------------------------
296e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase
306e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haaseconst char* const kClassPathName = "android/animation/PropertyValuesHolder";
316e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase
32fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhatstatic jlong android_animation_PropertyValuesHolder_getIntMethod(
336e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase        JNIEnv* env, jclass pvhClass, jclass targetClass, jstring methodName)
346e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase{
356e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase    const char *nativeString = env->GetStringUTFChars(methodName, 0);
366e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase    jmethodID mid = env->GetMethodID(targetClass, nativeString, "(I)V");
376e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase    env->ReleaseStringUTFChars(methodName, nativeString);
38fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    return reinterpret_cast<jlong>(mid);
396e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase}
406e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase
41fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhatstatic jlong android_animation_PropertyValuesHolder_getFloatMethod(
426e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase        JNIEnv* env, jclass pvhClass, jclass targetClass, jstring methodName)
436e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase{
446e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase    const char *nativeString = env->GetStringUTFChars(methodName, 0);
456e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase    jmethodID mid = env->GetMethodID(targetClass, nativeString, "(F)V");
466e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase    env->ReleaseStringUTFChars(methodName, nativeString);
47fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    return reinterpret_cast<jlong>(mid);
486e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase}
496e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase
50fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhatstatic jlong getMultiparameterMethod(JNIEnv* env, jclass targetClass, jstring methodName,
514eed52944c0fcb3afa7369aba60fb5c655580286George Mount    jint parameterCount, char parameterType)
524eed52944c0fcb3afa7369aba60fb5c655580286George Mount{
534eed52944c0fcb3afa7369aba60fb5c655580286George Mount    const char *nativeString = env->GetStringUTFChars(methodName, 0);
544eed52944c0fcb3afa7369aba60fb5c655580286George Mount    char *signature = new char[parameterCount + 4];
554eed52944c0fcb3afa7369aba60fb5c655580286George Mount    signature[0] = '(';
564eed52944c0fcb3afa7369aba60fb5c655580286George Mount    memset(&(signature[1]), parameterType, parameterCount);
574eed52944c0fcb3afa7369aba60fb5c655580286George Mount    strcpy(&(signature[parameterCount + 1]), ")V");
584eed52944c0fcb3afa7369aba60fb5c655580286George Mount    jmethodID mid = env->GetMethodID(targetClass, nativeString, signature);
594eed52944c0fcb3afa7369aba60fb5c655580286George Mount    delete[] signature;
604eed52944c0fcb3afa7369aba60fb5c655580286George Mount    env->ReleaseStringUTFChars(methodName, nativeString);
61fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    return reinterpret_cast<jlong>(mid);
624eed52944c0fcb3afa7369aba60fb5c655580286George Mount}
634eed52944c0fcb3afa7369aba60fb5c655580286George Mount
64fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhatstatic jlong android_animation_PropertyValuesHolder_getMultipleFloatMethod(
654eed52944c0fcb3afa7369aba60fb5c655580286George Mount        JNIEnv* env, jclass pvhClass, jclass targetClass, jstring methodName, jint parameterCount)
664eed52944c0fcb3afa7369aba60fb5c655580286George Mount{
674eed52944c0fcb3afa7369aba60fb5c655580286George Mount    return getMultiparameterMethod(env, targetClass, methodName, parameterCount, 'F');
684eed52944c0fcb3afa7369aba60fb5c655580286George Mount}
694eed52944c0fcb3afa7369aba60fb5c655580286George Mount
70fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhatstatic jlong android_animation_PropertyValuesHolder_getMultipleIntMethod(
714eed52944c0fcb3afa7369aba60fb5c655580286George Mount        JNIEnv* env, jclass pvhClass, jclass targetClass, jstring methodName, jint parameterCount)
724eed52944c0fcb3afa7369aba60fb5c655580286George Mount{
734eed52944c0fcb3afa7369aba60fb5c655580286George Mount    return getMultiparameterMethod(env, targetClass, methodName, parameterCount, 'I');
744eed52944c0fcb3afa7369aba60fb5c655580286George Mount}
754eed52944c0fcb3afa7369aba60fb5c655580286George Mount
766e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haasestatic void android_animation_PropertyValuesHolder_callIntMethod(
77fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat        JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, jint arg)
786e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase{
79fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    env->CallVoidMethod(target, reinterpret_cast<jmethodID>(methodID), arg);
806e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase}
816e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase
826e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haasestatic void android_animation_PropertyValuesHolder_callFloatMethod(
83fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat        JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, jfloat arg)
846e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase{
85fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    env->CallVoidMethod(target, reinterpret_cast<jmethodID>(methodID), arg);
866e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase}
876e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase
884eed52944c0fcb3afa7369aba60fb5c655580286George Mountstatic void android_animation_PropertyValuesHolder_callTwoFloatMethod(
89fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat        JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, float arg1, float arg2)
904eed52944c0fcb3afa7369aba60fb5c655580286George Mount{
91fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    env->CallVoidMethod(target, reinterpret_cast<jmethodID>(methodID), arg1, arg2);
924eed52944c0fcb3afa7369aba60fb5c655580286George Mount}
934eed52944c0fcb3afa7369aba60fb5c655580286George Mount
944eed52944c0fcb3afa7369aba60fb5c655580286George Mountstatic void android_animation_PropertyValuesHolder_callFourFloatMethod(
95fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat        JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, float arg1, float arg2,
964eed52944c0fcb3afa7369aba60fb5c655580286George Mount        float arg3, float arg4)
974eed52944c0fcb3afa7369aba60fb5c655580286George Mount{
98fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    env->CallVoidMethod(target, reinterpret_cast<jmethodID>(methodID), arg1, arg2, arg3, arg4);
994eed52944c0fcb3afa7369aba60fb5c655580286George Mount}
1004eed52944c0fcb3afa7369aba60fb5c655580286George Mount
1014eed52944c0fcb3afa7369aba60fb5c655580286George Mountstatic void android_animation_PropertyValuesHolder_callMultipleFloatMethod(
102fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat        JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, jfloatArray arg)
1034eed52944c0fcb3afa7369aba60fb5c655580286George Mount{
1044eed52944c0fcb3afa7369aba60fb5c655580286George Mount    jsize parameterCount = env->GetArrayLength(arg);
1054eed52944c0fcb3afa7369aba60fb5c655580286George Mount    jfloat *floatValues = env->GetFloatArrayElements(arg, NULL);
1064eed52944c0fcb3afa7369aba60fb5c655580286George Mount    jvalue* values = new jvalue[parameterCount];
1074eed52944c0fcb3afa7369aba60fb5c655580286George Mount    for (int i = 0; i < parameterCount; i++) {
1084eed52944c0fcb3afa7369aba60fb5c655580286George Mount        values[i].f = floatValues[i];
1094eed52944c0fcb3afa7369aba60fb5c655580286George Mount    }
110fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    env->CallVoidMethodA(target, reinterpret_cast<jmethodID>(methodID), values);
1114eed52944c0fcb3afa7369aba60fb5c655580286George Mount    delete[] values;
1124eed52944c0fcb3afa7369aba60fb5c655580286George Mount    env->ReleaseFloatArrayElements(arg, floatValues, JNI_ABORT);
1134eed52944c0fcb3afa7369aba60fb5c655580286George Mount}
1144eed52944c0fcb3afa7369aba60fb5c655580286George Mount
1154eed52944c0fcb3afa7369aba60fb5c655580286George Mountstatic void android_animation_PropertyValuesHolder_callTwoIntMethod(
116fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat        JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, int arg1, int arg2)
1174eed52944c0fcb3afa7369aba60fb5c655580286George Mount{
118fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    env->CallVoidMethod(target, reinterpret_cast<jmethodID>(methodID), arg1, arg2);
1194eed52944c0fcb3afa7369aba60fb5c655580286George Mount}
1204eed52944c0fcb3afa7369aba60fb5c655580286George Mount
1214eed52944c0fcb3afa7369aba60fb5c655580286George Mountstatic void android_animation_PropertyValuesHolder_callFourIntMethod(
122fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat        JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, int arg1, int arg2,
1234eed52944c0fcb3afa7369aba60fb5c655580286George Mount        int arg3, int arg4)
1244eed52944c0fcb3afa7369aba60fb5c655580286George Mount{
125fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    env->CallVoidMethod(target, reinterpret_cast<jmethodID>(methodID), arg1, arg2, arg3, arg4);
1264eed52944c0fcb3afa7369aba60fb5c655580286George Mount}
1274eed52944c0fcb3afa7369aba60fb5c655580286George Mount
1284eed52944c0fcb3afa7369aba60fb5c655580286George Mountstatic void android_animation_PropertyValuesHolder_callMultipleIntMethod(
129fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat        JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, jintArray arg)
1304eed52944c0fcb3afa7369aba60fb5c655580286George Mount{
1314eed52944c0fcb3afa7369aba60fb5c655580286George Mount    jsize parameterCount = env->GetArrayLength(arg);
1324eed52944c0fcb3afa7369aba60fb5c655580286George Mount    jint *intValues = env->GetIntArrayElements(arg, NULL);
1334eed52944c0fcb3afa7369aba60fb5c655580286George Mount    jvalue* values = new jvalue[parameterCount];
1344eed52944c0fcb3afa7369aba60fb5c655580286George Mount    for (int i = 0; i < parameterCount; i++) {
1354eed52944c0fcb3afa7369aba60fb5c655580286George Mount        values[i].i = intValues[i];
1364eed52944c0fcb3afa7369aba60fb5c655580286George Mount    }
137fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    env->CallVoidMethodA(target, reinterpret_cast<jmethodID>(methodID), values);
1384eed52944c0fcb3afa7369aba60fb5c655580286George Mount    delete[] values;
1394eed52944c0fcb3afa7369aba60fb5c655580286George Mount    env->ReleaseIntArrayElements(arg, intValues, JNI_ABORT);
1404eed52944c0fcb3afa7369aba60fb5c655580286George Mount}
1414eed52944c0fcb3afa7369aba60fb5c655580286George Mount
14276f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = {
143fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    {   "nGetIntMethod", "(Ljava/lang/Class;Ljava/lang/String;)J",
1446e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase            (void*)android_animation_PropertyValuesHolder_getIntMethod },
145fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    {   "nGetFloatMethod", "(Ljava/lang/Class;Ljava/lang/String;)J",
1466e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase            (void*)android_animation_PropertyValuesHolder_getFloatMethod },
147fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    {   "nGetMultipleFloatMethod", "(Ljava/lang/Class;Ljava/lang/String;I)J",
1484eed52944c0fcb3afa7369aba60fb5c655580286George Mount            (void*)android_animation_PropertyValuesHolder_getMultipleFloatMethod },
149fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    {   "nGetMultipleIntMethod", "(Ljava/lang/Class;Ljava/lang/String;I)J",
1504eed52944c0fcb3afa7369aba60fb5c655580286George Mount            (void*)android_animation_PropertyValuesHolder_getMultipleIntMethod },
151fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    {   "nCallIntMethod", "(Ljava/lang/Object;JI)V",
1526e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase            (void*)android_animation_PropertyValuesHolder_callIntMethod },
153fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    {   "nCallFloatMethod", "(Ljava/lang/Object;JF)V",
1544eed52944c0fcb3afa7369aba60fb5c655580286George Mount            (void*)android_animation_PropertyValuesHolder_callFloatMethod },
155fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    {   "nCallTwoFloatMethod", "(Ljava/lang/Object;JFF)V",
1564eed52944c0fcb3afa7369aba60fb5c655580286George Mount            (void*)android_animation_PropertyValuesHolder_callTwoFloatMethod },
157fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    {   "nCallFourFloatMethod", "(Ljava/lang/Object;JFFFF)V",
1584eed52944c0fcb3afa7369aba60fb5c655580286George Mount            (void*)android_animation_PropertyValuesHolder_callFourFloatMethod },
159fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    {   "nCallMultipleFloatMethod", "(Ljava/lang/Object;J[F)V",
1604eed52944c0fcb3afa7369aba60fb5c655580286George Mount            (void*)android_animation_PropertyValuesHolder_callMultipleFloatMethod },
161fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    {   "nCallTwoIntMethod", "(Ljava/lang/Object;JII)V",
1624eed52944c0fcb3afa7369aba60fb5c655580286George Mount            (void*)android_animation_PropertyValuesHolder_callTwoIntMethod },
163fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    {   "nCallFourIntMethod", "(Ljava/lang/Object;JIIII)V",
1644eed52944c0fcb3afa7369aba60fb5c655580286George Mount            (void*)android_animation_PropertyValuesHolder_callFourIntMethod },
165fbb35fb39eb74c6fa7ba6804faeaccb80483be14Ashok Bhat    {   "nCallMultipleIntMethod", "(Ljava/lang/Object;J[I)V",
1664eed52944c0fcb3afa7369aba60fb5c655580286George Mount            (void*)android_animation_PropertyValuesHolder_callMultipleIntMethod },
1676e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase};
1686e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase
1696e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haaseint register_android_animation_PropertyValuesHolder(JNIEnv* env)
1706e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase{
171ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
1726e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase}
1736e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase
1746e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase};
175