android_app_NativeActivity.cpp revision 048a0db7b512326d0fae0efa7fef7ea2d17a3dd8
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 24048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov#include <memory> 25048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov 26289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#include <android_runtime/android_app_NativeActivity.h> 276cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate#include <android_runtime/android_util_AssetManager.h> 288335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <android_runtime/android_view_Surface.h> 298335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <android_runtime/AndroidRuntime.h> 309d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/InputTransport.h> 318335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian 328335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <gui/Surface.h> 338335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian 348335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <system/window.h> 358335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian 364fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown#include <utils/Looper.h> 3769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 383c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "JNIHelp.h" 393c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "android_os_MessageQueue.h" 403c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "android_view_InputChannel.h" 413c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "android_view_KeyEvent.h" 4269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 4303c866020b46079afe895dd90f2d60bda06dbe05Yong WU#include "nativebridge/native_bridge.h" 44048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov#include "nativeloader/native_loader.h" 4503c866020b46079afe895dd90f2d60bda06dbe05Yong WU 46987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h" 47987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 48ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe 49db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn#define LOG_TRACE(...) 5028d9f024e043817212b15f04128d0464330502eaSteve Block//#define LOG_TRACE(...) ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__) 51d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 5269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornnamespace android 5369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 5469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 55ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampestatic const bool kLogTrace = false; 56ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe 573c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornstatic struct { 58db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn jmethodID finish; 5954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn jmethodID setWindowFlags; 6054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn jmethodID setWindowFormat; 61d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jmethodID showIme; 62d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jmethodID hideIme; 633c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} gNativeActivityClassInfo; 643c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 6554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 6654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 67289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstruct ActivityWork { 68289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t cmd; 69289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t arg1; 70289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t arg2; 71289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn}; 72289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 73289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornenum { 74a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright CMD_FINISH = 1, 75289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn CMD_SET_WINDOW_FORMAT, 76289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn CMD_SET_WINDOW_FLAGS, 77d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn CMD_SHOW_SOFT_INPUT, 78d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn CMD_HIDE_SOFT_INPUT, 79289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn}; 80289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 81289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstatic void write_work(int fd, int32_t cmd, int32_t arg1=0, int32_t arg2=0) { 82289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ActivityWork work; 83289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn work.cmd = cmd; 84289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn work.arg1 = arg1; 85289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn work.arg2 = arg2; 86ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe 87ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 88ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("write_work: cmd=%d", cmd); 89ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 90d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 91289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornrestart: 92289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int res = write(fd, &work, sizeof(work)); 93289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res < 0 && errno == EINTR) { 94289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn goto restart; 95289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 96289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 97289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res == sizeof(work)) return; 98289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 998564c8da817a845353d213acd8636b76f567b234Steve Block if (res < 0) ALOGW("Failed writing to work fd: %s", strerror(errno)); 1008564c8da817a845353d213acd8636b76f567b234Steve Block else ALOGW("Truncated writing to work fd: %d", res); 101289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 102289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 103289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstatic bool read_work(int fd, ActivityWork* outWork) { 104289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int res = read(fd, outWork, sizeof(ActivityWork)); 105289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn // no need to worry about EINTR, poll loop will just come back again. 106289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res == sizeof(ActivityWork)) return true; 107289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 1088564c8da817a845353d213acd8636b76f567b234Steve Block if (res < 0) ALOGW("Failed reading work fd: %s", strerror(errno)); 1098564c8da817a845353d213acd8636b76f567b234Steve Block else ALOGW("Truncated reading work fd: %d", res); 110289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn return false; 111289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 112289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 11354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn/* 11454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Native state for interacting with the NativeActivity class. 11554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn */ 116289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstruct NativeCode : public ANativeActivity { 1172e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn NativeCode(void* _dlhandle, ANativeActivity_createFunc* _createFunc) { 118d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn memset((ANativeActivity*)this, 0, sizeof(ANativeActivity)); 119d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn memset(&callbacks, 0, sizeof(callbacks)); 12074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn dlhandle = _dlhandle; 12174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn createActivityFunc = _createFunc; 12254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn nativeWindow = NULL; 1233c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mainWorkRead = mainWorkWrite = -1; 12474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 12574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 12674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn ~NativeCode() { 127289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (callbacks.onDestroy != NULL) { 128289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn callbacks.onDestroy(this); 129289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 130289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (env != NULL && clazz != NULL) { 131289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn env->DeleteGlobalRef(clazz); 1323c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 133603b44589682db3ff33ade172facb0c5e309f1beJeff Brown if (messageQueue != NULL && mainWorkRead >= 0) { 134603b44589682db3ff33ade172facb0c5e309f1beJeff Brown messageQueue->getLooper()->removeFd(mainWorkRead); 1353c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 136a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn setSurface(NULL); 1373c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mainWorkRead >= 0) close(mainWorkRead); 1383c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mainWorkWrite >= 0) close(mainWorkWrite); 13974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (dlhandle != NULL) { 14054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn // for now don't unload... we probably should clean this 14154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn // up and only keep one open dlhandle per proc, since there 14254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn // is really no benefit to unloading the code. 14354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn //dlclose(dlhandle); 14474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 14574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 14674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 14774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn void setSurface(jobject _surface) { 14874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (_surface != NULL) { 14964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown nativeWindow = android_view_Surface_getNativeWindow(env, _surface); 15074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } else { 15154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn nativeWindow = NULL; 15274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 15374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 15474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 1552e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn ANativeActivityCallbacks callbacks; 15669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 15769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn void* dlhandle; 1582e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn ANativeActivity_createFunc* createActivityFunc; 15974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 160805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn String8 internalDataPathObj; 161805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn String8 externalDataPathObj; 162805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn String8 obbPathObj; 163682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 16454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn sp<ANativeWindow> nativeWindow; 165d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t lastWindowWidth; 166d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t lastWindowHeight; 167d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 1683c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn // These are used to wake up the main thread to process work. 1693c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn int mainWorkRead; 1703c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn int mainWorkWrite; 171603b44589682db3ff33ade172facb0c5e309f1beJeff Brown sp<MessageQueue> messageQueue; 17269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}; 17369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 174db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackbornvoid android_NativeActivity_finish(ANativeActivity* activity) { 175db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 176db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn write_work(code->mainWorkWrite, CMD_FINISH, 0); 177db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn} 178db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn 179289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornvoid android_NativeActivity_setWindowFormat( 180289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ANativeActivity* activity, int32_t format) { 181289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 182289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn write_work(code->mainWorkWrite, CMD_SET_WINDOW_FORMAT, format); 183289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 184289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 185289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornvoid android_NativeActivity_setWindowFlags( 186289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ANativeActivity* activity, int32_t values, int32_t mask) { 187289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 188289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn write_work(code->mainWorkWrite, CMD_SET_WINDOW_FLAGS, values, mask); 189289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 190289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 191d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid android_NativeActivity_showSoftInput( 192d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ANativeActivity* activity, int32_t flags) { 193d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 194d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn write_work(code->mainWorkWrite, CMD_SHOW_SOFT_INPUT, flags); 195d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 196d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 197d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid android_NativeActivity_hideSoftInput( 198d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ANativeActivity* activity, int32_t flags) { 199d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 200d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn write_work(code->mainWorkWrite, CMD_HIDE_SOFT_INPUT, flags); 201d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 202d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 20354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 20454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 20554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn/* 20654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Callback for handling native events on the application's main thread. 20754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn */ 2084fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownstatic int mainWorkCallback(int fd, int events, void* data) { 2093c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn NativeCode* code = (NativeCode*)data; 210289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if ((events & POLLIN) == 0) { 2114fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown return 1; 212289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 213289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 214289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ActivityWork work; 215289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (!read_work(code->mainWorkRead, &work)) { 2164fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown return 1; 217289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 218d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 219ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 220ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("mainWorkCallback: cmd=%d", work.cmd); 221ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 222d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 223289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn switch (work.cmd) { 224db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn case CMD_FINISH: { 225db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn code->env->CallVoidMethod(code->clazz, gNativeActivityClassInfo.finish); 226603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->raiseAndClearException(code->env, "finish"); 227db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn } break; 228289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn case CMD_SET_WINDOW_FORMAT: { 229289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env->CallVoidMethod(code->clazz, 230289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn gNativeActivityClassInfo.setWindowFormat, work.arg1); 231603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->raiseAndClearException(code->env, "setWindowFormat"); 232289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } break; 233289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn case CMD_SET_WINDOW_FLAGS: { 234289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env->CallVoidMethod(code->clazz, 235289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn gNativeActivityClassInfo.setWindowFlags, work.arg1, work.arg2); 236603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->raiseAndClearException(code->env, "setWindowFlags"); 237289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } break; 238d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn case CMD_SHOW_SOFT_INPUT: { 239d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->env->CallVoidMethod(code->clazz, 240d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn gNativeActivityClassInfo.showIme, work.arg1); 241603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->raiseAndClearException(code->env, "showIme"); 242d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } break; 243d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn case CMD_HIDE_SOFT_INPUT: { 244d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->env->CallVoidMethod(code->clazz, 245d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn gNativeActivityClassInfo.hideIme, work.arg1); 246603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->raiseAndClearException(code->env, "hideIme"); 247d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } break; 248289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn default: 2498564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Unknown work command: %d", work.cmd); 250289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn break; 2513c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 2523c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 2534fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown return 1; 2543c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} 2553c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 25654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 25754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 25858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhatstatic jlong 259e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne HackbornloadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jstring funcName, 260805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn jobject messageQueue, jstring internalDataDir, jstring obbDir, 261048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov jstring externalDataDir, jint sdkVersion, jobject jAssetMgr, 262048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov jbyteArray savedState, jobject classLoader, jstring libraryPath, 263048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov jstring isolationPath) { 264ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 265ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("loadNativeCode_native"); 266ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 267d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 26869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn const char* pathStr = env->GetStringUTFChars(path, NULL); 269048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov std::unique_ptr<NativeCode> code; 27003c866020b46079afe895dd90f2d60bda06dbe05Yong WU bool needNativeBridge = false; 27103c866020b46079afe895dd90f2d60bda06dbe05Yong WU 272048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov void* handle = OpenNativeLibrary(env, sdkVersion, pathStr, classLoader, 273048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov libraryPath, isolationPath); 27403c866020b46079afe895dd90f2d60bda06dbe05Yong WU if (handle == NULL) { 27503c866020b46079afe895dd90f2d60bda06dbe05Yong WU if (NativeBridgeIsSupported(pathStr)) { 27603c866020b46079afe895dd90f2d60bda06dbe05Yong WU handle = NativeBridgeLoadLibrary(pathStr, RTLD_LAZY); 27703c866020b46079afe895dd90f2d60bda06dbe05Yong WU needNativeBridge = true; 27803c866020b46079afe895dd90f2d60bda06dbe05Yong WU } 27903c866020b46079afe895dd90f2d60bda06dbe05Yong WU } 28069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn env->ReleaseStringUTFChars(path, pathStr); 28103c866020b46079afe895dd90f2d60bda06dbe05Yong WU 28269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != NULL) { 28303c866020b46079afe895dd90f2d60bda06dbe05Yong WU void* funcPtr = NULL; 284e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn const char* funcStr = env->GetStringUTFChars(funcName, NULL); 28503c866020b46079afe895dd90f2d60bda06dbe05Yong WU if (needNativeBridge) { 28603c866020b46079afe895dd90f2d60bda06dbe05Yong WU funcPtr = NativeBridgeGetTrampoline(handle, funcStr, NULL, 0); 28703c866020b46079afe895dd90f2d60bda06dbe05Yong WU } else { 28803c866020b46079afe895dd90f2d60bda06dbe05Yong WU funcPtr = dlsym(handle, funcStr); 28903c866020b46079afe895dd90f2d60bda06dbe05Yong WU } 29003c866020b46079afe895dd90f2d60bda06dbe05Yong WU 291048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov code.reset(new NativeCode(handle, (ANativeActivity_createFunc*)funcPtr)); 292e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn env->ReleaseStringUTFChars(funcName, funcStr); 29303c866020b46079afe895dd90f2d60bda06dbe05Yong WU 29469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->createActivityFunc == NULL) { 2958564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("ANativeActivity_onCreate not found"); 29669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn return 0; 29769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 2983c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 299603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueue); 300603b44589682db3ff33ade172facb0c5e309f1beJeff Brown if (code->messageQueue == NULL) { 301603b44589682db3ff33ade172facb0c5e309f1beJeff Brown ALOGW("Unable to retrieve native MessageQueue"); 3023c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return 0; 3033c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 3043c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 3053c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn int msgpipe[2]; 3063c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (pipe(msgpipe)) { 3078564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("could not create pipe: %s", strerror(errno)); 3083c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return 0; 3093c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 3103c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn code->mainWorkRead = msgpipe[0]; 3113c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn code->mainWorkWrite = msgpipe[1]; 312d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int result = fcntl(code->mainWorkRead, F_SETFL, O_NONBLOCK); 313d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn SLOGW_IF(result != 0, "Could not make main work read pipe " 314d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "non-blocking: %s", strerror(errno)); 315d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn result = fcntl(code->mainWorkWrite, F_SETFL, O_NONBLOCK); 316d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn SLOGW_IF(result != 0, "Could not make main work write pipe " 317d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "non-blocking: %s", strerror(errno)); 318603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->getLooper()->addFd( 319048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov code->mainWorkRead, 0, ALOOPER_EVENT_INPUT, mainWorkCallback, code.get()); 3203c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 321289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->ANativeActivity::callbacks = &code->callbacks; 322289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (env->GetJavaVM(&code->vm) < 0) { 3238564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("NativeActivity GetJavaVM failed"); 3242e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn return 0; 3252e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn } 326289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env = env; 327289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->clazz = env->NewGlobalRef(clazz); 3286cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 329682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn const char* dirStr = env->GetStringUTFChars(internalDataDir, NULL); 330805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->internalDataPathObj = dirStr; 331805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->internalDataPath = code->internalDataPathObj.string(); 332805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn env->ReleaseStringUTFChars(internalDataDir, dirStr); 333682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 334e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey if (externalDataDir != NULL) { 335e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey dirStr = env->GetStringUTFChars(externalDataDir, NULL); 336e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey code->externalDataPathObj = dirStr; 337e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey env->ReleaseStringUTFChars(externalDataDir, dirStr); 338e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey } 339805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->externalDataPath = code->externalDataPathObj.string(); 3406cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 341289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->sdkVersion = sdkVersion; 342682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 3436cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate code->assetManager = assetManagerForJavaObject(env, jAssetMgr); 3446cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 345e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey if (obbDir != NULL) { 346e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey dirStr = env->GetStringUTFChars(obbDir, NULL); 347e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey code->obbPathObj = dirStr; 348e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey env->ReleaseStringUTFChars(obbDir, dirStr); 349e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey } 350805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->obbPath = code->obbPathObj.string(); 351805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn 35208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jbyte* rawSavedState = NULL; 35308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jsize rawSavedSize = 0; 35408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (savedState != NULL) { 35508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn rawSavedState = env->GetByteArrayElements(savedState, NULL); 35608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn rawSavedSize = env->GetArrayLength(savedState); 35708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 35808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 359048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov code->createActivityFunc(code.get(), rawSavedState, rawSavedSize); 36008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 36108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (rawSavedState != NULL) { 36208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn env->ReleaseByteArrayElements(savedState, rawSavedState, 0); 36308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 36469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 36569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 366048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov return (jlong)code.release(); 367048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov} 368048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov 369048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanovstatic jstring getDlError_native(JNIEnv* env, jobject clazz) { 370048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov return env->NewStringUTF(dlerror()); 37169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 37269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 37369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 37458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatunloadNativeCode_native(JNIEnv* env, jobject clazz, jlong handle) 37569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 376ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 377ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("unloadNativeCode_native"); 378ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 37969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 38069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 38169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn delete code; 38269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 38369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 38469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 38569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 38658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonStart_native(JNIEnv* env, jobject clazz, jlong handle) 38769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 388ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 389ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onStart_native"); 390ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 39169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 39269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 39369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onStart != NULL) { 394289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onStart(code); 39569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 39669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 39769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 39869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 39969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 40058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonResume_native(JNIEnv* env, jobject clazz, jlong handle) 40169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 402ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 403ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onResume_native"); 404ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 40569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 40669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 40769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onResume != NULL) { 408289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onResume(code); 40969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 41069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 41169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 41269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 41308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic jbyteArray 41458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSaveInstanceState_native(JNIEnv* env, jobject clazz, jlong handle) 41569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 416ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 417ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onSaveInstanceState_native"); 418ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 41908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 42008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jbyteArray array = NULL; 42108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 42269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 42369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 42469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onSaveInstanceState != NULL) { 42569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn size_t len = 0; 42608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jbyte* state = (jbyte*)code->callbacks.onSaveInstanceState(code, &len); 42708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (len > 0) { 42808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn array = env->NewByteArray(len); 42908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (array != NULL) { 43008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn env->SetByteArrayRegion(array, 0, len, state); 43108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 43208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 43308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (state != NULL) { 43408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn free(state); 43508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 43669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 43769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 43808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 43908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn return array; 44069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 44169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 44269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 44358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonPause_native(JNIEnv* env, jobject clazz, jlong handle) 44469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 445ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 446ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onPause_native"); 447ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 44869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 44969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 45069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onPause != NULL) { 451289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onPause(code); 45269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 45369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 45469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 45569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 45669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 45758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonStop_native(JNIEnv* env, jobject clazz, jlong handle) 45869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 459ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 460ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onStop_native"); 461ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 46269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 46369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 46469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onStop != NULL) { 465289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onStop(code); 46669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 46769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 46869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 46969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 47069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 47158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonConfigurationChanged_native(JNIEnv* env, jobject clazz, jlong handle) 47208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn{ 473ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 474ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onConfigurationChanged_native"); 475ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 47608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (handle != 0) { 47708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn NativeCode* code = (NativeCode*)handle; 47808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (code->callbacks.onConfigurationChanged != NULL) { 47908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn code->callbacks.onConfigurationChanged(code); 48008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 48108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 48208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn} 48308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 48408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic void 48558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonLowMemory_native(JNIEnv* env, jobject clazz, jlong handle) 48669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 487ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 488ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onLowMemory_native"); 489ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 49069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 49169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 49269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onLowMemory != NULL) { 493289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onLowMemory(code); 49469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 49569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 49669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 49769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 49869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 49958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonWindowFocusChanged_native(JNIEnv* env, jobject clazz, jlong handle, jboolean focused) 50069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 501ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 502ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onWindowFocusChanged_native"); 503ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 50469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 50569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 50669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onWindowFocusChanged != NULL) { 507289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onWindowFocusChanged(code, focused ? 1 : 0); 50869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 50969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 51069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 51169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 51274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 51358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceCreated_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface) 51474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 515ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 516ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onSurfaceCreated_native"); 517ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 51874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 51974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 52074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->setSurface(surface); 52154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowCreated != NULL) { 522289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowCreated(code, 52354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->nativeWindow.get()); 52474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 52574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 52674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 52774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 528d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic int32_t getWindowProp(ANativeWindow* window, int what) { 529d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int value; 530d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int res = window->query(window, what, &value); 531d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return res < 0 ? res : value; 532d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 533d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 53474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 53558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceChanged_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface, 53674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn jint format, jint width, jint height) 53774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 538ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 539ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onSurfaceChanged_native"); 540ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 54174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 54274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 54354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn sp<ANativeWindow> oldNativeWindow = code->nativeWindow; 54454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->setSurface(surface); 54554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (oldNativeWindow != code->nativeWindow) { 5468ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn if (oldNativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) { 547289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowDestroyed(code, 5488ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn oldNativeWindow.get()); 5498ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn } 550d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->nativeWindow != NULL) { 551d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onNativeWindowCreated != NULL) { 552d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowCreated(code, 553d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->nativeWindow.get()); 554d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 555d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->lastWindowWidth = getWindowProp(code->nativeWindow.get(), 556d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_WIDTH); 557d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->lastWindowHeight = getWindowProp(code->nativeWindow.get(), 558d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_HEIGHT); 559d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 560d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } else { 561d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn // Maybe it resized? 562d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t newWidth = getWindowProp(code->nativeWindow.get(), 563d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_WIDTH); 564d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t newHeight = getWindowProp(code->nativeWindow.get(), 565d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_HEIGHT); 566d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (newWidth != code->lastWindowWidth 567d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn || newHeight != code->lastWindowHeight) { 568d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onNativeWindowResized != NULL) { 569d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowResized(code, 570d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->nativeWindow.get()); 571d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 57254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn } 57374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 57474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 57574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 57674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 57774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 57858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceRedrawNeeded_native(JNIEnv* env, jobject clazz, jlong handle) 579d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{ 580ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 581ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onSurfaceRedrawNeeded_native"); 582ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 583d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (handle != 0) { 584d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = (NativeCode*)handle; 585d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowRedrawNeeded != NULL) { 586d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowRedrawNeeded(code, code->nativeWindow.get()); 587d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 588d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 589d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 590d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 591d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void 59258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceDestroyed_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface) 59374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 594ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 595ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onSurfaceDestroyed_native"); 596ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 59774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 59874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 59954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) { 600289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowDestroyed(code, 60154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->nativeWindow.get()); 60274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 60374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->setSurface(NULL); 60474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 60574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 60674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 607a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void 60858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonInputQueueCreated_native(JNIEnv* env, jobject clazz, jlong handle, jlong queuePtr) 609a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{ 610ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 611ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onInputChannelCreated_native"); 612ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 613a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (handle != 0) { 614a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn NativeCode* code = (NativeCode*)handle; 615a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (code->callbacks.onInputQueueCreated != NULL) { 616a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr); 617a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright code->callbacks.onInputQueueCreated(code, queue); 618a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 619a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 620a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} 621a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 622a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void 62358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonInputQueueDestroyed_native(JNIEnv* env, jobject clazz, jlong handle, jlong queuePtr) 624a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{ 625ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 626ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onInputChannelDestroyed_native"); 627ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 628a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (handle != 0) { 629a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn NativeCode* code = (NativeCode*)handle; 630a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright if (code->callbacks.onInputQueueDestroyed != NULL) { 631a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr); 632a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright code->callbacks.onInputQueueDestroyed(code, queue); 633a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 634a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 635a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} 636a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 637d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void 63858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonContentRectChanged_native(JNIEnv* env, jobject clazz, jlong handle, 639d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jint x, jint y, jint w, jint h) 640d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{ 641ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 642ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onContentRectChanged_native"); 643ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 644d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (handle != 0) { 645d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = (NativeCode*)handle; 646d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onContentRectChanged != NULL) { 647d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ARect rect; 648d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.left = x; 649d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.top = y; 650d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.right = x+w; 651d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.bottom = y+h; 652d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onContentRectChanged(code, &rect); 653d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 654d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 655d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 656d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 65769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const JNINativeMethod g_methods[] = { 658048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov { "loadNativeCode", 659048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov "(Ljava/lang/String;Ljava/lang/String;Landroid/os/MessageQueue;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/content/res/AssetManager;[BLjava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;)J", 660048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov (void*)loadNativeCode_native }, 661048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov { "getDlError", "()Ljava/lang/String;", (void*) getDlError_native }, 66258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "unloadNativeCode", "(J)V", (void*)unloadNativeCode_native }, 66358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onStartNative", "(J)V", (void*)onStart_native }, 66458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onResumeNative", "(J)V", (void*)onResume_native }, 66558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onSaveInstanceStateNative", "(J)[B", (void*)onSaveInstanceState_native }, 66658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onPauseNative", "(J)V", (void*)onPause_native }, 66758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onStopNative", "(J)V", (void*)onStop_native }, 66858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onConfigurationChangedNative", "(J)V", (void*)onConfigurationChanged_native }, 66958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onLowMemoryNative", "(J)V", (void*)onLowMemory_native }, 67058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onWindowFocusChangedNative", "(JZ)V", (void*)onWindowFocusChanged_native }, 67158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onSurfaceCreatedNative", "(JLandroid/view/Surface;)V", (void*)onSurfaceCreated_native }, 67258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onSurfaceChangedNative", "(JLandroid/view/Surface;III)V", (void*)onSurfaceChanged_native }, 67358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onSurfaceRedrawNeededNative", "(JLandroid/view/Surface;)V", (void*)onSurfaceRedrawNeeded_native }, 67458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onSurfaceDestroyedNative", "(J)V", (void*)onSurfaceDestroyed_native }, 67558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onInputQueueCreatedNative", "(JJ)V", 676a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright (void*)onInputQueueCreated_native }, 67758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onInputQueueDestroyedNative", "(JJ)V", 678a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright (void*)onInputQueueDestroyed_native }, 67958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onContentRectChangedNative", "(JIIII)V", (void*)onContentRectChanged_native }, 68069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}; 68169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 68269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const char* const kNativeActivityPathName = "android/app/NativeActivity"; 68369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 68469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornint register_android_app_NativeActivity(JNIEnv* env) 68569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 6865baa3a62a97544669fba6d65a11c07f252e654ddSteve Block //ALOGD("register_android_app_NativeActivity"); 687987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe jclass clazz = FindClassOrDie(env, kNativeActivityPathName); 688987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 689987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNativeActivityClassInfo.finish = GetMethodIDOrDie(env, clazz, "finish", "()V"); 690987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNativeActivityClassInfo.setWindowFlags = GetMethodIDOrDie(env, clazz, "setWindowFlags", 691987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(II)V"); 692987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNativeActivityClassInfo.setWindowFormat = GetMethodIDOrDie(env, clazz, "setWindowFormat", 693987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(I)V"); 694987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNativeActivityClassInfo.showIme = GetMethodIDOrDie(env, clazz, "showIme", "(I)V"); 695987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNativeActivityClassInfo.hideIme = GetMethodIDOrDie(env, clazz, "hideIme", "(I)V"); 696987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 697987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe return RegisterMethodsOrDie(env, kNativeActivityPathName, g_methods, NELEM(g_methods)); 69869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 69969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 700a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} // namespace android 701