android_app_NativeActivity.cpp revision a44dd26a75e24cc021802288fb81f4761e47be6b
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 24289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#include <android_runtime/android_app_NativeActivity.h> 256cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate#include <android_runtime/android_util_AssetManager.h> 268335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <android_runtime/android_view_Surface.h> 278335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <android_runtime/AndroidRuntime.h> 28b93a03f841d93498bfea6cc92a22faa34bce1337Mathias Agopian#include <androidfw/InputTransport.h> 298335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian 308335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <gui/Surface.h> 318335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian 328335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <system/window.h> 338335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian 344fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown#include <utils/Looper.h> 3569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 363c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "JNIHelp.h" 373c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "android_os_MessageQueue.h" 383c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "android_view_InputChannel.h" 393c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "android_view_KeyEvent.h" 4069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 41db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn#define LOG_TRACE(...) 4228d9f024e043817212b15f04128d0464330502eaSteve Block//#define LOG_TRACE(...) ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__) 43d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 4469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornnamespace android 4569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 4669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 473c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornstatic struct { 48db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn jmethodID finish; 4954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn jmethodID setWindowFlags; 5054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn jmethodID setWindowFormat; 51d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jmethodID showIme; 52d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jmethodID hideIme; 533c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} gNativeActivityClassInfo; 543c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 5554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 5654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 57289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstruct ActivityWork { 58289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t cmd; 59289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t arg1; 60289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t arg2; 61289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn}; 62289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 63289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornenum { 64a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright CMD_FINISH = 1, 65289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn CMD_SET_WINDOW_FORMAT, 66289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn CMD_SET_WINDOW_FLAGS, 67d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn CMD_SHOW_SOFT_INPUT, 68d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn CMD_HIDE_SOFT_INPUT, 69289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn}; 70289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 71289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstatic void write_work(int fd, int32_t cmd, int32_t arg1=0, int32_t arg2=0) { 72289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ActivityWork work; 73289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn work.cmd = cmd; 74289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn work.arg1 = arg1; 75289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn work.arg2 = arg2; 76289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 77d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("write_work: cmd=%d", cmd); 78d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 79289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornrestart: 80289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int res = write(fd, &work, sizeof(work)); 81289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res < 0 && errno == EINTR) { 82289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn goto restart; 83289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 84289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 85289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res == sizeof(work)) return; 86289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 878564c8da817a845353d213acd8636b76f567b234Steve Block if (res < 0) ALOGW("Failed writing to work fd: %s", strerror(errno)); 888564c8da817a845353d213acd8636b76f567b234Steve Block else ALOGW("Truncated writing to work fd: %d", res); 89289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 90289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 91289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstatic bool read_work(int fd, ActivityWork* outWork) { 92289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int res = read(fd, outWork, sizeof(ActivityWork)); 93289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn // no need to worry about EINTR, poll loop will just come back again. 94289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res == sizeof(ActivityWork)) return true; 95289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 968564c8da817a845353d213acd8636b76f567b234Steve Block if (res < 0) ALOGW("Failed reading work fd: %s", strerror(errno)); 978564c8da817a845353d213acd8636b76f567b234Steve Block else ALOGW("Truncated reading work fd: %d", res); 98289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn return false; 99289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 100289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 10154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn/* 10254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Native state for interacting with the NativeActivity class. 10354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn */ 104289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstruct NativeCode : public ANativeActivity { 1052e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn NativeCode(void* _dlhandle, ANativeActivity_createFunc* _createFunc) { 106d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn memset((ANativeActivity*)this, 0, sizeof(ANativeActivity)); 107d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn memset(&callbacks, 0, sizeof(callbacks)); 10874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn dlhandle = _dlhandle; 10974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn createActivityFunc = _createFunc; 11054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn nativeWindow = NULL; 1113c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mainWorkRead = mainWorkWrite = -1; 11274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 11374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 11474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn ~NativeCode() { 115289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (callbacks.onDestroy != NULL) { 116289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn callbacks.onDestroy(this); 117289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 118289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (env != NULL && clazz != NULL) { 119289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn env->DeleteGlobalRef(clazz); 1203c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 121603b44589682db3ff33ade172facb0c5e309f1beJeff Brown if (messageQueue != NULL && mainWorkRead >= 0) { 122603b44589682db3ff33ade172facb0c5e309f1beJeff Brown messageQueue->getLooper()->removeFd(mainWorkRead); 1233c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 124a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn setSurface(NULL); 1253c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mainWorkRead >= 0) close(mainWorkRead); 1263c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mainWorkWrite >= 0) close(mainWorkWrite); 12774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (dlhandle != NULL) { 12854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn // for now don't unload... we probably should clean this 12954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn // up and only keep one open dlhandle per proc, since there 13054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn // is really no benefit to unloading the code. 13154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn //dlclose(dlhandle); 13274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 13374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 13474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 13574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn void setSurface(jobject _surface) { 13674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (_surface != NULL) { 13764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown nativeWindow = android_view_Surface_getNativeWindow(env, _surface); 13874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } else { 13954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn nativeWindow = NULL; 14074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 14174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 14274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 1432e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn ANativeActivityCallbacks callbacks; 14469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 14569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn void* dlhandle; 1462e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn ANativeActivity_createFunc* createActivityFunc; 14774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 148805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn String8 internalDataPathObj; 149805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn String8 externalDataPathObj; 150805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn String8 obbPathObj; 151682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 15254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn sp<ANativeWindow> nativeWindow; 153d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t lastWindowWidth; 154d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t lastWindowHeight; 155d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 1563c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn // These are used to wake up the main thread to process work. 1573c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn int mainWorkRead; 1583c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn int mainWorkWrite; 159603b44589682db3ff33ade172facb0c5e309f1beJeff Brown sp<MessageQueue> messageQueue; 16069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}; 16169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 162db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackbornvoid android_NativeActivity_finish(ANativeActivity* activity) { 163db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 164db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn write_work(code->mainWorkWrite, CMD_FINISH, 0); 165db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn} 166db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn 167289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornvoid android_NativeActivity_setWindowFormat( 168289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ANativeActivity* activity, int32_t format) { 169289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 170289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn write_work(code->mainWorkWrite, CMD_SET_WINDOW_FORMAT, format); 171289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 172289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 173289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornvoid android_NativeActivity_setWindowFlags( 174289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ANativeActivity* activity, int32_t values, int32_t mask) { 175289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 176289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn write_work(code->mainWorkWrite, CMD_SET_WINDOW_FLAGS, values, mask); 177289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 178289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 179d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid android_NativeActivity_showSoftInput( 180d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ANativeActivity* activity, int32_t flags) { 181d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 182d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn write_work(code->mainWorkWrite, CMD_SHOW_SOFT_INPUT, flags); 183d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 184d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 185d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid android_NativeActivity_hideSoftInput( 186d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ANativeActivity* activity, int32_t flags) { 187d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 188d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn write_work(code->mainWorkWrite, CMD_HIDE_SOFT_INPUT, flags); 189d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 190d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 19154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 19254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 19354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn/* 19454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Callback for handling native events on the application's main thread. 19554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn */ 1964fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownstatic int mainWorkCallback(int fd, int events, void* data) { 1973c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn NativeCode* code = (NativeCode*)data; 198289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if ((events & POLLIN) == 0) { 1994fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown return 1; 200289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 201289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 202289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ActivityWork work; 203289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (!read_work(code->mainWorkRead, &work)) { 2044fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown return 1; 205289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 206d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 207d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("mainWorkCallback: cmd=%d", work.cmd); 208d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 209289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn switch (work.cmd) { 210db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn case CMD_FINISH: { 211db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn code->env->CallVoidMethod(code->clazz, gNativeActivityClassInfo.finish); 212603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->raiseAndClearException(code->env, "finish"); 213db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn } break; 214289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn case CMD_SET_WINDOW_FORMAT: { 215289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env->CallVoidMethod(code->clazz, 216289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn gNativeActivityClassInfo.setWindowFormat, work.arg1); 217603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->raiseAndClearException(code->env, "setWindowFormat"); 218289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } break; 219289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn case CMD_SET_WINDOW_FLAGS: { 220289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env->CallVoidMethod(code->clazz, 221289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn gNativeActivityClassInfo.setWindowFlags, work.arg1, work.arg2); 222603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->raiseAndClearException(code->env, "setWindowFlags"); 223289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } break; 224d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn case CMD_SHOW_SOFT_INPUT: { 225d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->env->CallVoidMethod(code->clazz, 226d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn gNativeActivityClassInfo.showIme, work.arg1); 227603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->raiseAndClearException(code->env, "showIme"); 228d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } break; 229d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn case CMD_HIDE_SOFT_INPUT: { 230d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->env->CallVoidMethod(code->clazz, 231d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn gNativeActivityClassInfo.hideIme, work.arg1); 232603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->raiseAndClearException(code->env, "hideIme"); 233d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } break; 234289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn default: 2358564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Unknown work command: %d", work.cmd); 236289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn break; 2373c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 2383c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 2394fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown return 1; 2403c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} 2413c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 24254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 24354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 24469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic jint 245e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne HackbornloadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jstring funcName, 246805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn jobject messageQueue, jstring internalDataDir, jstring obbDir, 247805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn jstring externalDataDir, int sdkVersion, 24808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jobject jAssetMgr, jbyteArray savedState) 24969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 250d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("loadNativeCode_native"); 251d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 25269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn const char* pathStr = env->GetStringUTFChars(path, NULL); 25369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = NULL; 25469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 25569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn void* handle = dlopen(pathStr, RTLD_LAZY); 25669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 25769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn env->ReleaseStringUTFChars(path, pathStr); 25869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 25969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != NULL) { 260e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn const char* funcStr = env->GetStringUTFChars(funcName, NULL); 2612e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn code = new NativeCode(handle, (ANativeActivity_createFunc*) 262e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn dlsym(handle, funcStr)); 263e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn env->ReleaseStringUTFChars(funcName, funcStr); 264e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn 26569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->createActivityFunc == NULL) { 2668564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("ANativeActivity_onCreate not found"); 26769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn delete code; 26869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn return 0; 26969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 2703c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 271603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueue); 272603b44589682db3ff33ade172facb0c5e309f1beJeff Brown if (code->messageQueue == NULL) { 273603b44589682db3ff33ade172facb0c5e309f1beJeff Brown ALOGW("Unable to retrieve native MessageQueue"); 2743c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn delete code; 2753c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return 0; 2763c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 2773c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 2783c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn int msgpipe[2]; 2793c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (pipe(msgpipe)) { 2808564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("could not create pipe: %s", strerror(errno)); 2813c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn delete code; 2823c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return 0; 2833c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 2843c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn code->mainWorkRead = msgpipe[0]; 2853c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn code->mainWorkWrite = msgpipe[1]; 286d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int result = fcntl(code->mainWorkRead, F_SETFL, O_NONBLOCK); 287d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn SLOGW_IF(result != 0, "Could not make main work read pipe " 288d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "non-blocking: %s", strerror(errno)); 289d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn result = fcntl(code->mainWorkWrite, F_SETFL, O_NONBLOCK); 290d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn SLOGW_IF(result != 0, "Could not make main work write pipe " 291d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "non-blocking: %s", strerror(errno)); 292603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->messageQueue->getLooper()->addFd( 293603b44589682db3ff33ade172facb0c5e309f1beJeff Brown code->mainWorkRead, 0, ALOOPER_EVENT_INPUT, mainWorkCallback, code); 2943c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 295289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->ANativeActivity::callbacks = &code->callbacks; 296289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (env->GetJavaVM(&code->vm) < 0) { 2978564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("NativeActivity GetJavaVM failed"); 2982e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn delete code; 2992e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn return 0; 3002e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn } 301289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env = env; 302289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->clazz = env->NewGlobalRef(clazz); 3036cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 304682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn const char* dirStr = env->GetStringUTFChars(internalDataDir, NULL); 305805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->internalDataPathObj = dirStr; 306805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->internalDataPath = code->internalDataPathObj.string(); 307805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn env->ReleaseStringUTFChars(internalDataDir, dirStr); 308682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 309682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn dirStr = env->GetStringUTFChars(externalDataDir, NULL); 310805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->externalDataPathObj = dirStr; 311805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->externalDataPath = code->externalDataPathObj.string(); 312805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn env->ReleaseStringUTFChars(externalDataDir, dirStr); 3136cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 314289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->sdkVersion = sdkVersion; 315682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 3166cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate code->assetManager = assetManagerForJavaObject(env, jAssetMgr); 3176cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 318805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn dirStr = env->GetStringUTFChars(obbDir, NULL); 319805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->obbPathObj = dirStr; 320805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn code->obbPath = code->obbPathObj.string(); 321805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn env->ReleaseStringUTFChars(obbDir, dirStr); 322805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn 32308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jbyte* rawSavedState = NULL; 32408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jsize rawSavedSize = 0; 32508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (savedState != NULL) { 32608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn rawSavedState = env->GetByteArrayElements(savedState, NULL); 32708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn rawSavedSize = env->GetArrayLength(savedState); 32808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 32908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 33008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn code->createActivityFunc(code, rawSavedState, rawSavedSize); 33108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 33208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (rawSavedState != NULL) { 33308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn env->ReleaseByteArrayElements(savedState, rawSavedState, 0); 33408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 33569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 33669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 33769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn return (jint)code; 33869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 33969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 34069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 34169969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornunloadNativeCode_native(JNIEnv* env, jobject clazz, jint handle) 34269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 343d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("unloadNativeCode_native"); 34469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 34569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 34669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn delete code; 34769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 34869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 34969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 35069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 35169969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonStart_native(JNIEnv* env, jobject clazz, jint handle) 35269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 353d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onStart_native"); 35469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 35569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 35669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onStart != NULL) { 357289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onStart(code); 35869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 35969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 36069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 36169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 36269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 36369969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonResume_native(JNIEnv* env, jobject clazz, jint handle) 36469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 365d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onResume_native"); 36669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 36769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 36869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onResume != NULL) { 369289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onResume(code); 37069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 37169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 37269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 37369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 37408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic jbyteArray 37569969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonSaveInstanceState_native(JNIEnv* env, jobject clazz, jint handle) 37669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 377d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onSaveInstanceState_native"); 37808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 37908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jbyteArray array = NULL; 38008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 38169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 38269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 38369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onSaveInstanceState != NULL) { 38469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn size_t len = 0; 38508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn jbyte* state = (jbyte*)code->callbacks.onSaveInstanceState(code, &len); 38608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (len > 0) { 38708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn array = env->NewByteArray(len); 38808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (array != NULL) { 38908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn env->SetByteArrayRegion(array, 0, len, state); 39008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 39108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 39208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (state != NULL) { 39308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn free(state); 39408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 39569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 39669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 39708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 39808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn return array; 39969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 40069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 40169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 40269969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonPause_native(JNIEnv* env, jobject clazz, jint handle) 40369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 404d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onPause_native"); 40569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 40669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 40769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onPause != NULL) { 408289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onPause(code); 40969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 41069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 41169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 41269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 41369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 41469969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonStop_native(JNIEnv* env, jobject clazz, jint handle) 41569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 416d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onStop_native"); 41769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 41869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 41969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onStop != NULL) { 420289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onStop(code); 42169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 42269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 42369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 42469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 42569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 42608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne HackbornonConfigurationChanged_native(JNIEnv* env, jobject clazz, jint handle) 42708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn{ 42808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn LOG_TRACE("onConfigurationChanged_native"); 42908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (handle != 0) { 43008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn NativeCode* code = (NativeCode*)handle; 43108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (code->callbacks.onConfigurationChanged != NULL) { 43208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn code->callbacks.onConfigurationChanged(code); 43308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 43408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 43508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn} 43608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 43708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic void 43869969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonLowMemory_native(JNIEnv* env, jobject clazz, jint handle) 43969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 440d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onLowMemory_native"); 44169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 44269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 44369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onLowMemory != NULL) { 444289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onLowMemory(code); 44569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 44669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 44769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 44869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 44969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 45069969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonWindowFocusChanged_native(JNIEnv* env, jobject clazz, jint handle, jboolean focused) 45169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 452d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onWindowFocusChanged_native"); 45369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 45469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 45569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onWindowFocusChanged != NULL) { 456289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onWindowFocusChanged(code, focused ? 1 : 0); 45769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 45869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 45969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 46069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 46174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 46274323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceCreated_native(JNIEnv* env, jobject clazz, jint handle, jobject surface) 46374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 464d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onSurfaceCreated_native"); 46574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 46674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 46774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->setSurface(surface); 46854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowCreated != NULL) { 469289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowCreated(code, 47054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->nativeWindow.get()); 47174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 47274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 47374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 47474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 475d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic int32_t getWindowProp(ANativeWindow* window, int what) { 476d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int value; 477d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int res = window->query(window, what, &value); 478d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return res < 0 ? res : value; 479d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 480d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 48174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 48274323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceChanged_native(JNIEnv* env, jobject clazz, jint handle, jobject surface, 48374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn jint format, jint width, jint height) 48474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 485d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onSurfaceChanged_native"); 48674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 48774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 48854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn sp<ANativeWindow> oldNativeWindow = code->nativeWindow; 48954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->setSurface(surface); 49054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (oldNativeWindow != code->nativeWindow) { 4918ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn if (oldNativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) { 492289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowDestroyed(code, 4938ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn oldNativeWindow.get()); 4948ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn } 495d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->nativeWindow != NULL) { 496d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onNativeWindowCreated != NULL) { 497d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowCreated(code, 498d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->nativeWindow.get()); 499d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 500d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->lastWindowWidth = getWindowProp(code->nativeWindow.get(), 501d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_WIDTH); 502d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->lastWindowHeight = getWindowProp(code->nativeWindow.get(), 503d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_HEIGHT); 504d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 505d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } else { 506d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn // Maybe it resized? 507d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t newWidth = getWindowProp(code->nativeWindow.get(), 508d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_WIDTH); 509d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t newHeight = getWindowProp(code->nativeWindow.get(), 510d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_HEIGHT); 511d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (newWidth != code->lastWindowWidth 512d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn || newHeight != code->lastWindowHeight) { 513d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onNativeWindowResized != NULL) { 514d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowResized(code, 515d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->nativeWindow.get()); 516d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 51754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn } 51874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 51974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 52074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 52174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 52274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 523d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne HackbornonSurfaceRedrawNeeded_native(JNIEnv* env, jobject clazz, jint handle) 524d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{ 525d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onSurfaceRedrawNeeded_native"); 526d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (handle != 0) { 527d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = (NativeCode*)handle; 528d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowRedrawNeeded != NULL) { 529d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowRedrawNeeded(code, code->nativeWindow.get()); 530d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 531d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 532d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 533d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 534d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void 53574323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jobject surface) 53674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 537d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onSurfaceDestroyed_native"); 53874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 53974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 54054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) { 541289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowDestroyed(code, 54254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->nativeWindow.get()); 54374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 54474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->setSurface(NULL); 54574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 54674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 54774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 548a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void 549a44dd26a75e24cc021802288fb81f4761e47be6bMichael WrightonInputQueueCreated_native(JNIEnv* env, jobject clazz, jint handle, jint queuePtr) 550a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{ 551d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onInputChannelCreated_native"); 552a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (handle != 0) { 553a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn NativeCode* code = (NativeCode*)handle; 554a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (code->callbacks.onInputQueueCreated != NULL) { 555a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr); 556a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright code->callbacks.onInputQueueCreated(code, queue); 557a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 558a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 559a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} 560a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 561a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void 562a44dd26a75e24cc021802288fb81f4761e47be6bMichael WrightonInputQueueDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jint queuePtr) 563a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{ 564d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onInputChannelDestroyed_native"); 565a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (handle != 0) { 566a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn NativeCode* code = (NativeCode*)handle; 567a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright if (code->callbacks.onInputQueueDestroyed != NULL) { 568a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr); 569a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright code->callbacks.onInputQueueDestroyed(code, queue); 570a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 571a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 572a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} 573a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 574d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void 575d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne HackbornonContentRectChanged_native(JNIEnv* env, jobject clazz, jint handle, 576d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jint x, jint y, jint w, jint h) 577d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{ 578d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onContentRectChanged_native"); 579d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (handle != 0) { 580d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = (NativeCode*)handle; 581d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onContentRectChanged != NULL) { 582d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ARect rect; 583d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.left = x; 584d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.top = y; 585d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.right = x+w; 586d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.bottom = y+h; 587d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onContentRectChanged(code, &rect); 588d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 589d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 590d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 591d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 59269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const JNINativeMethod g_methods[] = { 593805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn { "loadNativeCode", "(Ljava/lang/String;Ljava/lang/String;Landroid/os/MessageQueue;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/content/res/AssetManager;[B)I", 594682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn (void*)loadNativeCode_native }, 59569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "unloadNativeCode", "(I)V", (void*)unloadNativeCode_native }, 59669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onStartNative", "(I)V", (void*)onStart_native }, 59769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onResumeNative", "(I)V", (void*)onResume_native }, 59808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn { "onSaveInstanceStateNative", "(I)[B", (void*)onSaveInstanceState_native }, 59969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onPauseNative", "(I)V", (void*)onPause_native }, 60069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onStopNative", "(I)V", (void*)onStop_native }, 60108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn { "onConfigurationChangedNative", "(I)V", (void*)onConfigurationChanged_native }, 60269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onLowMemoryNative", "(I)V", (void*)onLowMemory_native }, 60369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onWindowFocusChangedNative", "(IZ)V", (void*)onWindowFocusChanged_native }, 60454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn { "onSurfaceCreatedNative", "(ILandroid/view/Surface;)V", (void*)onSurfaceCreated_native }, 60554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn { "onSurfaceChangedNative", "(ILandroid/view/Surface;III)V", (void*)onSurfaceChanged_native }, 606d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn { "onSurfaceRedrawNeededNative", "(ILandroid/view/Surface;)V", (void*)onSurfaceRedrawNeeded_native }, 60754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn { "onSurfaceDestroyedNative", "(I)V", (void*)onSurfaceDestroyed_native }, 608a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright { "onInputQueueCreatedNative", "(II)V", 609a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright (void*)onInputQueueCreated_native }, 610a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright { "onInputQueueDestroyedNative", "(II)V", 611a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright (void*)onInputQueueDestroyed_native }, 612d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn { "onContentRectChangedNative", "(IIIII)V", (void*)onContentRectChanged_native }, 61369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}; 61469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 61569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const char* const kNativeActivityPathName = "android/app/NativeActivity"; 61669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 6173c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#define FIND_CLASS(var, className) \ 6183c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn var = env->FindClass(className); \ 61917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro LOG_FATAL_IF(! var, "Unable to find class %s", className); 6203c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 6213c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#define GET_METHOD_ID(var, clazz, methodName, fieldDescriptor) \ 6223c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn var = env->GetMethodID(clazz, methodName, fieldDescriptor); \ 6233c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn LOG_FATAL_IF(! var, "Unable to find method" methodName); 6243c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 62569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornint register_android_app_NativeActivity(JNIEnv* env) 62669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 6275baa3a62a97544669fba6d65a11c07f252e654ddSteve Block //ALOGD("register_android_app_NativeActivity"); 62817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro jclass clazz; 62917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro FIND_CLASS(clazz, kNativeActivityPathName); 63069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 631db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.finish, 63217cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro clazz, 633db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn "finish", "()V"); 63454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.setWindowFlags, 63517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro clazz, 63654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn "setWindowFlags", "(II)V"); 63754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.setWindowFormat, 63817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro clazz, 63954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn "setWindowFormat", "(I)V"); 640d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.showIme, 64117cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro clazz, 642d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "showIme", "(I)V"); 643d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.hideIme, 64417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro clazz, 645d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "hideIme", "(I)V"); 64654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 64769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn return AndroidRuntime::registerNativeMethods( 64869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn env, kNativeActivityPathName, 64969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn g_methods, NELEM(g_methods)); 65069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 65169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 652a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} // namespace android 653