/*
|
* Copyright (C) 2010 The Android Open Source Project
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*/
|
|
#include <stdio.h>
|
#include <assert.h>
|
|
#include "jni.h"
|
#include "core_jni_helpers.h"
|
#include <utils/misc.h>
|
|
// ----------------------------------------------------------------------------
|
|
namespace android {
|
|
// ----------------------------------------------------------------------------
|
|
const char* const kClassPathName = "android/animation/PropertyValuesHolder";
|
|
static jlong android_animation_PropertyValuesHolder_getIntMethod(
|
JNIEnv* env, jclass pvhClass, jclass targetClass, jstring methodName)
|
{
|
const char *nativeString = env->GetStringUTFChars(methodName, 0);
|
jmethodID mid = env->GetMethodID(targetClass, nativeString, "(I)V");
|
env->ReleaseStringUTFChars(methodName, nativeString);
|
return reinterpret_cast<jlong>(mid);
|
}
|
|
static jlong android_animation_PropertyValuesHolder_getFloatMethod(
|
JNIEnv* env, jclass pvhClass, jclass targetClass, jstring methodName)
|
{
|
const char *nativeString = env->GetStringUTFChars(methodName, 0);
|
jmethodID mid = env->GetMethodID(targetClass, nativeString, "(F)V");
|
env->ReleaseStringUTFChars(methodName, nativeString);
|
return reinterpret_cast<jlong>(mid);
|
}
|
|
static jlong getMultiparameterMethod(JNIEnv* env, jclass targetClass, jstring methodName,
|
jint parameterCount, char parameterType)
|
{
|
const char *nativeString = env->GetStringUTFChars(methodName, 0);
|
char *signature = new char[parameterCount + 4];
|
signature[0] = '(';
|
memset(&(signature[1]), parameterType, parameterCount);
|
strcpy(&(signature[parameterCount + 1]), ")V");
|
jmethodID mid = env->GetMethodID(targetClass, nativeString, signature);
|
delete[] signature;
|
env->ReleaseStringUTFChars(methodName, nativeString);
|
return reinterpret_cast<jlong>(mid);
|
}
|
|
static jlong android_animation_PropertyValuesHolder_getMultipleFloatMethod(
|
JNIEnv* env, jclass pvhClass, jclass targetClass, jstring methodName, jint parameterCount)
|
{
|
return getMultiparameterMethod(env, targetClass, methodName, parameterCount, 'F');
|
}
|
|
static jlong android_animation_PropertyValuesHolder_getMultipleIntMethod(
|
JNIEnv* env, jclass pvhClass, jclass targetClass, jstring methodName, jint parameterCount)
|
{
|
return getMultiparameterMethod(env, targetClass, methodName, parameterCount, 'I');
|
}
|
|
static void android_animation_PropertyValuesHolder_callIntMethod(
|
JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, jint arg)
|
{
|
env->CallVoidMethod(target, reinterpret_cast<jmethodID>(methodID), arg);
|
}
|
|
static void android_animation_PropertyValuesHolder_callFloatMethod(
|
JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, jfloat arg)
|
{
|
env->CallVoidMethod(target, reinterpret_cast<jmethodID>(methodID), arg);
|
}
|
|
static void android_animation_PropertyValuesHolder_callTwoFloatMethod(
|
JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, float arg1, float arg2)
|
{
|
env->CallVoidMethod(target, reinterpret_cast<jmethodID>(methodID), arg1, arg2);
|
}
|
|
static void android_animation_PropertyValuesHolder_callFourFloatMethod(
|
JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, float arg1, float arg2,
|
float arg3, float arg4)
|
{
|
env->CallVoidMethod(target, reinterpret_cast<jmethodID>(methodID), arg1, arg2, arg3, arg4);
|
}
|
|
static void android_animation_PropertyValuesHolder_callMultipleFloatMethod(
|
JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, jfloatArray arg)
|
{
|
jsize parameterCount = env->GetArrayLength(arg);
|
jfloat *floatValues = env->GetFloatArrayElements(arg, NULL);
|
jvalue* values = new jvalue[parameterCount];
|
for (int i = 0; i < parameterCount; i++) {
|
values[i].f = floatValues[i];
|
}
|
env->CallVoidMethodA(target, reinterpret_cast<jmethodID>(methodID), values);
|
delete[] values;
|
env->ReleaseFloatArrayElements(arg, floatValues, JNI_ABORT);
|
}
|
|
static void android_animation_PropertyValuesHolder_callTwoIntMethod(
|
JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, int arg1, int arg2)
|
{
|
env->CallVoidMethod(target, reinterpret_cast<jmethodID>(methodID), arg1, arg2);
|
}
|
|
static void android_animation_PropertyValuesHolder_callFourIntMethod(
|
JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, int arg1, int arg2,
|
int arg3, int arg4)
|
{
|
env->CallVoidMethod(target, reinterpret_cast<jmethodID>(methodID), arg1, arg2, arg3, arg4);
|
}
|
|
static void android_animation_PropertyValuesHolder_callMultipleIntMethod(
|
JNIEnv* env, jclass pvhObject, jobject target, jlong methodID, jintArray arg)
|
{
|
jsize parameterCount = env->GetArrayLength(arg);
|
jint *intValues = env->GetIntArrayElements(arg, NULL);
|
jvalue* values = new jvalue[parameterCount];
|
for (int i = 0; i < parameterCount; i++) {
|
values[i].i = intValues[i];
|
}
|
env->CallVoidMethodA(target, reinterpret_cast<jmethodID>(methodID), values);
|
delete[] values;
|
env->ReleaseIntArrayElements(arg, intValues, JNI_ABORT);
|
}
|
|
static const JNINativeMethod gMethods[] = {
|
{ "nGetIntMethod", "(Ljava/lang/Class;Ljava/lang/String;)J",
|
(void*)android_animation_PropertyValuesHolder_getIntMethod },
|
{ "nGetFloatMethod", "(Ljava/lang/Class;Ljava/lang/String;)J",
|
(void*)android_animation_PropertyValuesHolder_getFloatMethod },
|
{ "nGetMultipleFloatMethod", "(Ljava/lang/Class;Ljava/lang/String;I)J",
|
(void*)android_animation_PropertyValuesHolder_getMultipleFloatMethod },
|
{ "nGetMultipleIntMethod", "(Ljava/lang/Class;Ljava/lang/String;I)J",
|
(void*)android_animation_PropertyValuesHolder_getMultipleIntMethod },
|
{ "nCallIntMethod", "(Ljava/lang/Object;JI)V",
|
(void*)android_animation_PropertyValuesHolder_callIntMethod },
|
{ "nCallFloatMethod", "(Ljava/lang/Object;JF)V",
|
(void*)android_animation_PropertyValuesHolder_callFloatMethod },
|
{ "nCallTwoFloatMethod", "(Ljava/lang/Object;JFF)V",
|
(void*)android_animation_PropertyValuesHolder_callTwoFloatMethod },
|
{ "nCallFourFloatMethod", "(Ljava/lang/Object;JFFFF)V",
|
(void*)android_animation_PropertyValuesHolder_callFourFloatMethod },
|
{ "nCallMultipleFloatMethod", "(Ljava/lang/Object;J[F)V",
|
(void*)android_animation_PropertyValuesHolder_callMultipleFloatMethod },
|
{ "nCallTwoIntMethod", "(Ljava/lang/Object;JII)V",
|
(void*)android_animation_PropertyValuesHolder_callTwoIntMethod },
|
{ "nCallFourIntMethod", "(Ljava/lang/Object;JIIII)V",
|
(void*)android_animation_PropertyValuesHolder_callFourIntMethod },
|
{ "nCallMultipleIntMethod", "(Ljava/lang/Object;J[I)V",
|
(void*)android_animation_PropertyValuesHolder_callMultipleIntMethod },
|
};
|
|
int register_android_animation_PropertyValuesHolder(JNIEnv* env)
|
{
|
return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
|
}
|
|
};
|