com_android_server_input_InputApplicationHandle.cpp revision 9302c8796fc4dcda08d4bd1e11733848fd4fafaf
1928e054931d357326613c78e62f4d850b7c442ffJeff Brown/* 2928e054931d357326613c78e62f4d850b7c442ffJeff Brown * Copyright (C) 2011 The Android Open Source Project 3928e054931d357326613c78e62f4d850b7c442ffJeff Brown * 4928e054931d357326613c78e62f4d850b7c442ffJeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 5928e054931d357326613c78e62f4d850b7c442ffJeff Brown * you may not use this file except in compliance with the License. 6928e054931d357326613c78e62f4d850b7c442ffJeff Brown * You may obtain a copy of the License at 7928e054931d357326613c78e62f4d850b7c442ffJeff Brown * 8928e054931d357326613c78e62f4d850b7c442ffJeff Brown * http://www.apache.org/licenses/LICENSE-2.0 9928e054931d357326613c78e62f4d850b7c442ffJeff Brown * 10928e054931d357326613c78e62f4d850b7c442ffJeff Brown * Unless required by applicable law or agreed to in writing, software 11928e054931d357326613c78e62f4d850b7c442ffJeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 12928e054931d357326613c78e62f4d850b7c442ffJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13928e054931d357326613c78e62f4d850b7c442ffJeff Brown * See the License for the specific language governing permissions and 14928e054931d357326613c78e62f4d850b7c442ffJeff Brown * limitations under the License. 15928e054931d357326613c78e62f4d850b7c442ffJeff Brown */ 16928e054931d357326613c78e62f4d850b7c442ffJeff Brown 17928e054931d357326613c78e62f4d850b7c442ffJeff Brown#define LOG_TAG "InputApplicationHandle" 18928e054931d357326613c78e62f4d850b7c442ffJeff Brown 19928e054931d357326613c78e62f4d850b7c442ffJeff Brown#include "JNIHelp.h" 20928e054931d357326613c78e62f4d850b7c442ffJeff Brown#include "jni.h" 21928e054931d357326613c78e62f4d850b7c442ffJeff Brown#include <android_runtime/AndroidRuntime.h> 22928e054931d357326613c78e62f4d850b7c442ffJeff Brown#include <utils/threads.h> 23928e054931d357326613c78e62f4d850b7c442ffJeff Brown 24928e054931d357326613c78e62f4d850b7c442ffJeff Brown#include "com_android_server_InputApplicationHandle.h" 25928e054931d357326613c78e62f4d850b7c442ffJeff Brown 26928e054931d357326613c78e62f4d850b7c442ffJeff Brownnamespace android { 27928e054931d357326613c78e62f4d850b7c442ffJeff Brown 28928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic struct { 29928e054931d357326613c78e62f4d850b7c442ffJeff Brown jfieldID ptr; 309302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown jfieldID name; 319302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown jfieldID dispatchingTimeoutNanos; 32928e054931d357326613c78e62f4d850b7c442ffJeff Brown} gInputApplicationHandleClassInfo; 33928e054931d357326613c78e62f4d850b7c442ffJeff Brown 34928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic Mutex gHandleMutex; 35928e054931d357326613c78e62f4d850b7c442ffJeff Brown 36928e054931d357326613c78e62f4d850b7c442ffJeff Brown 37928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- NativeInputApplicationHandle --- 38928e054931d357326613c78e62f4d850b7c442ffJeff Brown 39928e054931d357326613c78e62f4d850b7c442ffJeff BrownNativeInputApplicationHandle::NativeInputApplicationHandle(jweak objWeak) : 40928e054931d357326613c78e62f4d850b7c442ffJeff Brown mObjWeak(objWeak) { 41928e054931d357326613c78e62f4d850b7c442ffJeff Brown} 42928e054931d357326613c78e62f4d850b7c442ffJeff Brown 43928e054931d357326613c78e62f4d850b7c442ffJeff BrownNativeInputApplicationHandle::~NativeInputApplicationHandle() { 44928e054931d357326613c78e62f4d850b7c442ffJeff Brown JNIEnv* env = AndroidRuntime::getJNIEnv(); 45928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->DeleteWeakGlobalRef(mObjWeak); 46928e054931d357326613c78e62f4d850b7c442ffJeff Brown} 47928e054931d357326613c78e62f4d850b7c442ffJeff Brown 48928e054931d357326613c78e62f4d850b7c442ffJeff Brownjobject NativeInputApplicationHandle::getInputApplicationHandleObjLocalRef(JNIEnv* env) { 49928e054931d357326613c78e62f4d850b7c442ffJeff Brown return env->NewLocalRef(mObjWeak); 50928e054931d357326613c78e62f4d850b7c442ffJeff Brown} 51928e054931d357326613c78e62f4d850b7c442ffJeff Brown 529302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownbool NativeInputApplicationHandle::update() { 539302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown JNIEnv* env = AndroidRuntime::getJNIEnv(); 549302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown jobject obj = env->NewLocalRef(mObjWeak); 559302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (!obj) { 569302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown return false; 579302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 589302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 599302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown jstring nameObj = jstring(env->GetObjectField(obj, 609302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown gInputApplicationHandleClassInfo.name)); 619302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (nameObj) { 629302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown const char* nameStr = env->GetStringUTFChars(nameObj, NULL); 639302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown name.setTo(nameStr); 649302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown env->ReleaseStringUTFChars(nameObj, nameStr); 659302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown env->DeleteLocalRef(nameObj); 669302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } else { 679302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown name.setTo("<null>"); 689302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 699302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 709302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown dispatchingTimeout = env->GetLongField(obj, 719302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown gInputApplicationHandleClassInfo.dispatchingTimeoutNanos); 729302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 739302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown env->DeleteLocalRef(obj); 749302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown return true; 759302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown} 769302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 77928e054931d357326613c78e62f4d850b7c442ffJeff Brown 78928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- Global functions --- 79928e054931d357326613c78e62f4d850b7c442ffJeff Brown 80928e054931d357326613c78e62f4d850b7c442ffJeff Brownsp<InputApplicationHandle> android_server_InputApplicationHandle_getHandle( 81928e054931d357326613c78e62f4d850b7c442ffJeff Brown JNIEnv* env, jobject inputApplicationHandleObj) { 82928e054931d357326613c78e62f4d850b7c442ffJeff Brown if (!inputApplicationHandleObj) { 83928e054931d357326613c78e62f4d850b7c442ffJeff Brown return NULL; 84928e054931d357326613c78e62f4d850b7c442ffJeff Brown } 85928e054931d357326613c78e62f4d850b7c442ffJeff Brown 86928e054931d357326613c78e62f4d850b7c442ffJeff Brown AutoMutex _l(gHandleMutex); 87928e054931d357326613c78e62f4d850b7c442ffJeff Brown 88928e054931d357326613c78e62f4d850b7c442ffJeff Brown int ptr = env->GetIntField(inputApplicationHandleObj, gInputApplicationHandleClassInfo.ptr); 89928e054931d357326613c78e62f4d850b7c442ffJeff Brown NativeInputApplicationHandle* handle; 90928e054931d357326613c78e62f4d850b7c442ffJeff Brown if (ptr) { 91928e054931d357326613c78e62f4d850b7c442ffJeff Brown handle = reinterpret_cast<NativeInputApplicationHandle*>(ptr); 92928e054931d357326613c78e62f4d850b7c442ffJeff Brown } else { 93928e054931d357326613c78e62f4d850b7c442ffJeff Brown jweak objWeak = env->NewWeakGlobalRef(inputApplicationHandleObj); 94928e054931d357326613c78e62f4d850b7c442ffJeff Brown handle = new NativeInputApplicationHandle(objWeak); 95928e054931d357326613c78e62f4d850b7c442ffJeff Brown handle->incStrong(inputApplicationHandleObj); 96928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->SetIntField(inputApplicationHandleObj, gInputApplicationHandleClassInfo.ptr, 97928e054931d357326613c78e62f4d850b7c442ffJeff Brown reinterpret_cast<int>(handle)); 98928e054931d357326613c78e62f4d850b7c442ffJeff Brown } 99928e054931d357326613c78e62f4d850b7c442ffJeff Brown return handle; 100928e054931d357326613c78e62f4d850b7c442ffJeff Brown} 101928e054931d357326613c78e62f4d850b7c442ffJeff Brown 102928e054931d357326613c78e62f4d850b7c442ffJeff Brown 103928e054931d357326613c78e62f4d850b7c442ffJeff Brown// --- JNI --- 104928e054931d357326613c78e62f4d850b7c442ffJeff Brown 105928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic void android_server_InputApplicationHandle_nativeDispose(JNIEnv* env, jobject obj) { 106928e054931d357326613c78e62f4d850b7c442ffJeff Brown AutoMutex _l(gHandleMutex); 107928e054931d357326613c78e62f4d850b7c442ffJeff Brown 108928e054931d357326613c78e62f4d850b7c442ffJeff Brown int ptr = env->GetIntField(obj, gInputApplicationHandleClassInfo.ptr); 109928e054931d357326613c78e62f4d850b7c442ffJeff Brown if (ptr) { 110928e054931d357326613c78e62f4d850b7c442ffJeff Brown env->SetIntField(obj, gInputApplicationHandleClassInfo.ptr, 0); 111928e054931d357326613c78e62f4d850b7c442ffJeff Brown 112928e054931d357326613c78e62f4d850b7c442ffJeff Brown NativeInputApplicationHandle* handle = reinterpret_cast<NativeInputApplicationHandle*>(ptr); 113928e054931d357326613c78e62f4d850b7c442ffJeff Brown handle->decStrong(obj); 114928e054931d357326613c78e62f4d850b7c442ffJeff Brown } 115928e054931d357326613c78e62f4d850b7c442ffJeff Brown} 116928e054931d357326613c78e62f4d850b7c442ffJeff Brown 117928e054931d357326613c78e62f4d850b7c442ffJeff Brown 118928e054931d357326613c78e62f4d850b7c442ffJeff Brownstatic JNINativeMethod gInputApplicationHandleMethods[] = { 119928e054931d357326613c78e62f4d850b7c442ffJeff Brown /* name, signature, funcPtr */ 120928e054931d357326613c78e62f4d850b7c442ffJeff Brown { "nativeDispose", "()V", 121928e054931d357326613c78e62f4d850b7c442ffJeff Brown (void*) android_server_InputApplicationHandle_nativeDispose }, 122928e054931d357326613c78e62f4d850b7c442ffJeff Brown}; 123928e054931d357326613c78e62f4d850b7c442ffJeff Brown 124928e054931d357326613c78e62f4d850b7c442ffJeff Brown#define FIND_CLASS(var, className) \ 125928e054931d357326613c78e62f4d850b7c442ffJeff Brown var = env->FindClass(className); \ 12617cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro LOG_FATAL_IF(! var, "Unable to find class " className); 127928e054931d357326613c78e62f4d850b7c442ffJeff Brown 128928e054931d357326613c78e62f4d850b7c442ffJeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 129928e054931d357326613c78e62f4d850b7c442ffJeff Brown var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 130928e054931d357326613c78e62f4d850b7c442ffJeff Brown LOG_FATAL_IF(! var, "Unable to find field " fieldName); 131928e054931d357326613c78e62f4d850b7c442ffJeff Brown 132928e054931d357326613c78e62f4d850b7c442ffJeff Brownint register_android_server_InputApplicationHandle(JNIEnv* env) { 133a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn int res = jniRegisterNativeMethods(env, "com/android/server/wm/InputApplicationHandle", 134928e054931d357326613c78e62f4d850b7c442ffJeff Brown gInputApplicationHandleMethods, NELEM(gInputApplicationHandleMethods)); 135928e054931d357326613c78e62f4d850b7c442ffJeff Brown LOG_FATAL_IF(res < 0, "Unable to register native methods."); 136928e054931d357326613c78e62f4d850b7c442ffJeff Brown 13717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro jclass clazz; 13817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro FIND_CLASS(clazz, "com/android/server/wm/InputApplicationHandle"); 139928e054931d357326613c78e62f4d850b7c442ffJeff Brown 14017cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_FIELD_ID(gInputApplicationHandleClassInfo.ptr, clazz, 141928e054931d357326613c78e62f4d850b7c442ffJeff Brown "ptr", "I"); 142928e054931d357326613c78e62f4d850b7c442ffJeff Brown 1439302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown GET_FIELD_ID(gInputApplicationHandleClassInfo.name, clazz, 1449302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown "name", "Ljava/lang/String;"); 1459302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 1469302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown GET_FIELD_ID(gInputApplicationHandleClassInfo.dispatchingTimeoutNanos, 1479302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown clazz, 1489302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown "dispatchingTimeoutNanos", "J"); 1499302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 150928e054931d357326613c78e62f4d850b7c442ffJeff Brown return 0; 151928e054931d357326613c78e62f4d850b7c442ffJeff Brown} 152928e054931d357326613c78e62f4d850b7c442ffJeff Brown 153928e054931d357326613c78e62f4d850b7c442ffJeff Brown} /* namespace android */ 154