android_view_InputChannel.cpp revision 46b9ac0ae2162309774a7478cd9d4e578747bfc2
146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/* 246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Copyright (C) 2010 The Android Open Source Project 346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * you may not use this file except in compliance with the License. 646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * You may obtain a copy of the License at 746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 1046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Unless required by applicable law or agreed to in writing, software 1146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 1246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * See the License for the specific language governing permissions and 1446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * limitations under the License. 1546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 1646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define LOG_TAG "InputChannel-JNI" 1846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include "JNIHelp.h" 2046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <android_runtime/AndroidRuntime.h> 2246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <binder/Parcel.h> 2346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/Log.h> 2446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <ui/InputTransport.h> 2546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include "android_view_InputChannel.h" 2646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include "android_util_Binder.h" 2746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android { 2946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ---------------------------------------------------------------------------- 3146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic struct { 3346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jclass clazz; 3446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jfieldID mPtr; // native object attached to the DVM InputChannel 3646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jmethodID ctor; 3746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} gInputChannelClassInfo; 3846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ---------------------------------------------------------------------------- 4046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 4146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass NativeInputChannel { 4246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic: 4346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown NativeInputChannel(const sp<InputChannel>& inputChannel); 4446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown ~NativeInputChannel(); 4546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 4646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown inline sp<InputChannel> getInputChannel() { return mInputChannel; } 4746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 4846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown void setDisposeCallback(InputChannelObjDisposeCallback callback, void* data); 4946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown void invokeAndRemoveDisposeCallback(JNIEnv* env, jobject obj); 5046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprivate: 5246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown sp<InputChannel> mInputChannel; 5346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown InputChannelObjDisposeCallback mDisposeCallback; 5446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown void* mDisposeData; 5546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 5646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ---------------------------------------------------------------------------- 5846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff BrownNativeInputChannel::NativeInputChannel(const sp<InputChannel>& inputChannel) : 6046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mInputChannel(inputChannel), mDisposeCallback(NULL) { 6146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 6246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 6346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff BrownNativeInputChannel::~NativeInputChannel() { 6446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 6546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 6646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid NativeInputChannel::setDisposeCallback(InputChannelObjDisposeCallback callback, void* data) { 6746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mDisposeCallback = callback; 6846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mDisposeData = data; 6946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 7046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 7146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid NativeInputChannel::invokeAndRemoveDisposeCallback(JNIEnv* env, jobject obj) { 7246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (mDisposeCallback) { 7346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mDisposeCallback(env, obj, mInputChannel, mDisposeData); 7446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mDisposeCallback = NULL; 7546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mDisposeData = NULL; 7646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 7746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 7846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 7946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ---------------------------------------------------------------------------- 8046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 8146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic NativeInputChannel* android_view_InputChannel_getNativeInputChannel(JNIEnv* env, 8246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jobject inputChannelObj) { 8346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jint intPtr = env->GetIntField(inputChannelObj, gInputChannelClassInfo.mPtr); 8446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return reinterpret_cast<NativeInputChannel*>(intPtr); 8546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 8646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 8746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic void android_view_InputChannel_setNativeInputChannel(JNIEnv* env, jobject inputChannelObj, 8846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown NativeInputChannel* nativeInputChannel) { 8946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown env->SetIntField(inputChannelObj, gInputChannelClassInfo.mPtr, 9046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown reinterpret_cast<jint>(nativeInputChannel)); 9146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 9246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownsp<InputChannel> android_view_InputChannel_getInputChannel(JNIEnv* env, jobject inputChannelObj) { 9446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown NativeInputChannel* nativeInputChannel = 9546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown android_view_InputChannel_getNativeInputChannel(env, inputChannelObj); 9646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return nativeInputChannel != NULL ? nativeInputChannel->getInputChannel() : NULL; 9746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 9846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownvoid android_view_InputChannel_setDisposeCallback(JNIEnv* env, jobject inputChannelObj, 10046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown InputChannelObjDisposeCallback callback, void* data) { 10146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown NativeInputChannel* nativeInputChannel = 10246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown android_view_InputChannel_getNativeInputChannel(env, inputChannelObj); 10346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (nativeInputChannel == NULL) { 10446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOGW("Cannot set dispose callback because input channel object has not been initialized."); 10546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } else { 10646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeInputChannel->setDisposeCallback(callback, data); 10746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 10846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 10946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic jobject android_view_InputChannel_createInputChannel(JNIEnv* env, 11146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown NativeInputChannel* nativeInputChannel) { 11246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jobject inputChannelObj = env->NewObject(gInputChannelClassInfo.clazz, 11346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown gInputChannelClassInfo.ctor); 11446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown android_view_InputChannel_setNativeInputChannel(env, inputChannelObj, nativeInputChannel); 11546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return inputChannelObj; 11646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 11746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic jobjectArray android_view_InputChannel_nativeOpenInputChannelPair(JNIEnv* env, 11946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jclass clazz, jstring nameObj) { 12046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown const char* nameChars = env->GetStringUTFChars(nameObj, NULL); 12146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown String8 name(nameChars); 12246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown env->ReleaseStringUTFChars(nameObj, nameChars); 12346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 12446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown InputChannel* serverChannel; 12546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown InputChannel* clientChannel; 12646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown status_t result = InputChannel::openInputChannelPair(name, & serverChannel, & clientChannel); 12746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 12846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (result) { 12946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOGE("Could not open input channel pair. status=%d", result); 13046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jniThrowRuntimeException(env, "Could not open input channel pair."); 13146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return NULL; 13246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 13346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // TODO more robust error checking 13546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jobject serverChannelObj = android_view_InputChannel_createInputChannel(env, 13646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown new NativeInputChannel(serverChannel)); 13746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jobject clientChannelObj = android_view_InputChannel_createInputChannel(env, 13846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown new NativeInputChannel(clientChannel)); 13946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 14046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jobjectArray channelPair = env->NewObjectArray(2, gInputChannelClassInfo.clazz, NULL); 14146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown env->SetObjectArrayElement(channelPair, 0, serverChannelObj); 14246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown env->SetObjectArrayElement(channelPair, 1, clientChannelObj); 14346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return channelPair; 14446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 14546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 14646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic void android_view_InputChannel_nativeDispose(JNIEnv* env, jobject obj, jboolean finalized) { 14746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown NativeInputChannel* nativeInputChannel = 14846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown android_view_InputChannel_getNativeInputChannel(env, obj); 14946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (nativeInputChannel) { 15046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (finalized) { 15146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOGW("Input channel object '%s' was finalized without being disposed!", 15246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeInputChannel->getInputChannel()->getName().string()); 15346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 15446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 15546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeInputChannel->invokeAndRemoveDisposeCallback(env, obj); 15646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 15746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown android_view_InputChannel_setNativeInputChannel(env, obj, NULL); 15846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown delete nativeInputChannel; 15946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 16046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 16146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 16246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic void android_view_InputChannel_nativeTransferTo(JNIEnv* env, jobject obj, 16346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jobject otherObj) { 16446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (android_view_InputChannel_getInputChannel(env, otherObj) != NULL) { 16546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jniThrowException(env, "java/lang/IllegalStateException", 16646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "Other object already has a native input channel."); 16746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return; 16846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 16946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 17046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown NativeInputChannel* nativeInputChannel = 17146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown android_view_InputChannel_getNativeInputChannel(env, obj); 17246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown android_view_InputChannel_setNativeInputChannel(env, otherObj, nativeInputChannel); 17346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown android_view_InputChannel_setNativeInputChannel(env, obj, NULL); 17446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 17546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 17646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic void android_view_InputChannel_nativeReadFromParcel(JNIEnv* env, jobject obj, 17746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jobject parcelObj) { 17846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (android_view_InputChannel_getInputChannel(env, obj) != NULL) { 17946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jniThrowException(env, "java/lang/IllegalStateException", 18046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "This object already has a native input channel."); 18146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return; 18246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 18346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 18446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown Parcel* parcel = parcelForJavaObject(env, parcelObj); 18546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (parcel) { 18646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown bool isInitialized = parcel->readInt32(); 18746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (isInitialized) { 18846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown String8 name = parcel->readString8(); 18946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t ashmemFd = dup(parcel->readFileDescriptor()); 19046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t receivePipeFd = dup(parcel->readFileDescriptor()); 19146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t sendPipeFd = dup(parcel->readFileDescriptor()); 19246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (ashmemFd < 0 || receivePipeFd < 0 || sendPipeFd < 0) { 19346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (ashmemFd >= 0) ::close(ashmemFd); 19446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (receivePipeFd >= 0) ::close(receivePipeFd); 19546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (sendPipeFd >= 0) ::close(sendPipeFd); 19646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jniThrowRuntimeException(env, 19746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "Could not read input channel file descriptors from parcel."); 19846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return; 19946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 20046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 20146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown InputChannel* inputChannel = new InputChannel(name, ashmemFd, 20246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown receivePipeFd, sendPipeFd); 20346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown NativeInputChannel* nativeInputChannel = new NativeInputChannel(inputChannel); 20446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 20546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown android_view_InputChannel_setNativeInputChannel(env, obj, nativeInputChannel); 20646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 20746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 20846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 20946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 21046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic void android_view_InputChannel_nativeWriteToParcel(JNIEnv* env, jobject obj, 21146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jobject parcelObj) { 21246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown Parcel* parcel = parcelForJavaObject(env, parcelObj); 21346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (parcel) { 21446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown NativeInputChannel* nativeInputChannel = 21546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown android_view_InputChannel_getNativeInputChannel(env, obj); 21646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (nativeInputChannel) { 21746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown sp<InputChannel> inputChannel = nativeInputChannel->getInputChannel(); 21846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 21946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown parcel->writeInt32(1); 22046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown parcel->writeString8(inputChannel->getName()); 22146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown parcel->writeDupFileDescriptor(inputChannel->getAshmemFd()); 22246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown parcel->writeDupFileDescriptor(inputChannel->getReceivePipeFd()); 22346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown parcel->writeDupFileDescriptor(inputChannel->getSendPipeFd()); 22446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } else { 22546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown parcel->writeInt32(0); 22646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 22746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 22846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 22946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 23046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic jstring android_view_InputChannel_nativeGetName(JNIEnv* env, jobject obj) { 23146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown NativeInputChannel* nativeInputChannel = 23246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown android_view_InputChannel_getNativeInputChannel(env, obj); 23346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (! nativeInputChannel) { 23446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return NULL; 23546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 23646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 23746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown jstring name = env->NewStringUTF(nativeInputChannel->getInputChannel()->getName().string()); 23846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return name; 23946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 24046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 24146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// ---------------------------------------------------------------------------- 24246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 24346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatic JNINativeMethod gInputChannelMethods[] = { 24446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* name, signature, funcPtr */ 24546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown { "nativeOpenInputChannelPair", "(Ljava/lang/String;)[Landroid/view/InputChannel;", 24646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown (void*)android_view_InputChannel_nativeOpenInputChannelPair }, 24746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown { "nativeDispose", "(Z)V", 24846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown (void*)android_view_InputChannel_nativeDispose }, 24946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown { "nativeTransferTo", "(Landroid/view/InputChannel;)V", 25046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown (void*)android_view_InputChannel_nativeTransferTo }, 25146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown { "nativeReadFromParcel", "(Landroid/os/Parcel;)V", 25246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown (void*)android_view_InputChannel_nativeReadFromParcel }, 25346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown { "nativeWriteToParcel", "(Landroid/os/Parcel;)V", 25446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown (void*)android_view_InputChannel_nativeWriteToParcel }, 25546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown { "nativeGetName", "()Ljava/lang/String;", 25646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown (void*)android_view_InputChannel_nativeGetName }, 25746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 25846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 25946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define FIND_CLASS(var, className) \ 26046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->FindClass(className); \ 26146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(! var, "Unable to find class " className); \ 26246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = jclass(env->NewGlobalRef(var)); 26346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 26446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 26546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 26646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(! var, "Unable to find method " methodName); 26746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 26846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 26946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 27046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(! var, "Unable to find field " fieldName); 27146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 27246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownint register_android_view_InputChannel(JNIEnv* env) { 27346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int res = jniRegisterNativeMethods(env, "android/view/InputChannel", 27446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown gInputChannelMethods, NELEM(gInputChannelMethods)); 27546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown LOG_FATAL_IF(res < 0, "Unable to register native methods."); 27646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 27746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown FIND_CLASS(gInputChannelClassInfo.clazz, "android/view/InputChannel"); 27846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 27946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GET_FIELD_ID(gInputChannelClassInfo.mPtr, gInputChannelClassInfo.clazz, 28046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "mPtr", "I"); 28146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 28246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GET_METHOD_ID(gInputChannelClassInfo.ctor, gInputChannelClassInfo.clazz, 28346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "<init>", "()V"); 28446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 28546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return 0; 28646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 28746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 28846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android 289