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 246f06ad7df1362e9e5b252689f452bdeee2e5af46Dmitriy Ivanov#include <memory> 256f06ad7df1362e9e5b252689f452bdeee2e5af46Dmitriy 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" 446f06ad7df1362e9e5b252689f452bdeee2e5af46Dmitriy Ivanov#include "nativeloader/native_loader.h" 4503c866020b46079afe895dd90f2d60bda06dbe05Yong WU 46987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h" 47987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 48569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov#include "ScopedUtfChars.h" 49ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe 50db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn#define LOG_TRACE(...) 5128d9f024e043817212b15f04128d0464330502eaSteve Block//#define LOG_TRACE(...) ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__) 52d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 5369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornnamespace android 5469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 5569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 56ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampestatic const bool kLogTrace = false; 57ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe 583c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornstatic struct { 59db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn jmethodID finish; 6054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn jmethodID setWindowFlags; 6154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn jmethodID setWindowFormat; 62d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jmethodID showIme; 63d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jmethodID hideIme; 643c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} gNativeActivityClassInfo; 653c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 6654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 6754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 68289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstruct ActivityWork { 69289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t cmd; 70289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t arg1; 71289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t arg2; 72289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn}; 73289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 74289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornenum { 75a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright CMD_FINISH = 1, 76289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn CMD_SET_WINDOW_FORMAT, 77289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn CMD_SET_WINDOW_FLAGS, 78d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn CMD_SHOW_SOFT_INPUT, 79d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn CMD_HIDE_SOFT_INPUT, 80289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn}; 81289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 82289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstatic void write_work(int fd, int32_t cmd, int32_t arg1=0, int32_t arg2=0) { 83289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ActivityWork work; 84289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn work.cmd = cmd; 85289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn work.arg1 = arg1; 86289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn work.arg2 = arg2; 87ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe 88ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 89ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("write_work: cmd=%d", cmd); 90ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 91d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 92289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornrestart: 93289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int res = write(fd, &work, sizeof(work)); 94289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res < 0 && errno == EINTR) { 95289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn goto restart; 96289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 97289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 98289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res == sizeof(work)) return; 99289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 1008564c8da817a845353d213acd8636b76f567b234Steve Block if (res < 0) ALOGW("Failed writing to work fd: %s", strerror(errno)); 1018564c8da817a845353d213acd8636b76f567b234Steve Block else ALOGW("Truncated writing to work fd: %d", res); 102289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 103289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 104289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstatic bool read_work(int fd, ActivityWork* outWork) { 105289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int res = read(fd, outWork, sizeof(ActivityWork)); 106289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn // no need to worry about EINTR, poll loop will just come back again. 107289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res == sizeof(ActivityWork)) return true; 108289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 1098564c8da817a845353d213acd8636b76f567b234Steve Block if (res < 0) ALOGW("Failed reading work fd: %s", strerror(errno)); 1108564c8da817a845353d213acd8636b76f567b234Steve Block else ALOGW("Truncated reading work fd: %d", res); 111289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn return false; 112289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 113289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 11454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn/* 11554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Native state for interacting with the NativeActivity class. 11654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn */ 117289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstruct NativeCode : public ANativeActivity { 1182e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn NativeCode(void* _dlhandle, ANativeActivity_createFunc* _createFunc) { 119d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn memset((ANativeActivity*)this, 0, sizeof(ANativeActivity)); 120d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn memset(&callbacks, 0, sizeof(callbacks)); 12174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn dlhandle = _dlhandle; 12274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn createActivityFunc = _createFunc; 12354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn nativeWindow = NULL; 1243c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mainWorkRead = mainWorkWrite = -1; 12574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 12674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 12774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn ~NativeCode() { 128289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (callbacks.onDestroy != NULL) { 129289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn callbacks.onDestroy(this); 130289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 1315c690d55dd2d0286db1ba3331a64769c07636ff8Adam Lesinski if (env != NULL) { 1325c690d55dd2d0286db1ba3331a64769c07636ff8Adam Lesinski if (clazz != NULL) { 133289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn env->DeleteGlobalRef(clazz); 1345c690d55dd2d0286db1ba3331a64769c07636ff8Adam Lesinski } 1355c690d55dd2d0286db1ba3331a64769c07636ff8Adam Lesinski if (javaAssetManager != NULL) { 1365c690d55dd2d0286db1ba3331a64769c07636ff8Adam Lesinski env->DeleteGlobalRef(javaAssetManager); 1375c690d55dd2d0286db1ba3331a64769c07636ff8Adam Lesinski } 1383c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 139603b44589682db3ff33ade172facb0c5e309f1beJeff Brown if (messageQueue != NULL && mainWorkRead >= 0) { 140603b44589682db3ff33ade172facb0c5e309f1beJeff Brown messageQueue->getLooper()->removeFd(mainWorkRead); 1413c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 142a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn setSurface(NULL); 1433c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mainWorkRead >= 0) close(mainWorkRead); 1443c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mainWorkWrite >= 0) close(mainWorkWrite); 14574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (dlhandle != NULL) { 14654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn // for now don't unload... we probably should clean this 14754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn // up and only keep one open dlhandle per proc, since there 14854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn // is really no benefit to unloading the code. 14954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn //dlclose(dlhandle); 15074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 15174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 15274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 15374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn void setSurface(jobject _surface) { 15474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (_surface != NULL) { 15564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown nativeWindow = android_view_Surface_getNativeWindow(env, _surface); 15674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } else { 15754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn nativeWindow = NULL; 15874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 15974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 16074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 1612e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn ANativeActivityCallbacks callbacks; 16269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 16369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn void* dlhandle; 1642e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn ANativeActivity_createFunc* createActivityFunc; 16574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 166805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn String8 internalDataPathObj; 167805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn String8 externalDataPathObj; 168805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn String8 obbPathObj; 169682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 17054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn sp<ANativeWindow> nativeWindow; 171d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t lastWindowWidth; 172d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t lastWindowHeight; 173d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 1743c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn // These are used to wake up the main thread to process work. 1753c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn int mainWorkRead; 1763c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn int mainWorkWrite; 177603b44589682db3ff33ade172facb0c5e309f1beJeff Brown sp<MessageQueue> messageQueue; 1785c690d55dd2d0286db1ba3331a64769c07636ff8Adam Lesinski 1795c690d55dd2d0286db1ba3331a64769c07636ff8Adam Lesinski // Need to hold on to a reference here in case the upper layers destroy our 1805c690d55dd2d0286db1ba3331a64769c07636ff8Adam Lesinski // AssetManager. 1815c690d55dd2d0286db1ba3331a64769c07636ff8Adam Lesinski jobject javaAssetManager; 18269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}; 18369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 184db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackbornvoid android_NativeActivity_finish(ANativeActivity* activity) { 185db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 186db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn write_work(code->mainWorkWrite, CMD_FINISH, 0); 187db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn} 188db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn 189289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornvoid android_NativeActivity_setWindowFormat( 190289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ANativeActivity* activity, int32_t format) { 191289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 192289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn write_work(code->mainWorkWrite, CMD_SET_WINDOW_FORMAT, format); 193289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 194289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 195289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornvoid android_NativeActivity_setWindowFlags( 196289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ANativeActivity* activity, int32_t values, int32_t mask) { 197289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 198289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn write_work(code->mainWorkWrite, CMD_SET_WINDOW_FLAGS, values, mask); 199289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 200289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 201d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid android_NativeActivity_showSoftInput( 202d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ANativeActivity* activity, int32_t flags) { 203d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 204d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn write_work(code->mainWorkWrite, CMD_SHOW_SOFT_INPUT, flags); 205d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 206d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 207d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid android_NativeActivity_hideSoftInput( 208d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ANativeActivity* activity, int32_t flags) { 209d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 210d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn write_work(code->mainWorkWrite, CMD_HIDE_SOFT_INPUT, flags); 211d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 212d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 21354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 21454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 21554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn/* 21654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Callback for handling native events on the application's main thread. 21754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn */ 2184fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownstatic int mainWorkCallback(int fd, int events, void* data) { 2193c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn NativeCode* code = (NativeCode*)data; 220289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if ((events & POLLIN) == 0) { 2214fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown return 1; 222289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 223289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 224289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ActivityWork work; 225289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (!read_work(code->mainWorkRead, &work)) { 2264fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown return 1; 227289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 228d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 229ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 230ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("mainWorkCallback: cmd=%d", work.cmd); 231ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 232d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 233289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn switch (work.cmd) { 234db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn case CMD_FINISH: { 235db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn code->env->CallVoidMethod(code->clazz, gNativeActivityClassInfo.finish); 236603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->raiseAndClearException(code->env, "finish"); 237db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn } break; 238289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn case CMD_SET_WINDOW_FORMAT: { 239289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env->CallVoidMethod(code->clazz, 240289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn gNativeActivityClassInfo.setWindowFormat, work.arg1); 241603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->raiseAndClearException(code->env, "setWindowFormat"); 242289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } break; 243289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn case CMD_SET_WINDOW_FLAGS: { 244289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env->CallVoidMethod(code->clazz, 245289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn gNativeActivityClassInfo.setWindowFlags, work.arg1, work.arg2); 246603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->raiseAndClearException(code->env, "setWindowFlags"); 247289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } break; 248d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn case CMD_SHOW_SOFT_INPUT: { 249d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->env->CallVoidMethod(code->clazz, 250d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn gNativeActivityClassInfo.showIme, work.arg1); 251603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->raiseAndClearException(code->env, "showIme"); 252d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } break; 253d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn case CMD_HIDE_SOFT_INPUT: { 254d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->env->CallVoidMethod(code->clazz, 255d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn gNativeActivityClassInfo.hideIme, work.arg1); 256603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->raiseAndClearException(code->env, "hideIme"); 257d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } break; 258289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn default: 2598564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Unknown work command: %d", work.cmd); 260289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn break; 2613c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 2623c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 2634fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown return 1; 2643c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} 2653c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 26654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 26754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 26858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhatstatic jlong 269e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne HackbornloadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jstring funcName, 270805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn jobject messageQueue, jstring internalDataDir, jstring obbDir, 2716f06ad7df1362e9e5b252689f452bdeee2e5af46Dmitriy Ivanov jstring externalDataDir, jint sdkVersion, jobject jAssetMgr, 272ea90281082b42a2c71d33e25bc369e5eed44ed52Dimitry Ivanov jbyteArray savedState, jobject classLoader, jstring libraryPath) { 273ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 274ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("loadNativeCode_native"); 275ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 276d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 277569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov ScopedUtfChars pathStr(env, path); 2786f06ad7df1362e9e5b252689f452bdeee2e5af46Dmitriy Ivanov std::unique_ptr<NativeCode> code; 279569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov bool needs_native_bridge = false; 280569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov std::string error_msg; 281569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov 282569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov void* handle = OpenNativeLibrary(env, 283569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov sdkVersion, 284569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov pathStr.c_str(), 285569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov classLoader, 286569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov libraryPath, 287569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov &needs_native_bridge, 288569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov &error_msg); 289569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov 290569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov if (handle == nullptr) { 291569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov ALOGW("NativeActivity LoadNativeLibrary(\"%s\") failed: %s", 292569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov pathStr.c_str(), 293569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov error_msg.c_str()); 294569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov return 0; 295569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov } 29603c866020b46079afe895dd90f2d60bda06dbe05Yong WU 297569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov void* funcPtr = NULL; 298569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov const char* funcStr = env->GetStringUTFChars(funcName, NULL); 299569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov if (needs_native_bridge) { 300569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov funcPtr = NativeBridgeGetTrampoline(handle, funcStr, NULL, 0); 301569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov } else { 302569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov funcPtr = dlsym(handle, funcStr); 30303c866020b46079afe895dd90f2d60bda06dbe05Yong WU } 30403c866020b46079afe895dd90f2d60bda06dbe05Yong WU 305569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code.reset(new NativeCode(handle, (ANativeActivity_createFunc*)funcPtr)); 306569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov env->ReleaseStringUTFChars(funcName, funcStr); 30703c866020b46079afe895dd90f2d60bda06dbe05Yong WU 308569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov if (code->createActivityFunc == NULL) { 309569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov ALOGW("ANativeActivity_onCreate not found"); 310569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov return 0; 311569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov } 31203c866020b46079afe895dd90f2d60bda06dbe05Yong WU 313569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueue); 314569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov if (code->messageQueue == NULL) { 315569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov ALOGW("Unable to retrieve native MessageQueue"); 316569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov return 0; 317569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov } 3186cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 319569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov int msgpipe[2]; 320569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov if (pipe(msgpipe)) { 321569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov ALOGW("could not create pipe: %s", strerror(errno)); 322569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov return 0; 323569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov } 324569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->mainWorkRead = msgpipe[0]; 325569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->mainWorkWrite = msgpipe[1]; 326569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov int result = fcntl(code->mainWorkRead, F_SETFL, O_NONBLOCK); 327569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov SLOGW_IF(result != 0, "Could not make main work read pipe " 328569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov "non-blocking: %s", strerror(errno)); 329569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov result = fcntl(code->mainWorkWrite, F_SETFL, O_NONBLOCK); 330569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov SLOGW_IF(result != 0, "Could not make main work write pipe " 331569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov "non-blocking: %s", strerror(errno)); 332569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->messageQueue->getLooper()->addFd( 333569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->mainWorkRead, 0, ALOOPER_EVENT_INPUT, mainWorkCallback, code.get()); 334569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov 335569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->ANativeActivity::callbacks = &code->callbacks; 336569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov if (env->GetJavaVM(&code->vm) < 0) { 337569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov ALOGW("NativeActivity GetJavaVM failed"); 338569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov return 0; 339569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov } 340569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->env = env; 341569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->clazz = env->NewGlobalRef(clazz); 342569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov 343569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov const char* dirStr = env->GetStringUTFChars(internalDataDir, NULL); 344569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->internalDataPathObj = dirStr; 345569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->internalDataPath = code->internalDataPathObj.string(); 346569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov env->ReleaseStringUTFChars(internalDataDir, dirStr); 347569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov 348569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov if (externalDataDir != NULL) { 349569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov dirStr = env->GetStringUTFChars(externalDataDir, NULL); 350569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->externalDataPathObj = dirStr; 351569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov env->ReleaseStringUTFChars(externalDataDir, dirStr); 352569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov } 353569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->externalDataPath = code->externalDataPathObj.string(); 3546cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 355569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->sdkVersion = sdkVersion; 3566cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 3575c690d55dd2d0286db1ba3331a64769c07636ff8Adam Lesinski code->javaAssetManager = env->NewGlobalRef(jAssetMgr); 358569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->assetManager = assetManagerForJavaObject(env, jAssetMgr); 359805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn 360569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov if (obbDir != NULL) { 361569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov dirStr = env->GetStringUTFChars(obbDir, NULL); 362569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->obbPathObj = dirStr; 363569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov env->ReleaseStringUTFChars(obbDir, dirStr); 364569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov } 365569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->obbPath = code->obbPathObj.string(); 36608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 367569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov jbyte* rawSavedState = NULL; 368569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov jsize rawSavedSize = 0; 369569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov if (savedState != NULL) { 370569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov rawSavedState = env->GetByteArrayElements(savedState, NULL); 371569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov rawSavedSize = env->GetArrayLength(savedState); 372569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov } 37308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 374569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov code->createActivityFunc(code.get(), rawSavedState, rawSavedSize); 375569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov 376569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov if (rawSavedState != NULL) { 377569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov env->ReleaseByteArrayElements(savedState, rawSavedState, 0); 37869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 379569834d86112d8032abb15f60f135544bc101d86Dimitry Ivanov 3806f06ad7df1362e9e5b252689f452bdeee2e5af46Dmitriy Ivanov return (jlong)code.release(); 3816f06ad7df1362e9e5b252689f452bdeee2e5af46Dmitriy Ivanov} 3826f06ad7df1362e9e5b252689f452bdeee2e5af46Dmitriy Ivanov 3836f06ad7df1362e9e5b252689f452bdeee2e5af46Dmitriy Ivanovstatic jstring getDlError_native(JNIEnv* env, jobject clazz) { 3846f06ad7df1362e9e5b252689f452bdeee2e5af46Dmitriy Ivanov return env->NewStringUTF(dlerror()); 38569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 38669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 38769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 38858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatunloadNativeCode_native(JNIEnv* env, jobject clazz, jlong handle) 38969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 390ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 391ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("unloadNativeCode_native"); 392ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 39369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 39469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 39569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn delete code; 39669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 39769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 39869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 39969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 40058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonStart_native(JNIEnv* env, jobject clazz, jlong handle) 40169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 402ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 403ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onStart_native"); 404ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 40569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 40669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 40769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onStart != NULL) { 408289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onStart(code); 40969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 41069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 41169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 41269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 41369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 41458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonResume_native(JNIEnv* env, jobject clazz, jlong handle) 41569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 416ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 417ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onResume_native"); 418ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 41969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 42069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 42169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onResume != NULL) { 422289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onResume(code); 42369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 42469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 42569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 42669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 42708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic jbyteArray 42858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSaveInstanceState_native(JNIEnv* env, jobject clazz, jlong handle) 42969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 430ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 431ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onSaveInstanceState_native"); 432ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 43308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 43408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jbyteArray array = NULL; 43508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 43669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 43769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 43869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onSaveInstanceState != NULL) { 43969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn size_t len = 0; 44008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jbyte* state = (jbyte*)code->callbacks.onSaveInstanceState(code, &len); 44108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (len > 0) { 44208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn array = env->NewByteArray(len); 44308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (array != NULL) { 44408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn env->SetByteArrayRegion(array, 0, len, state); 44508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 44608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 44708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (state != NULL) { 44808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn free(state); 44908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 45069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 45169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 45208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 45308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn return array; 45469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 45569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 45669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 45758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonPause_native(JNIEnv* env, jobject clazz, jlong handle) 45869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 459ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 460ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onPause_native"); 461ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 46269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 46369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 46469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onPause != NULL) { 465289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onPause(code); 46669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 46769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 46869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 46969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 47069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 47158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonStop_native(JNIEnv* env, jobject clazz, jlong handle) 47269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 473ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 474ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onStop_native"); 475ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 47669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 47769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 47869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onStop != NULL) { 479289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onStop(code); 48069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 48169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 48269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 48369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 48469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 48558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonConfigurationChanged_native(JNIEnv* env, jobject clazz, jlong handle) 48608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn{ 487ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 488ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onConfigurationChanged_native"); 489ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 49008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (handle != 0) { 49108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn NativeCode* code = (NativeCode*)handle; 49208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (code->callbacks.onConfigurationChanged != NULL) { 49308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn code->callbacks.onConfigurationChanged(code); 49408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 49508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 49608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn} 49708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 49808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic void 49958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonLowMemory_native(JNIEnv* env, jobject clazz, jlong handle) 50069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 501ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 502ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onLowMemory_native"); 503ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 50469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 50569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 50669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onLowMemory != NULL) { 507289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onLowMemory(code); 50869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 50969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 51069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 51169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 51269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 51358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonWindowFocusChanged_native(JNIEnv* env, jobject clazz, jlong handle, jboolean focused) 51469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 515ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 516ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onWindowFocusChanged_native"); 517ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 51869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 51969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 52069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onWindowFocusChanged != NULL) { 521289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onWindowFocusChanged(code, focused ? 1 : 0); 52269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 52369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 52469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 52569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 52674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 52758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceCreated_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface) 52874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 529ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 530ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onSurfaceCreated_native"); 531ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 53274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 53374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 53474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->setSurface(surface); 53554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowCreated != NULL) { 536289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowCreated(code, 53754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->nativeWindow.get()); 53874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 53974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 54074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 54174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 542d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic int32_t getWindowProp(ANativeWindow* window, int what) { 543d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int value; 544d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int res = window->query(window, what, &value); 545d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return res < 0 ? res : value; 546d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 547d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 54874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 54958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceChanged_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface, 55074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn jint format, jint width, jint height) 55174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 552ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 553ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onSurfaceChanged_native"); 554ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 55574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 55674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 55754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn sp<ANativeWindow> oldNativeWindow = code->nativeWindow; 55854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->setSurface(surface); 55954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (oldNativeWindow != code->nativeWindow) { 5608ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn if (oldNativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) { 561289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowDestroyed(code, 5628ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn oldNativeWindow.get()); 5638ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn } 564d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->nativeWindow != NULL) { 565d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onNativeWindowCreated != NULL) { 566d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowCreated(code, 567d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->nativeWindow.get()); 568d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 569d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->lastWindowWidth = getWindowProp(code->nativeWindow.get(), 570d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_WIDTH); 571d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->lastWindowHeight = getWindowProp(code->nativeWindow.get(), 572d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_HEIGHT); 573d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 574d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } else { 575d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn // Maybe it resized? 576d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t newWidth = getWindowProp(code->nativeWindow.get(), 577d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_WIDTH); 578d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t newHeight = getWindowProp(code->nativeWindow.get(), 579d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_HEIGHT); 580d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (newWidth != code->lastWindowWidth 581d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn || newHeight != code->lastWindowHeight) { 582d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onNativeWindowResized != NULL) { 583d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowResized(code, 584d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->nativeWindow.get()); 585d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 58654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn } 58774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 58874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 58974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 59074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 59174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 59258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceRedrawNeeded_native(JNIEnv* env, jobject clazz, jlong handle) 593d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{ 594ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 595ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onSurfaceRedrawNeeded_native"); 596ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 597d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (handle != 0) { 598d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = (NativeCode*)handle; 599d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowRedrawNeeded != NULL) { 600d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowRedrawNeeded(code, code->nativeWindow.get()); 601d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 602d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 603d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 604d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 605d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void 60658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceDestroyed_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface) 60774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 608ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 609ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onSurfaceDestroyed_native"); 610ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 61174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 61274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 61354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) { 614289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowDestroyed(code, 61554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->nativeWindow.get()); 61674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 61774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->setSurface(NULL); 61874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 61974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 62074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 621a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void 62258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonInputQueueCreated_native(JNIEnv* env, jobject clazz, jlong handle, jlong queuePtr) 623a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{ 624ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 625ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onInputChannelCreated_native"); 626ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 627a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (handle != 0) { 628a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn NativeCode* code = (NativeCode*)handle; 629a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (code->callbacks.onInputQueueCreated != NULL) { 630a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr); 631a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright code->callbacks.onInputQueueCreated(code, queue); 632a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 633a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 634a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} 635a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 636a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void 63758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonInputQueueDestroyed_native(JNIEnv* env, jobject clazz, jlong handle, jlong queuePtr) 638a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{ 639ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 640ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onInputChannelDestroyed_native"); 641ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 642a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (handle != 0) { 643a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn NativeCode* code = (NativeCode*)handle; 644a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright if (code->callbacks.onInputQueueDestroyed != NULL) { 645a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr); 646a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright code->callbacks.onInputQueueDestroyed(code, queue); 647a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 648a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 649a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} 650a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 651d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void 65258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonContentRectChanged_native(JNIEnv* env, jobject clazz, jlong handle, 653d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jint x, jint y, jint w, jint h) 654d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{ 655ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 656ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onContentRectChanged_native"); 657ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 658d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (handle != 0) { 659d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = (NativeCode*)handle; 660d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onContentRectChanged != NULL) { 661d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ARect rect; 662d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.left = x; 663d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.top = y; 664d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.right = x+w; 665d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.bottom = y+h; 666d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onContentRectChanged(code, &rect); 667d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 668d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 669d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 670d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 67169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const JNINativeMethod g_methods[] = { 6726f06ad7df1362e9e5b252689f452bdeee2e5af46Dmitriy Ivanov { "loadNativeCode", 673ea90281082b42a2c71d33e25bc369e5eed44ed52Dimitry 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;)J", 6746f06ad7df1362e9e5b252689f452bdeee2e5af46Dmitriy Ivanov (void*)loadNativeCode_native }, 6756f06ad7df1362e9e5b252689f452bdeee2e5af46Dmitriy Ivanov { "getDlError", "()Ljava/lang/String;", (void*) getDlError_native }, 67658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "unloadNativeCode", "(J)V", (void*)unloadNativeCode_native }, 67758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onStartNative", "(J)V", (void*)onStart_native }, 67858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onResumeNative", "(J)V", (void*)onResume_native }, 67958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onSaveInstanceStateNative", "(J)[B", (void*)onSaveInstanceState_native }, 68058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onPauseNative", "(J)V", (void*)onPause_native }, 68158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onStopNative", "(J)V", (void*)onStop_native }, 68258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onConfigurationChangedNative", "(J)V", (void*)onConfigurationChanged_native }, 68358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onLowMemoryNative", "(J)V", (void*)onLowMemory_native }, 68458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onWindowFocusChangedNative", "(JZ)V", (void*)onWindowFocusChanged_native }, 68558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onSurfaceCreatedNative", "(JLandroid/view/Surface;)V", (void*)onSurfaceCreated_native }, 68658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onSurfaceChangedNative", "(JLandroid/view/Surface;III)V", (void*)onSurfaceChanged_native }, 68758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onSurfaceRedrawNeededNative", "(JLandroid/view/Surface;)V", (void*)onSurfaceRedrawNeeded_native }, 68858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onSurfaceDestroyedNative", "(J)V", (void*)onSurfaceDestroyed_native }, 68958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onInputQueueCreatedNative", "(JJ)V", 690a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright (void*)onInputQueueCreated_native }, 69158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onInputQueueDestroyedNative", "(JJ)V", 692a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright (void*)onInputQueueDestroyed_native }, 69358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onContentRectChangedNative", "(JIIII)V", (void*)onContentRectChanged_native }, 69469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}; 69569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 69669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const char* const kNativeActivityPathName = "android/app/NativeActivity"; 69769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 69869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornint register_android_app_NativeActivity(JNIEnv* env) 69969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 7005baa3a62a97544669fba6d65a11c07f252e654ddSteve Block //ALOGD("register_android_app_NativeActivity"); 701987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe jclass clazz = FindClassOrDie(env, kNativeActivityPathName); 702987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 703987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNativeActivityClassInfo.finish = GetMethodIDOrDie(env, clazz, "finish", "()V"); 704987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNativeActivityClassInfo.setWindowFlags = GetMethodIDOrDie(env, clazz, "setWindowFlags", 705987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(II)V"); 706987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNativeActivityClassInfo.setWindowFormat = GetMethodIDOrDie(env, clazz, "setWindowFormat", 707987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(I)V"); 708987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNativeActivityClassInfo.showIme = GetMethodIDOrDie(env, clazz, "showIme", "(I)V"); 709987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNativeActivityClassInfo.hideIme = GetMethodIDOrDie(env, clazz, "hideIme", "(I)V"); 710987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 711987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe return RegisterMethodsOrDie(env, kNativeActivityPathName, g_methods, NELEM(g_methods)); 71269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 71369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 714a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} // namespace android 715