android_app_NativeActivity.cpp revision 805fd7ee0e5dc2939e85c84f78d9890a51982bc0
169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn/* 269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * Copyright (C) 2010 The Android Open Source Project 369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * 469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * you may not use this file except in compliance with the License. 669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * You may obtain a copy of the License at 769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * 869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * 1069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * Unless required by applicable law or agreed to in writing, software 1169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * See the License for the specific language governing permissions and 1469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * limitations under the License. 1569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn */ 1669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 1769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn#define LOG_TAG "NativeActivity" 1869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn#include <utils/Log.h> 1969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 203c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include <poll.h> 213c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include <dlfcn.h> 22d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn#include <fcntl.h> 233c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 2469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn#include <android_runtime/AndroidRuntime.h> 25289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#include <android_runtime/android_view_Surface.h> 26289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#include <android_runtime/android_app_NativeActivity.h> 276cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate#include <android_runtime/android_util_AssetManager.h> 2854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn#include <surfaceflinger/Surface.h> 2954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn#include <ui/egl/android_natives.h> 30a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn#include <ui/InputTransport.h> 314fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown#include <utils/Looper.h> 3269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 333c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "JNIHelp.h" 343c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "android_os_MessageQueue.h" 353c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "android_view_InputChannel.h" 363c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "android_view_KeyEvent.h" 3769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 38db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn#define LOG_TRACE(...) 39db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn//#define LOG_TRACE(...) LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__) 40d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 4169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornnamespace android 4269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 4369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 443c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornstatic struct { 453c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn jclass clazz; 463c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 473c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn jmethodID dispatchUnhandledKeyEvent; 482c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn jmethodID preDispatchKeyEvent; 49db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn jmethodID finish; 5054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn jmethodID setWindowFlags; 5154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn jmethodID setWindowFormat; 52d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jmethodID showIme; 53d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jmethodID hideIme; 543c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} gNativeActivityClassInfo; 553c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 5654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 5754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 58289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstruct ActivityWork { 59289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t cmd; 60289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t arg1; 61289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t arg2; 62289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn}; 63289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 64289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornenum { 65289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn CMD_DEF_KEY = 1, 66db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn CMD_FINISH, 67289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn CMD_SET_WINDOW_FORMAT, 68289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn CMD_SET_WINDOW_FLAGS, 69d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn CMD_SHOW_SOFT_INPUT, 70d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn CMD_HIDE_SOFT_INPUT, 71289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn}; 72289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 73289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstatic void write_work(int fd, int32_t cmd, int32_t arg1=0, int32_t arg2=0) { 74289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ActivityWork work; 75289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn work.cmd = cmd; 76289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn work.arg1 = arg1; 77289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn work.arg2 = arg2; 78289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 79d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("write_work: cmd=%d", cmd); 80d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 81289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornrestart: 82289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int res = write(fd, &work, sizeof(work)); 83289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res < 0 && errno == EINTR) { 84289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn goto restart; 85289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 86289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 87289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res == sizeof(work)) return; 88289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 89289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res < 0) LOGW("Failed writing to work fd: %s", strerror(errno)); 90289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn else LOGW("Truncated writing to work fd: %d", res); 91289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 92289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 93289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstatic bool read_work(int fd, ActivityWork* outWork) { 94289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int res = read(fd, outWork, sizeof(ActivityWork)); 95289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn // no need to worry about EINTR, poll loop will just come back again. 96289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res == sizeof(ActivityWork)) return true; 97289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 98289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res < 0) LOGW("Failed reading work fd: %s", strerror(errno)); 99289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn else LOGW("Truncated reading work fd: %d", res); 100289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn return false; 101289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 102289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 103289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn// ------------------------------------------------------------------------ 104289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 105d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} // namespace android 106d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 107d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornusing namespace android; 108d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 109d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne HackbornAInputQueue::AInputQueue(const sp<InputChannel>& channel, int workWrite) : 1102c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mWorkWrite(workWrite), mConsumer(channel), mSeq(0) { 111d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int msgpipe[2]; 112d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (pipe(msgpipe)) { 113d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOGW("could not create pipe: %s", strerror(errno)); 114d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mDispatchKeyRead = mDispatchKeyWrite = -1; 115d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } else { 116d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mDispatchKeyRead = msgpipe[0]; 117d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mDispatchKeyWrite = msgpipe[1]; 118d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int result = fcntl(mDispatchKeyRead, F_SETFL, O_NONBLOCK); 119d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn SLOGW_IF(result != 0, "Could not make AInputQueue read pipe " 120d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "non-blocking: %s", strerror(errno)); 121d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn result = fcntl(mDispatchKeyWrite, F_SETFL, O_NONBLOCK); 122d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn SLOGW_IF(result != 0, "Could not make AInputQueue write pipe " 123d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "non-blocking: %s", strerror(errno)); 1243c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 125d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 126d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 127d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne HackbornAInputQueue::~AInputQueue() { 128d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn close(mDispatchKeyRead); 129d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn close(mDispatchKeyWrite); 130d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 131d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 13242c03e579aade011b451e2a13ea3f44a2ef0056aDianne Hackbornvoid AInputQueue::attachLooper(ALooper* looper, int ident, 1334fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown ALooper_callbackFunc callback, void* data) { 1344fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown mLooper = static_cast<android::Looper*>(looper); 1354fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown mLooper->addFd(mConsumer.getChannel()->getReceivePipeFd(), 1364fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown ident, ALOOPER_EVENT_INPUT, callback, data); 1374fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown mLooper->addFd(mDispatchKeyRead, 1384fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown ident, ALOOPER_EVENT_INPUT, callback, data); 139d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 140d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 141d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid AInputQueue::detachLooper() { 1424fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown mLooper->removeFd(mConsumer.getChannel()->getReceivePipeFd()); 1434fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown mLooper->removeFd(mDispatchKeyRead); 144d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 145d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 146d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornint32_t AInputQueue::hasEvents() { 147d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn struct pollfd pfd[2]; 148d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 149d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn pfd[0].fd = mConsumer.getChannel()->getReceivePipeFd(); 150d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn pfd[0].events = POLLIN; 151d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn pfd[0].revents = 0; 152d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn pfd[1].fd = mDispatchKeyRead; 153d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn pfd[0].events = POLLIN; 154d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn pfd[0].revents = 0; 1553c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 156d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int nfd = poll(pfd, 2, 0); 157d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (nfd <= 0) return 0; 158d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return (pfd[0].revents == POLLIN || pfd[1].revents == POLLIN) ? 1 : -1; 159d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 160d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 161d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornint32_t AInputQueue::getEvent(AInputEvent** outEvent) { 162d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn *outEvent = NULL; 163d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 1642c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn bool finishNow = false; 1652c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 166d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn char byteread; 167d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ssize_t nRead = read(mDispatchKeyRead, &byteread, 1); 168d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (nRead == 1) { 1693c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mLock.lock(); 170d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (mDispatchingKeys.size() > 0) { 171d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn KeyEvent* kevent = mDispatchingKeys[0]; 172d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn *outEvent = kevent; 173d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mDispatchingKeys.removeAt(0); 1742c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn in_flight_event inflight; 1752c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn inflight.event = kevent; 1762c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn inflight.seq = -1; 1772c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn inflight.doFinish = false; 1782c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mInFlightEvents.push(inflight); 1792c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 1802c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (mFinishPreDispatches.size() > 0) { 1812c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn finish_pre_dispatch finish(mFinishPreDispatches[0]); 1822c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mFinishPreDispatches.removeAt(0); 1832c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn const size_t N = mInFlightEvents.size(); 1842c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn for (size_t i=0; i<N; i++) { 1852c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn const in_flight_event& inflight(mInFlightEvents[i]); 1862c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (inflight.seq == finish.seq) { 1872c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn *outEvent = inflight.event; 1882c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn finishNow = finish.handled; 1892c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 1902c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 1912c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (*outEvent == NULL) { 1922c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn LOGW("getEvent couldn't find inflight for seq %d", finish.seq); 1932c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 1943c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 1953c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mLock.unlock(); 1962c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1972c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (finishNow) { 1983915bb845b032dc184dba5e60970b803390ca3edJeff Brown finishEvent(*outEvent, true, false); 1992c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn *outEvent = NULL; 2002c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn return -1; 2012c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } else if (*outEvent != NULL) { 202d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return 0; 203d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 2043c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 2053c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 206d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t res = mConsumer.receiveDispatchSignal(); 207d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (res != android::OK) { 208d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOGE("channel '%s' ~ Failed to receive dispatch signal. status=%d", 209d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mConsumer.getChannel()->getName().string(), res); 210d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return -1; 211d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 212d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 213d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn InputEvent* myEvent = NULL; 2142c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn res = mConsumer.consume(this, &myEvent); 215d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (res != android::OK) { 216d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOGW("channel '%s' ~ Failed to consume input event. status=%d", 217d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mConsumer.getChannel()->getName().string(), res); 2183915bb845b032dc184dba5e60970b803390ca3edJeff Brown mConsumer.sendFinishedSignal(false); 219d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return -1; 220d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 221d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 2222c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn in_flight_event inflight; 2232c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn inflight.event = myEvent; 2242c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn inflight.seq = -1; 2252c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn inflight.doFinish = true; 2262c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mInFlightEvents.push(inflight); 2272c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 228d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn *outEvent = myEvent; 229d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return 0; 230d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 231d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 2322c6081ce3593712f30dacd990a97209c791d6cedDianne Hackbornbool AInputQueue::preDispatchEvent(AInputEvent* event) { 2332c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (((InputEvent*)event)->getType() != AINPUT_EVENT_TYPE_KEY) { 2342c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // The IME only cares about key events. 2352c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn return false; 2362c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 2372c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 2382c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // For now we only send system keys to the IME... this avoids having 2392c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // critical keys like DPAD go through this path. We really need to have 2402c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // the IME report which keys it wants. 2412c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (!((KeyEvent*)event)->isSystemKey()) { 2422c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn return false; 2432c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 2442c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 2452c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn return preDispatchKey((KeyEvent*)event); 2462c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn} 2472c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 2483915bb845b032dc184dba5e60970b803390ca3edJeff Brownvoid AInputQueue::finishEvent(AInputEvent* event, bool handled, bool didDefaultHandling) { 2493915bb845b032dc184dba5e60970b803390ca3edJeff Brown LOG_TRACE("finishEvent: %p handled=%d, didDefaultHandling=%d", event, 2503915bb845b032dc184dba5e60970b803390ca3edJeff Brown handled ? 1 : 0, didDefaultHandling ? 1 : 0); 251d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 2523915bb845b032dc184dba5e60970b803390ca3edJeff Brown if (!handled && !didDefaultHandling 2533915bb845b032dc184dba5e60970b803390ca3edJeff Brown && ((InputEvent*)event)->getType() == AINPUT_EVENT_TYPE_KEY 254d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn && ((KeyEvent*)event)->hasDefaultAction()) { 255d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn // The app didn't handle this, but it may have a default action 256d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn // associated with it. We need to hand this back to Java to be 257d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn // executed. 2582c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn doUnhandledKey((KeyEvent*)event); 2592c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn return; 260d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 261d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 2622c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mLock.lock(); 2632c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn const size_t N = mInFlightEvents.size(); 264d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn for (size_t i=0; i<N; i++) { 2652c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn const in_flight_event& inflight(mInFlightEvents[i]); 2662c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (inflight.event == event) { 2672c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (inflight.doFinish) { 2683915bb845b032dc184dba5e60970b803390ca3edJeff Brown int32_t res = mConsumer.sendFinishedSignal(handled); 2692c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (res != android::OK) { 2702c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn LOGW("Failed to send finished signal on channel '%s'. status=%d", 2712c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mConsumer.getChannel()->getName().string(), res); 2722c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 2732c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 2742c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (static_cast<InputEvent*>(event)->getType() == AINPUT_EVENT_TYPE_KEY) { 2752c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mAvailKeyEvents.push(static_cast<KeyEvent*>(event)); 2762c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } else { 2772c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mAvailMotionEvents.push(static_cast<MotionEvent*>(event)); 2782c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 2792c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mInFlightEvents.removeAt(i); 2802c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mLock.unlock(); 2812c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn return; 2823c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 2833c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 2842c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mLock.unlock(); 2853c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 2862c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn LOGW("finishEvent called for unknown event: %p", event); 287d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 288d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 289d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid AInputQueue::dispatchEvent(android::KeyEvent* event) { 290d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLock.lock(); 291d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("dispatchEvent: dispatching=%d write=%d\n", mDispatchingKeys.size(), 292d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mDispatchKeyWrite); 293d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mDispatchingKeys.add(event); 2942c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn wakeupDispatch(); 295d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLock.unlock(); 2962c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn} 297d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 2982c6081ce3593712f30dacd990a97209c791d6cedDianne Hackbornvoid AInputQueue::finishPreDispatch(int seq, bool handled) { 2992c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mLock.lock(); 3002c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn LOG_TRACE("finishPreDispatch: seq=%d handled=%d\n", seq, handled ? 1 : 0); 3012c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn finish_pre_dispatch finish; 3022c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn finish.seq = seq; 3032c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn finish.handled = handled; 3042c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mFinishPreDispatches.add(finish); 3052c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn wakeupDispatch(); 3062c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mLock.unlock(); 307d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 308d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 309d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne HackbornKeyEvent* AInputQueue::consumeUnhandledEvent() { 310d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn KeyEvent* event = NULL; 311d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 312d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLock.lock(); 3132c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (mUnhandledKeys.size() > 0) { 3142c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn event = mUnhandledKeys[0]; 3152c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mUnhandledKeys.removeAt(0); 316d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 317d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLock.unlock(); 318d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 319d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("consumeUnhandledEvent: KeyEvent=%p", event); 320d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 321d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return event; 322d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 323d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 3242c6081ce3593712f30dacd990a97209c791d6cedDianne HackbornKeyEvent* AInputQueue::consumePreDispatchingEvent(int* outSeq) { 3252c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn KeyEvent* event = NULL; 3262c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 327d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLock.lock(); 3282c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (mPreDispatchingKeys.size() > 0) { 3292c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn const in_flight_event& inflight(mPreDispatchingKeys[0]); 3302c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn event = static_cast<KeyEvent*>(inflight.event); 3312c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn *outSeq = inflight.seq; 3322c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mPreDispatchingKeys.removeAt(0); 3332c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 3342c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mLock.unlock(); 3352c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 3362c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn LOG_TRACE("consumePreDispatchingEvent: KeyEvent=%p", event); 3372c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 3382c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn return event; 3392c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn} 3402c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 3412c6081ce3593712f30dacd990a97209c791d6cedDianne HackbornKeyEvent* AInputQueue::createKeyEvent() { 3422c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mLock.lock(); 3432c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn KeyEvent* event; 3442c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (mAvailKeyEvents.size() <= 0) { 3452c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn event = new KeyEvent(); 3462c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } else { 3472c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn event = mAvailKeyEvents.top(); 3482c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mAvailKeyEvents.pop(); 3492c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 3502c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mLock.unlock(); 3512c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn return event; 3522c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn} 3532c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 3542c6081ce3593712f30dacd990a97209c791d6cedDianne HackbornMotionEvent* AInputQueue::createMotionEvent() { 3552c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mLock.lock(); 3562c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn MotionEvent* event; 3572c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (mAvailMotionEvents.size() <= 0) { 3582c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn event = new MotionEvent(); 3592c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } else { 3602c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn event = mAvailMotionEvents.top(); 3612c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mAvailMotionEvents.pop(); 3622c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 3632c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mLock.unlock(); 3642c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn return event; 3652c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn} 3662c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 3672c6081ce3593712f30dacd990a97209c791d6cedDianne Hackbornvoid AInputQueue::doUnhandledKey(KeyEvent* keyEvent) { 3682c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mLock.lock(); 3692c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn LOG_TRACE("Unhandled key: pending=%d write=%d\n", mUnhandledKeys.size(), mWorkWrite); 3702c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (mUnhandledKeys.size() <= 0 && mWorkWrite >= 0) { 371d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn write_work(mWorkWrite, CMD_DEF_KEY); 372d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 3732c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mUnhandledKeys.add(keyEvent); 374d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLock.unlock(); 375d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 376d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 3772c6081ce3593712f30dacd990a97209c791d6cedDianne Hackbornbool AInputQueue::preDispatchKey(KeyEvent* keyEvent) { 3782c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mLock.lock(); 3792c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn LOG_TRACE("preDispatch key: pending=%d write=%d\n", mPreDispatchingKeys.size(), mWorkWrite); 3802c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn const size_t N = mInFlightEvents.size(); 3812c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn for (size_t i=0; i<N; i++) { 3822c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn in_flight_event& inflight(mInFlightEvents.editItemAt(i)); 3832c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (inflight.event == keyEvent) { 3842c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (inflight.seq >= 0) { 3852c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // This event has already been pre-dispatched! 3862c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn LOG_TRACE("Event already pre-dispatched!"); 3872c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mLock.unlock(); 3882c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn return false; 3892c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 3902c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mSeq++; 3912c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (mSeq < 0) mSeq = 1; 3922c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn inflight.seq = mSeq; 3932c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 3942c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (mPreDispatchingKeys.size() <= 0 && mWorkWrite >= 0) { 3952c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn write_work(mWorkWrite, CMD_DEF_KEY); 3962c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 3972c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mPreDispatchingKeys.add(inflight); 3982c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn mLock.unlock(); 3992c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn return true; 4002c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 4012c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 4022c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 4032c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn LOGW("preDispatchKey called for unknown event: %p", keyEvent); 4042c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn return false; 4052c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn} 4062c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 4072c6081ce3593712f30dacd990a97209c791d6cedDianne Hackbornvoid AInputQueue::wakeupDispatch() { 4082c6081ce3593712f30dacd990a97209c791d6cedDianne Hackbornrestart: 4092c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn char dummy = 0; 4102c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn int res = write(mDispatchKeyWrite, &dummy, sizeof(dummy)); 4112c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (res < 0 && errno == EINTR) { 4122c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn goto restart; 4132c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 4142c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 4152c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (res == sizeof(dummy)) return; 4162c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 4172c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (res < 0) LOGW("Failed writing to dispatch fd: %s", strerror(errno)); 4182c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn else LOGW("Truncated writing to dispatch fd: %d", res); 4192c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn} 4202c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 421d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornnamespace android { 4223c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 42354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 42454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 42554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn/* 42654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Native state for interacting with the NativeActivity class. 42754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn */ 428289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstruct NativeCode : public ANativeActivity { 4292e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn NativeCode(void* _dlhandle, ANativeActivity_createFunc* _createFunc) { 430d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn memset((ANativeActivity*)this, 0, sizeof(ANativeActivity)); 431d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn memset(&callbacks, 0, sizeof(callbacks)); 43274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn dlhandle = _dlhandle; 43374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn createActivityFunc = _createFunc; 43454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn nativeWindow = NULL; 435a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn inputChannel = NULL; 436a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn nativeInputQueue = NULL; 4373c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mainWorkRead = mainWorkWrite = -1; 43874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 43974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 44074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn ~NativeCode() { 441289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (callbacks.onDestroy != NULL) { 442289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn callbacks.onDestroy(this); 443289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 444289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (env != NULL && clazz != NULL) { 445289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn env->DeleteGlobalRef(clazz); 4463c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 4474fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown if (looper != NULL && mainWorkRead >= 0) { 4484fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown looper->removeFd(mainWorkRead); 4493c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 4503c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (nativeInputQueue != NULL) { 4513c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn nativeInputQueue->mWorkWrite = -1; 4523c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 453a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn setSurface(NULL); 454a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn setInputChannel(NULL); 4553c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mainWorkRead >= 0) close(mainWorkRead); 4563c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mainWorkWrite >= 0) close(mainWorkWrite); 45774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (dlhandle != NULL) { 45854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn // for now don't unload... we probably should clean this 45954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn // up and only keep one open dlhandle per proc, since there 46054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn // is really no benefit to unloading the code. 46154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn //dlclose(dlhandle); 46274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 46374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 46474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 46574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn void setSurface(jobject _surface) { 46674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (_surface != NULL) { 467289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn nativeWindow = android_Surface_getNativeWindow(env, _surface); 46874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } else { 46954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn nativeWindow = NULL; 47074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 47174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 47274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 473a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn status_t setInputChannel(jobject _channel) { 474a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (inputChannel != NULL) { 475a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn delete nativeInputQueue; 476289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn env->DeleteGlobalRef(inputChannel); 477a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 478a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn inputChannel = NULL; 479a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn nativeInputQueue = NULL; 480a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (_channel != NULL) { 481289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn inputChannel = env->NewGlobalRef(_channel); 482a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn sp<InputChannel> ic = 483289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn android_view_InputChannel_getInputChannel(env, _channel); 484a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (ic != NULL) { 485d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn nativeInputQueue = new AInputQueue(ic, mainWorkWrite); 486a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (nativeInputQueue->getConsumer().initialize() != android::OK) { 487a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn delete nativeInputQueue; 488a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn nativeInputQueue = NULL; 489a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn return UNKNOWN_ERROR; 490a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 491a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } else { 492a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn return UNKNOWN_ERROR; 493a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 494a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 495a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn return OK; 496a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 497a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 4982e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn ANativeActivityCallbacks callbacks; 49969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 50069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn void* dlhandle; 5012e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn ANativeActivity_createFunc* createActivityFunc; 50274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 503805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn String8 internalDataPathObj; 504805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn String8 externalDataPathObj; 505805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn String8 obbPathObj; 506682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 50754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn sp<ANativeWindow> nativeWindow; 508d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t lastWindowWidth; 509d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t lastWindowHeight; 510d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 511a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn jobject inputChannel; 512d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn struct AInputQueue* nativeInputQueue; 5133c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 5143c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn // These are used to wake up the main thread to process work. 5153c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn int mainWorkRead; 5163c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn int mainWorkWrite; 5174fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown sp<Looper> looper; 51869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}; 51969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 520db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackbornvoid android_NativeActivity_finish(ANativeActivity* activity) { 521db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 522db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn write_work(code->mainWorkWrite, CMD_FINISH, 0); 523db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn} 524db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn 525289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornvoid android_NativeActivity_setWindowFormat( 526289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ANativeActivity* activity, int32_t format) { 527289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 528289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn write_work(code->mainWorkWrite, CMD_SET_WINDOW_FORMAT, format); 529289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 530289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 531289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornvoid android_NativeActivity_setWindowFlags( 532289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ANativeActivity* activity, int32_t values, int32_t mask) { 533289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 534289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn write_work(code->mainWorkWrite, CMD_SET_WINDOW_FLAGS, values, mask); 535289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 536289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 537d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid android_NativeActivity_showSoftInput( 538d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ANativeActivity* activity, int32_t flags) { 539d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 540d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn write_work(code->mainWorkWrite, CMD_SHOW_SOFT_INPUT, flags); 541d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 542d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 543d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid android_NativeActivity_hideSoftInput( 544d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ANativeActivity* activity, int32_t flags) { 545d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 546d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn write_work(code->mainWorkWrite, CMD_HIDE_SOFT_INPUT, flags); 547d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 548d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 54954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 55054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 551db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackbornstatic bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { 552db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn if (env->ExceptionCheck()) { 553db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn LOGE("An exception was thrown by callback '%s'.", methodName); 554db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn LOGE_EX(env); 555db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn env->ExceptionClear(); 556db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn return true; 557db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn } 558db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn return false; 559db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn} 560db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn 56154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn/* 56254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Callback for handling native events on the application's main thread. 56354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn */ 5644fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownstatic int mainWorkCallback(int fd, int events, void* data) { 5653c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn NativeCode* code = (NativeCode*)data; 566289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if ((events & POLLIN) == 0) { 5674fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown return 1; 568289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 569289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 570289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ActivityWork work; 571289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (!read_work(code->mainWorkRead, &work)) { 5724fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown return 1; 573289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 574d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 575d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("mainWorkCallback: cmd=%d", work.cmd); 576d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 577289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn switch (work.cmd) { 578289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn case CMD_DEF_KEY: { 579289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn KeyEvent* keyEvent; 580d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn while ((keyEvent=code->nativeInputQueue->consumeUnhandledEvent()) != NULL) { 581289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn jobject inputEventObj = android_view_KeyEvent_fromNative( 582289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env, keyEvent); 5831f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jboolean handled; 5841f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (inputEventObj) { 5851f2451007c660091b7b090c1ea332f9044515d2dJeff Brown handled = code->env->CallBooleanMethod(code->clazz, 5861f2451007c660091b7b090c1ea332f9044515d2dJeff Brown gNativeActivityClassInfo.dispatchUnhandledKeyEvent, inputEventObj); 5871f2451007c660091b7b090c1ea332f9044515d2dJeff Brown checkAndClearExceptionFromCallback(code->env, "dispatchUnhandledKeyEvent"); 5881f2451007c660091b7b090c1ea332f9044515d2dJeff Brown code->env->DeleteLocalRef(inputEventObj); 5891f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } else { 5901f2451007c660091b7b090c1ea332f9044515d2dJeff Brown LOGE("Failed to obtain key event for dispatchUnhandledKeyEvent."); 5911f2451007c660091b7b090c1ea332f9044515d2dJeff Brown handled = false; 5921f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 5933915bb845b032dc184dba5e60970b803390ca3edJeff Brown code->nativeInputQueue->finishEvent(keyEvent, handled, true); 5942c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 5952c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn int seq; 5962c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn while ((keyEvent=code->nativeInputQueue->consumePreDispatchingEvent(&seq)) != NULL) { 5972c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn jobject inputEventObj = android_view_KeyEvent_fromNative( 5982c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn code->env, keyEvent); 5991f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (inputEventObj) { 6001f2451007c660091b7b090c1ea332f9044515d2dJeff Brown code->env->CallVoidMethod(code->clazz, 6011f2451007c660091b7b090c1ea332f9044515d2dJeff Brown gNativeActivityClassInfo.preDispatchKeyEvent, inputEventObj, seq); 6021f2451007c660091b7b090c1ea332f9044515d2dJeff Brown checkAndClearExceptionFromCallback(code->env, "preDispatchKeyEvent"); 6031f2451007c660091b7b090c1ea332f9044515d2dJeff Brown code->env->DeleteLocalRef(inputEventObj); 6041f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } else { 6051f2451007c660091b7b090c1ea332f9044515d2dJeff Brown LOGE("Failed to obtain key event for preDispatchKeyEvent."); 6061f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 6073c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 608289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } break; 609db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn case CMD_FINISH: { 610db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn code->env->CallVoidMethod(code->clazz, gNativeActivityClassInfo.finish); 611db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn checkAndClearExceptionFromCallback(code->env, "finish"); 612db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn } break; 613289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn case CMD_SET_WINDOW_FORMAT: { 614289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env->CallVoidMethod(code->clazz, 615289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn gNativeActivityClassInfo.setWindowFormat, work.arg1); 616db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn checkAndClearExceptionFromCallback(code->env, "setWindowFormat"); 617289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } break; 618289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn case CMD_SET_WINDOW_FLAGS: { 619289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env->CallVoidMethod(code->clazz, 620289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn gNativeActivityClassInfo.setWindowFlags, work.arg1, work.arg2); 621db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn checkAndClearExceptionFromCallback(code->env, "setWindowFlags"); 622289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } break; 623d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn case CMD_SHOW_SOFT_INPUT: { 624d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->env->CallVoidMethod(code->clazz, 625d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn gNativeActivityClassInfo.showIme, work.arg1); 626db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn checkAndClearExceptionFromCallback(code->env, "showIme"); 627d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } break; 628d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn case CMD_HIDE_SOFT_INPUT: { 629d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->env->CallVoidMethod(code->clazz, 630d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn gNativeActivityClassInfo.hideIme, work.arg1); 631db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn checkAndClearExceptionFromCallback(code->env, "hideIme"); 632d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } break; 633289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn default: 634289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn LOGW("Unknown work command: %d", work.cmd); 635289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn break; 6363c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 6373c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 6384fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown return 1; 6393c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} 6403c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 64154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 64254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 64369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic jint 644e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne HackbornloadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jstring funcName, 645805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn jobject messageQueue, jstring internalDataDir, jstring obbDir, 646805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn jstring externalDataDir, int sdkVersion, 64708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jobject jAssetMgr, jbyteArray savedState) 64869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 649d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("loadNativeCode_native"); 650d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 65169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn const char* pathStr = env->GetStringUTFChars(path, NULL); 65269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = NULL; 65369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 65469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn void* handle = dlopen(pathStr, RTLD_LAZY); 65569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 65669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn env->ReleaseStringUTFChars(path, pathStr); 65769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 65869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != NULL) { 659e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn const char* funcStr = env->GetStringUTFChars(funcName, NULL); 6602e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn code = new NativeCode(handle, (ANativeActivity_createFunc*) 661e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn dlsym(handle, funcStr)); 662e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn env->ReleaseStringUTFChars(funcName, funcStr); 663e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn 66469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->createActivityFunc == NULL) { 6652e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn LOGW("ANativeActivity_onCreate not found"); 66669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn delete code; 66769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn return 0; 66869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 6693c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 6704fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown code->looper = android_os_MessageQueue_getLooper(env, messageQueue); 6714fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown if (code->looper == NULL) { 6724fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown LOGW("Unable to retrieve MessageQueue's Looper"); 6733c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn delete code; 6743c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return 0; 6753c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 6763c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 6773c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn int msgpipe[2]; 6783c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (pipe(msgpipe)) { 6793c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn LOGW("could not create pipe: %s", strerror(errno)); 6803c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn delete code; 6813c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return 0; 6823c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 6833c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn code->mainWorkRead = msgpipe[0]; 6843c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn code->mainWorkWrite = msgpipe[1]; 685d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int result = fcntl(code->mainWorkRead, F_SETFL, O_NONBLOCK); 686d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn SLOGW_IF(result != 0, "Could not make main work read pipe " 687d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "non-blocking: %s", strerror(errno)); 688d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn result = fcntl(code->mainWorkWrite, F_SETFL, O_NONBLOCK); 689d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn SLOGW_IF(result != 0, "Could not make main work write pipe " 690d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "non-blocking: %s", strerror(errno)); 6914fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown code->looper->addFd(code->mainWorkRead, 0, ALOOPER_EVENT_INPUT, mainWorkCallback, code); 6923c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 693289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->ANativeActivity::callbacks = &code->callbacks; 694289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (env->GetJavaVM(&code->vm) < 0) { 6952e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn LOGW("NativeActivity GetJavaVM failed"); 6962e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn delete code; 6972e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn return 0; 6982e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn } 699289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env = env; 700289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->clazz = env->NewGlobalRef(clazz); 7016cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 702682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn const char* dirStr = env->GetStringUTFChars(internalDataDir, NULL); 703805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->internalDataPathObj = dirStr; 704805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->internalDataPath = code->internalDataPathObj.string(); 705805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn env->ReleaseStringUTFChars(internalDataDir, dirStr); 706682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 707682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn dirStr = env->GetStringUTFChars(externalDataDir, NULL); 708805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->externalDataPathObj = dirStr; 709805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->externalDataPath = code->externalDataPathObj.string(); 710805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn env->ReleaseStringUTFChars(externalDataDir, dirStr); 7116cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 712289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->sdkVersion = sdkVersion; 713682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 7146cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate code->assetManager = assetManagerForJavaObject(env, jAssetMgr); 7156cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 716805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn dirStr = env->GetStringUTFChars(obbDir, NULL); 717805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->obbPathObj = dirStr; 718805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->obbPath = code->obbPathObj.string(); 719805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn env->ReleaseStringUTFChars(obbDir, dirStr); 720805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn 72108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jbyte* rawSavedState = NULL; 72208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jsize rawSavedSize = 0; 72308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (savedState != NULL) { 72408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn rawSavedState = env->GetByteArrayElements(savedState, NULL); 72508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn rawSavedSize = env->GetArrayLength(savedState); 72608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 72708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 72808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn code->createActivityFunc(code, rawSavedState, rawSavedSize); 72908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 73008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (rawSavedState != NULL) { 73108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn env->ReleaseByteArrayElements(savedState, rawSavedState, 0); 73208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 73369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 73469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 73569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn return (jint)code; 73669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 73769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 73869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 73969969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornunloadNativeCode_native(JNIEnv* env, jobject clazz, jint handle) 74069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 741d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("unloadNativeCode_native"); 74269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 74369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 74469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn delete code; 74569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 74669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 74769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 74869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 74969969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonStart_native(JNIEnv* env, jobject clazz, jint handle) 75069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 751d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onStart_native"); 75269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 75369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 75469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onStart != NULL) { 755289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onStart(code); 75669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 75769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 75869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 75969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 76069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 76169969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonResume_native(JNIEnv* env, jobject clazz, jint handle) 76269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 763d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onResume_native"); 76469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 76569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 76669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onResume != NULL) { 767289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onResume(code); 76869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 76969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 77069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 77169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 77208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic jbyteArray 77369969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonSaveInstanceState_native(JNIEnv* env, jobject clazz, jint handle) 77469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 775d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onSaveInstanceState_native"); 77608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 77708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jbyteArray array = NULL; 77808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 77969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 78069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 78169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onSaveInstanceState != NULL) { 78269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn size_t len = 0; 78308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jbyte* state = (jbyte*)code->callbacks.onSaveInstanceState(code, &len); 78408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (len > 0) { 78508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn array = env->NewByteArray(len); 78608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (array != NULL) { 78708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn env->SetByteArrayRegion(array, 0, len, state); 78808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 78908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 79008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (state != NULL) { 79108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn free(state); 79208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 79369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 79469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 79508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 79608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn return array; 79769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 79869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 79969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 80069969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonPause_native(JNIEnv* env, jobject clazz, jint handle) 80169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 802d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onPause_native"); 80369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 80469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 80569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onPause != NULL) { 806289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onPause(code); 80769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 80869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 80969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 81069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 81169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 81269969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonStop_native(JNIEnv* env, jobject clazz, jint handle) 81369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 814d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onStop_native"); 81569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 81669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 81769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onStop != NULL) { 818289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onStop(code); 81969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 82069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 82169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 82269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 82369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 82408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne HackbornonConfigurationChanged_native(JNIEnv* env, jobject clazz, jint handle) 82508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn{ 82608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn LOG_TRACE("onConfigurationChanged_native"); 82708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (handle != 0) { 82808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn NativeCode* code = (NativeCode*)handle; 82908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (code->callbacks.onConfigurationChanged != NULL) { 83008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn code->callbacks.onConfigurationChanged(code); 83108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 83208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 83308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn} 83408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 83508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic void 83669969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonLowMemory_native(JNIEnv* env, jobject clazz, jint handle) 83769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 838d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onLowMemory_native"); 83969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 84069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 84169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onLowMemory != NULL) { 842289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onLowMemory(code); 84369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 84469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 84569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 84669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 84769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 84869969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonWindowFocusChanged_native(JNIEnv* env, jobject clazz, jint handle, jboolean focused) 84969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 850d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onWindowFocusChanged_native"); 85169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 85269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 85369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onWindowFocusChanged != NULL) { 854289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onWindowFocusChanged(code, focused ? 1 : 0); 85569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 85669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 85769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 85869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 85974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 86074323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceCreated_native(JNIEnv* env, jobject clazz, jint handle, jobject surface) 86174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 862d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onSurfaceCreated_native"); 86374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 86474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 86574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->setSurface(surface); 86654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowCreated != NULL) { 867289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowCreated(code, 86854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->nativeWindow.get()); 86974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 87074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 87174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 87274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 873d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic int32_t getWindowProp(ANativeWindow* window, int what) { 874d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int value; 875d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int res = window->query(window, what, &value); 876d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return res < 0 ? res : value; 877d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 878d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 87974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 88074323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceChanged_native(JNIEnv* env, jobject clazz, jint handle, jobject surface, 88174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn jint format, jint width, jint height) 88274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 883d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onSurfaceChanged_native"); 88474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 88574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 88654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn sp<ANativeWindow> oldNativeWindow = code->nativeWindow; 88754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->setSurface(surface); 88854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (oldNativeWindow != code->nativeWindow) { 8898ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn if (oldNativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) { 890289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowDestroyed(code, 8918ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn oldNativeWindow.get()); 8928ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn } 893d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->nativeWindow != NULL) { 894d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onNativeWindowCreated != NULL) { 895d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowCreated(code, 896d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->nativeWindow.get()); 897d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 898d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->lastWindowWidth = getWindowProp(code->nativeWindow.get(), 899d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_WIDTH); 900d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->lastWindowHeight = getWindowProp(code->nativeWindow.get(), 901d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_HEIGHT); 902d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 903d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } else { 904d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn // Maybe it resized? 905d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t newWidth = getWindowProp(code->nativeWindow.get(), 906d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_WIDTH); 907d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t newHeight = getWindowProp(code->nativeWindow.get(), 908d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_HEIGHT); 909d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (newWidth != code->lastWindowWidth 910d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn || newHeight != code->lastWindowHeight) { 911d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onNativeWindowResized != NULL) { 912d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowResized(code, 913d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->nativeWindow.get()); 914d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 91554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn } 91674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 91774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 91874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 91974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 92074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 921d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne HackbornonSurfaceRedrawNeeded_native(JNIEnv* env, jobject clazz, jint handle) 922d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{ 923d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onSurfaceRedrawNeeded_native"); 924d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (handle != 0) { 925d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = (NativeCode*)handle; 926d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowRedrawNeeded != NULL) { 927d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowRedrawNeeded(code, code->nativeWindow.get()); 928d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 929d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 930d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 931d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 932d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void 93374323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jobject surface) 93474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 935d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onSurfaceDestroyed_native"); 93674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 93774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 93854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) { 939289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowDestroyed(code, 94054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->nativeWindow.get()); 94174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 94274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->setSurface(NULL); 94374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 94474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 94574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 946a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void 947a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne HackbornonInputChannelCreated_native(JNIEnv* env, jobject clazz, jint handle, jobject channel) 948a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{ 949d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onInputChannelCreated_native"); 950a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (handle != 0) { 951a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn NativeCode* code = (NativeCode*)handle; 952a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn status_t err = code->setInputChannel(channel); 953a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (err != OK) { 954a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", 955a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn "Error setting input channel"); 956a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn return; 957a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 958a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (code->callbacks.onInputQueueCreated != NULL) { 959289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onInputQueueCreated(code, 960a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn code->nativeInputQueue); 961a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 962a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 963a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} 964a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 965a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void 966a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne HackbornonInputChannelDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jobject channel) 967a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{ 968d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onInputChannelDestroyed_native"); 969a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (handle != 0) { 970a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn NativeCode* code = (NativeCode*)handle; 971a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (code->nativeInputQueue != NULL 972a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn && code->callbacks.onInputQueueDestroyed != NULL) { 973289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onInputQueueDestroyed(code, 974a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn code->nativeInputQueue); 975a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 976a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn code->setInputChannel(NULL); 977a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 978a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} 979a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 980d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void 981d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne HackbornonContentRectChanged_native(JNIEnv* env, jobject clazz, jint handle, 982d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jint x, jint y, jint w, jint h) 983d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{ 984d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onContentRectChanged_native"); 985d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (handle != 0) { 986d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = (NativeCode*)handle; 987d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onContentRectChanged != NULL) { 988d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ARect rect; 989d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.left = x; 990d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.top = y; 991d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.right = x+w; 992d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.bottom = y+h; 993d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onContentRectChanged(code, &rect); 994d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 995d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 996d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 997d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 998d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void 999d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne HackborndispatchKeyEvent_native(JNIEnv* env, jobject clazz, jint handle, jobject eventObj) 1000d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{ 1001d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("dispatchKeyEvent_native"); 1002d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (handle != 0) { 1003d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = (NativeCode*)handle; 1004d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->nativeInputQueue != NULL) { 10052c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn KeyEvent* event = code->nativeInputQueue->createKeyEvent(); 10061f2451007c660091b7b090c1ea332f9044515d2dJeff Brown status_t status = android_view_KeyEvent_toNative(env, eventObj, event); 10071f2451007c660091b7b090c1ea332f9044515d2dJeff Brown if (status) { 10081f2451007c660091b7b090c1ea332f9044515d2dJeff Brown delete event; 10091f2451007c660091b7b090c1ea332f9044515d2dJeff Brown jniThrowRuntimeException(env, "Could not read contents of KeyEvent object."); 10101f2451007c660091b7b090c1ea332f9044515d2dJeff Brown return; 10111f2451007c660091b7b090c1ea332f9044515d2dJeff Brown } 1012d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->nativeInputQueue->dispatchEvent(event); 1013d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 1014d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 1015d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 1016d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 10172c6081ce3593712f30dacd990a97209c791d6cedDianne Hackbornstatic void 10182c6081ce3593712f30dacd990a97209c791d6cedDianne HackbornfinishPreDispatchKeyEvent_native(JNIEnv* env, jobject clazz, jint handle, 10192c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn jint seq, jboolean handled) 10202c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn{ 10212c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn LOG_TRACE("finishPreDispatchKeyEvent_native"); 10222c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (handle != 0) { 10232c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn NativeCode* code = (NativeCode*)handle; 10242c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn if (code->nativeInputQueue != NULL) { 10252c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn code->nativeInputQueue->finishPreDispatch(seq, handled ? true : false); 10262c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 10272c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn } 10282c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn} 10292c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 103069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const JNINativeMethod g_methods[] = { 1031805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn { "loadNativeCode", "(Ljava/lang/String;Ljava/lang/String;Landroid/os/MessageQueue;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/content/res/AssetManager;[B)I", 1032682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn (void*)loadNativeCode_native }, 103369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "unloadNativeCode", "(I)V", (void*)unloadNativeCode_native }, 103469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onStartNative", "(I)V", (void*)onStart_native }, 103569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onResumeNative", "(I)V", (void*)onResume_native }, 103608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn { "onSaveInstanceStateNative", "(I)[B", (void*)onSaveInstanceState_native }, 103769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onPauseNative", "(I)V", (void*)onPause_native }, 103869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onStopNative", "(I)V", (void*)onStop_native }, 103908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn { "onConfigurationChangedNative", "(I)V", (void*)onConfigurationChanged_native }, 104069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onLowMemoryNative", "(I)V", (void*)onLowMemory_native }, 104169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onWindowFocusChangedNative", "(IZ)V", (void*)onWindowFocusChanged_native }, 104254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn { "onSurfaceCreatedNative", "(ILandroid/view/Surface;)V", (void*)onSurfaceCreated_native }, 104354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn { "onSurfaceChangedNative", "(ILandroid/view/Surface;III)V", (void*)onSurfaceChanged_native }, 1044d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn { "onSurfaceRedrawNeededNative", "(ILandroid/view/Surface;)V", (void*)onSurfaceRedrawNeeded_native }, 104554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn { "onSurfaceDestroyedNative", "(I)V", (void*)onSurfaceDestroyed_native }, 1046a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn { "onInputChannelCreatedNative", "(ILandroid/view/InputChannel;)V", (void*)onInputChannelCreated_native }, 1047a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn { "onInputChannelDestroyedNative", "(ILandroid/view/InputChannel;)V", (void*)onInputChannelDestroyed_native }, 1048d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn { "onContentRectChangedNative", "(IIIII)V", (void*)onContentRectChanged_native }, 1049d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn { "dispatchKeyEventNative", "(ILandroid/view/KeyEvent;)V", (void*)dispatchKeyEvent_native }, 10502c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn { "finishPreDispatchKeyEventNative", "(IIZ)V", (void*)finishPreDispatchKeyEvent_native }, 105169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}; 105269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 105369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const char* const kNativeActivityPathName = "android/app/NativeActivity"; 105469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 10553c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#define FIND_CLASS(var, className) \ 10563c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn var = env->FindClass(className); \ 10574f145c9674f814939cc91f699efe538b6c18cba0Patrick Scott LOG_FATAL_IF(! var, "Unable to find class %s", className); \ 10583c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn var = jclass(env->NewGlobalRef(var)); 10593c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 10603c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#define GET_METHOD_ID(var, clazz, methodName, fieldDescriptor) \ 10613c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn var = env->GetMethodID(clazz, methodName, fieldDescriptor); \ 10623c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn LOG_FATAL_IF(! var, "Unable to find method" methodName); 10633c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 106469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornint register_android_app_NativeActivity(JNIEnv* env) 106569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 106669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn //LOGD("register_android_app_NativeActivity"); 106769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 10683c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn FIND_CLASS(gNativeActivityClassInfo.clazz, kNativeActivityPathName); 106954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 10703c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.dispatchUnhandledKeyEvent, 10713c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn gNativeActivityClassInfo.clazz, 10723915bb845b032dc184dba5e60970b803390ca3edJeff Brown "dispatchUnhandledKeyEvent", "(Landroid/view/KeyEvent;)Z"); 10732c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.preDispatchKeyEvent, 10742c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn gNativeActivityClassInfo.clazz, 10752c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn "preDispatchKeyEvent", "(Landroid/view/KeyEvent;I)V"); 107654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 1077db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.finish, 1078db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn gNativeActivityClassInfo.clazz, 1079db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn "finish", "()V"); 108054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.setWindowFlags, 108154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn gNativeActivityClassInfo.clazz, 108254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn "setWindowFlags", "(II)V"); 108354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.setWindowFormat, 108454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn gNativeActivityClassInfo.clazz, 108554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn "setWindowFormat", "(I)V"); 1086d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.showIme, 1087d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn gNativeActivityClassInfo.clazz, 1088d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "showIme", "(I)V"); 1089d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.hideIme, 1090d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn gNativeActivityClassInfo.clazz, 1091d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "hideIme", "(I)V"); 109254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 109369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn return AndroidRuntime::registerNativeMethods( 109469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn env, kNativeActivityPathName, 109569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn g_methods, NELEM(g_methods)); 109669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 109769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 1098a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} // namespace android 1099