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, 262a55c7f15a3c386ec643f21eeb2f4e9fd7b03ba70Dimitry Ivanov jbyteArray savedState, jobject classLoader, jstring libraryPath) { 263ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 264ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("loadNativeCode_native"); 265ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 266d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 26769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn const char* pathStr = env->GetStringUTFChars(path, NULL); 268048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov std::unique_ptr<NativeCode> code; 26903c866020b46079afe895dd90f2d60bda06dbe05Yong WU bool needNativeBridge = false; 27003c866020b46079afe895dd90f2d60bda06dbe05Yong WU 271a55c7f15a3c386ec643f21eeb2f4e9fd7b03ba70Dimitry Ivanov void* handle = OpenNativeLibrary(env, sdkVersion, pathStr, classLoader, libraryPath); 27203c866020b46079afe895dd90f2d60bda06dbe05Yong WU if (handle == NULL) { 27303c866020b46079afe895dd90f2d60bda06dbe05Yong WU if (NativeBridgeIsSupported(pathStr)) { 27403c866020b46079afe895dd90f2d60bda06dbe05Yong WU handle = NativeBridgeLoadLibrary(pathStr, RTLD_LAZY); 27503c866020b46079afe895dd90f2d60bda06dbe05Yong WU needNativeBridge = true; 27603c866020b46079afe895dd90f2d60bda06dbe05Yong WU } 27703c866020b46079afe895dd90f2d60bda06dbe05Yong WU } 27869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn env->ReleaseStringUTFChars(path, pathStr); 27903c866020b46079afe895dd90f2d60bda06dbe05Yong WU 28069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != NULL) { 28103c866020b46079afe895dd90f2d60bda06dbe05Yong WU void* funcPtr = NULL; 282e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn const char* funcStr = env->GetStringUTFChars(funcName, NULL); 28303c866020b46079afe895dd90f2d60bda06dbe05Yong WU if (needNativeBridge) { 28403c866020b46079afe895dd90f2d60bda06dbe05Yong WU funcPtr = NativeBridgeGetTrampoline(handle, funcStr, NULL, 0); 28503c866020b46079afe895dd90f2d60bda06dbe05Yong WU } else { 28603c866020b46079afe895dd90f2d60bda06dbe05Yong WU funcPtr = dlsym(handle, funcStr); 28703c866020b46079afe895dd90f2d60bda06dbe05Yong WU } 28803c866020b46079afe895dd90f2d60bda06dbe05Yong WU 289048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov code.reset(new NativeCode(handle, (ANativeActivity_createFunc*)funcPtr)); 290e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn env->ReleaseStringUTFChars(funcName, funcStr); 29103c866020b46079afe895dd90f2d60bda06dbe05Yong WU 29269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->createActivityFunc == NULL) { 2938564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("ANativeActivity_onCreate not found"); 29469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn return 0; 29569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 2963c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 297603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueue); 298603b44589682db3ff33ade172facb0c5e309f1beJeff Brown if (code->messageQueue == NULL) { 299603b44589682db3ff33ade172facb0c5e309f1beJeff Brown ALOGW("Unable to retrieve native MessageQueue"); 3003c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return 0; 3013c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 3023c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 3033c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn int msgpipe[2]; 3043c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (pipe(msgpipe)) { 3058564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("could not create pipe: %s", strerror(errno)); 3063c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return 0; 3073c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 3083c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn code->mainWorkRead = msgpipe[0]; 3093c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn code->mainWorkWrite = msgpipe[1]; 310d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int result = fcntl(code->mainWorkRead, F_SETFL, O_NONBLOCK); 311d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn SLOGW_IF(result != 0, "Could not make main work read pipe " 312d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "non-blocking: %s", strerror(errno)); 313d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn result = fcntl(code->mainWorkWrite, F_SETFL, O_NONBLOCK); 314d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn SLOGW_IF(result != 0, "Could not make main work write pipe " 315d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "non-blocking: %s", strerror(errno)); 316603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->getLooper()->addFd( 317048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov code->mainWorkRead, 0, ALOOPER_EVENT_INPUT, mainWorkCallback, code.get()); 3183c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 319289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->ANativeActivity::callbacks = &code->callbacks; 320289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (env->GetJavaVM(&code->vm) < 0) { 3218564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("NativeActivity GetJavaVM failed"); 3222e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn return 0; 3232e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn } 324289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env = env; 325289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->clazz = env->NewGlobalRef(clazz); 3266cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 327682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn const char* dirStr = env->GetStringUTFChars(internalDataDir, NULL); 328805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->internalDataPathObj = dirStr; 329805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->internalDataPath = code->internalDataPathObj.string(); 330805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn env->ReleaseStringUTFChars(internalDataDir, dirStr); 331682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 332e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey if (externalDataDir != NULL) { 333e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey dirStr = env->GetStringUTFChars(externalDataDir, NULL); 334e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey code->externalDataPathObj = dirStr; 335e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey env->ReleaseStringUTFChars(externalDataDir, dirStr); 336e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey } 337805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->externalDataPath = code->externalDataPathObj.string(); 3386cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 339289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->sdkVersion = sdkVersion; 340682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 3416cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate code->assetManager = assetManagerForJavaObject(env, jAssetMgr); 3426cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 343e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey if (obbDir != NULL) { 344e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey dirStr = env->GetStringUTFChars(obbDir, NULL); 345e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey code->obbPathObj = dirStr; 346e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey env->ReleaseStringUTFChars(obbDir, dirStr); 347e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey } 348805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->obbPath = code->obbPathObj.string(); 349805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn 35008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jbyte* rawSavedState = NULL; 35108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jsize rawSavedSize = 0; 35208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (savedState != NULL) { 35308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn rawSavedState = env->GetByteArrayElements(savedState, NULL); 35408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn rawSavedSize = env->GetArrayLength(savedState); 35508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 35608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 357048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov code->createActivityFunc(code.get(), rawSavedState, rawSavedSize); 35808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 35908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (rawSavedState != NULL) { 36008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn env->ReleaseByteArrayElements(savedState, rawSavedState, 0); 36108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 36269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 36369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 364048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov return (jlong)code.release(); 365048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov} 366048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov 367048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanovstatic jstring getDlError_native(JNIEnv* env, jobject clazz) { 368048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov return env->NewStringUTF(dlerror()); 36969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 37069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 37169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 37258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatunloadNativeCode_native(JNIEnv* env, jobject clazz, jlong handle) 37369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 374ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 375ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("unloadNativeCode_native"); 376ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 37769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 37869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 37969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn delete code; 38069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 38169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 38269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 38369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 38458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonStart_native(JNIEnv* env, jobject clazz, jlong handle) 38569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 386ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 387ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onStart_native"); 388ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 38969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 39069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 39169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onStart != NULL) { 392289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onStart(code); 39369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 39469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 39569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 39669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 39769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 39858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonResume_native(JNIEnv* env, jobject clazz, jlong handle) 39969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 400ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 401ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onResume_native"); 402ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 40369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 40469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 40569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onResume != NULL) { 406289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onResume(code); 40769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 40869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 40969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 41069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 41108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic jbyteArray 41258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSaveInstanceState_native(JNIEnv* env, jobject clazz, jlong handle) 41369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 414ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 415ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onSaveInstanceState_native"); 416ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 41708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 41808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jbyteArray array = NULL; 41908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 42069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 42169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 42269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onSaveInstanceState != NULL) { 42369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn size_t len = 0; 42408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jbyte* state = (jbyte*)code->callbacks.onSaveInstanceState(code, &len); 42508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (len > 0) { 42608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn array = env->NewByteArray(len); 42708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (array != NULL) { 42808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn env->SetByteArrayRegion(array, 0, len, state); 42908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 43008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 43108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (state != NULL) { 43208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn free(state); 43308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 43469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 43569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 43608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 43708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn return array; 43869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 43969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 44069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 44158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonPause_native(JNIEnv* env, jobject clazz, jlong handle) 44269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 443ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 444ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onPause_native"); 445ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 44669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 44769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 44869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onPause != NULL) { 449289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onPause(code); 45069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 45169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 45269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 45369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 45469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 45558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonStop_native(JNIEnv* env, jobject clazz, jlong handle) 45669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 457ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 458ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onStop_native"); 459ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 46069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 46169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 46269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onStop != NULL) { 463289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onStop(code); 46469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 46569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 46669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 46769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 46869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 46958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonConfigurationChanged_native(JNIEnv* env, jobject clazz, jlong handle) 47008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn{ 471ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 472ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onConfigurationChanged_native"); 473ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 47408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (handle != 0) { 47508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn NativeCode* code = (NativeCode*)handle; 47608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (code->callbacks.onConfigurationChanged != NULL) { 47708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn code->callbacks.onConfigurationChanged(code); 47808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 47908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 48008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn} 48108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 48208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic void 48358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonLowMemory_native(JNIEnv* env, jobject clazz, jlong handle) 48469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 485ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 486ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onLowMemory_native"); 487ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 48869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 48969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 49069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onLowMemory != NULL) { 491289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onLowMemory(code); 49269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 49369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 49469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 49569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 49669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 49758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonWindowFocusChanged_native(JNIEnv* env, jobject clazz, jlong handle, jboolean focused) 49869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 499ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 500ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onWindowFocusChanged_native"); 501ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 50269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 50369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 50469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onWindowFocusChanged != NULL) { 505289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onWindowFocusChanged(code, focused ? 1 : 0); 50669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 50769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 50869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 50969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 51074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 51158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceCreated_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface) 51274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 513ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 514ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onSurfaceCreated_native"); 515ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 51674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 51774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 51874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->setSurface(surface); 51954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowCreated != NULL) { 520289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowCreated(code, 52154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->nativeWindow.get()); 52274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 52374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 52474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 52574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 526d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic int32_t getWindowProp(ANativeWindow* window, int what) { 527d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int value; 528d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int res = window->query(window, what, &value); 529d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return res < 0 ? res : value; 530d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 531d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 53274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 53358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceChanged_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface, 53474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn jint format, jint width, jint height) 53574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 536ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 537ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onSurfaceChanged_native"); 538ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 53974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 54074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 54154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn sp<ANativeWindow> oldNativeWindow = code->nativeWindow; 54254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->setSurface(surface); 54354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (oldNativeWindow != code->nativeWindow) { 5448ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn if (oldNativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) { 545289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowDestroyed(code, 5468ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn oldNativeWindow.get()); 5478ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn } 548d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->nativeWindow != NULL) { 549d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onNativeWindowCreated != NULL) { 550d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowCreated(code, 551d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->nativeWindow.get()); 552d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 553d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->lastWindowWidth = getWindowProp(code->nativeWindow.get(), 554d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_WIDTH); 555d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->lastWindowHeight = getWindowProp(code->nativeWindow.get(), 556d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_HEIGHT); 557d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 558d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } else { 559d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn // Maybe it resized? 560d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t newWidth = getWindowProp(code->nativeWindow.get(), 561d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_WIDTH); 562d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t newHeight = getWindowProp(code->nativeWindow.get(), 563d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_HEIGHT); 564d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (newWidth != code->lastWindowWidth 565d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn || newHeight != code->lastWindowHeight) { 566d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onNativeWindowResized != NULL) { 567d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowResized(code, 568d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->nativeWindow.get()); 569d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 57054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn } 57174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 57274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 57374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 57474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 57574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 57658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceRedrawNeeded_native(JNIEnv* env, jobject clazz, jlong handle) 577d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{ 578ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 579ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onSurfaceRedrawNeeded_native"); 580ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 581d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (handle != 0) { 582d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = (NativeCode*)handle; 583d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowRedrawNeeded != NULL) { 584d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowRedrawNeeded(code, code->nativeWindow.get()); 585d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 586d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 587d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 588d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 589d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void 59058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceDestroyed_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface) 59174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 592ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 593ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onSurfaceDestroyed_native"); 594ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 59574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 59674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 59754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) { 598289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowDestroyed(code, 59954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->nativeWindow.get()); 60074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 60174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->setSurface(NULL); 60274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 60374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 60474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 605a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void 60658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonInputQueueCreated_native(JNIEnv* env, jobject clazz, jlong handle, jlong queuePtr) 607a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{ 608ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 609ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onInputChannelCreated_native"); 610ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 611a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (handle != 0) { 612a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn NativeCode* code = (NativeCode*)handle; 613a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (code->callbacks.onInputQueueCreated != NULL) { 614a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr); 615a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright code->callbacks.onInputQueueCreated(code, queue); 616a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 617a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 618a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} 619a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 620a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void 62158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonInputQueueDestroyed_native(JNIEnv* env, jobject clazz, jlong handle, jlong queuePtr) 622a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{ 623ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 624ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onInputChannelDestroyed_native"); 625ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 626a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (handle != 0) { 627a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn NativeCode* code = (NativeCode*)handle; 628a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright if (code->callbacks.onInputQueueDestroyed != NULL) { 629a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr); 630a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright code->callbacks.onInputQueueDestroyed(code, queue); 631a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 632a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 633a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} 634a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 635d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void 63658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonContentRectChanged_native(JNIEnv* env, jobject clazz, jlong handle, 637d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jint x, jint y, jint w, jint h) 638d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{ 639ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe if (kLogTrace) { 640ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe ALOGD("onContentRectChanged_native"); 641ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe } 642d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (handle != 0) { 643d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = (NativeCode*)handle; 644d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onContentRectChanged != NULL) { 645d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ARect rect; 646d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.left = x; 647d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.top = y; 648d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.right = x+w; 649d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.bottom = y+h; 650d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onContentRectChanged(code, &rect); 651d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 652d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 653d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 654d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 65569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const JNINativeMethod g_methods[] = { 656048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov { "loadNativeCode", 657a55c7f15a3c386ec643f21eeb2f4e9fd7b03ba70Dimitry 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", 658048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov (void*)loadNativeCode_native }, 659048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov { "getDlError", "()Ljava/lang/String;", (void*) getDlError_native }, 66058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "unloadNativeCode", "(J)V", (void*)unloadNativeCode_native }, 66158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onStartNative", "(J)V", (void*)onStart_native }, 66258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onResumeNative", "(J)V", (void*)onResume_native }, 66358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onSaveInstanceStateNative", "(J)[B", (void*)onSaveInstanceState_native }, 66458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onPauseNative", "(J)V", (void*)onPause_native }, 66558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onStopNative", "(J)V", (void*)onStop_native }, 66658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onConfigurationChangedNative", "(J)V", (void*)onConfigurationChanged_native }, 66758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onLowMemoryNative", "(J)V", (void*)onLowMemory_native }, 66858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onWindowFocusChangedNative", "(JZ)V", (void*)onWindowFocusChanged_native }, 66958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onSurfaceCreatedNative", "(JLandroid/view/Surface;)V", (void*)onSurfaceCreated_native }, 67058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onSurfaceChangedNative", "(JLandroid/view/Surface;III)V", (void*)onSurfaceChanged_native }, 67158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onSurfaceRedrawNeededNative", "(JLandroid/view/Surface;)V", (void*)onSurfaceRedrawNeeded_native }, 67258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onSurfaceDestroyedNative", "(J)V", (void*)onSurfaceDestroyed_native }, 67358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onInputQueueCreatedNative", "(JJ)V", 674a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright (void*)onInputQueueCreated_native }, 67558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onInputQueueDestroyedNative", "(JJ)V", 676a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright (void*)onInputQueueDestroyed_native }, 67758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat { "onContentRectChangedNative", "(JIIII)V", (void*)onContentRectChanged_native }, 67869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}; 67969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 68069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const char* const kNativeActivityPathName = "android/app/NativeActivity"; 68169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 68269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornint register_android_app_NativeActivity(JNIEnv* env) 68369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 6845baa3a62a97544669fba6d65a11c07f252e654ddSteve Block //ALOGD("register_android_app_NativeActivity"); 685987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe jclass clazz = FindClassOrDie(env, kNativeActivityPathName); 686987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 687987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNativeActivityClassInfo.finish = GetMethodIDOrDie(env, clazz, "finish", "()V"); 688987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNativeActivityClassInfo.setWindowFlags = GetMethodIDOrDie(env, clazz, "setWindowFlags", 689987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(II)V"); 690987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNativeActivityClassInfo.setWindowFormat = GetMethodIDOrDie(env, clazz, "setWindowFormat", 691987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(I)V"); 692987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNativeActivityClassInfo.showIme = GetMethodIDOrDie(env, clazz, "showIme", "(I)V"); 693987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNativeActivityClassInfo.hideIme = GetMethodIDOrDie(env, clazz, "hideIme", "(I)V"); 694987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 695987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe return RegisterMethodsOrDie(env, kNativeActivityPathName, g_methods, NELEM(g_methods)); 69669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 69769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 698a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} // namespace android 699