android_app_NativeActivity.cpp revision 58b8b24256bdc2b613b7fda9151845ed9898a4c7
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>
289d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/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
24458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhatstatic jlong
245e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne HackbornloadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jstring funcName,
246805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        jobject messageQueue, jstring internalDataDir, jstring obbDir,
24758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat        jstring externalDataDir, jint 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
309e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey        if (externalDataDir != NULL) {
310e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            dirStr = env->GetStringUTFChars(externalDataDir, NULL);
311e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            code->externalDataPathObj = dirStr;
312e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            env->ReleaseStringUTFChars(externalDataDir, dirStr);
313e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey        }
314805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        code->externalDataPath = code->externalDataPathObj.string();
3156cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate
316289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        code->sdkVersion = sdkVersion;
317682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
3186cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate        code->assetManager = assetManagerForJavaObject(env, jAssetMgr);
3196cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate
320e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey        if (obbDir != NULL) {
321e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            dirStr = env->GetStringUTFChars(obbDir, NULL);
322e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            code->obbPathObj = dirStr;
323e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            env->ReleaseStringUTFChars(obbDir, dirStr);
324e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey        }
325805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        code->obbPath = code->obbPathObj.string();
326805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn
32708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        jbyte* rawSavedState = NULL;
32808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        jsize rawSavedSize = 0;
32908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        if (savedState != NULL) {
33008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            rawSavedState = env->GetByteArrayElements(savedState, NULL);
33108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            rawSavedSize = env->GetArrayLength(savedState);
33208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        }
33308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
33408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        code->createActivityFunc(code, rawSavedState, rawSavedSize);
33508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
33608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        if (rawSavedState != NULL) {
33708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            env->ReleaseByteArrayElements(savedState, rawSavedState, 0);
33808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        }
33969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
34069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
34158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    return (jlong)code;
34269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
34369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
34469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
34558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatunloadNativeCode_native(JNIEnv* env, jobject clazz, jlong handle)
34669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
347d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    LOG_TRACE("unloadNativeCode_native");
34869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
34969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
35069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        delete code;
35169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
35269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
35369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
35469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
35558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonStart_native(JNIEnv* env, jobject clazz, jlong handle)
35669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
357d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    LOG_TRACE("onStart_native");
35869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
35969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
36069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onStart != NULL) {
361289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onStart(code);
36269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
36369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
36469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
36569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
36669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
36758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonResume_native(JNIEnv* env, jobject clazz, jlong handle)
36869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
369d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    LOG_TRACE("onResume_native");
37069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
37169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
37269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onResume != NULL) {
373289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onResume(code);
37469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
37569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
37669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
37769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
37808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic jbyteArray
37958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSaveInstanceState_native(JNIEnv* env, jobject clazz, jlong handle)
38069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
381d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    LOG_TRACE("onSaveInstanceState_native");
38208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
38308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jbyteArray array = NULL;
38408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
38569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
38669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
38769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onSaveInstanceState != NULL) {
38869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            size_t len = 0;
38908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            jbyte* state = (jbyte*)code->callbacks.onSaveInstanceState(code, &len);
39008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            if (len > 0) {
39108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn                array = env->NewByteArray(len);
39208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn                if (array != NULL) {
39308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn                    env->SetByteArrayRegion(array, 0, len, state);
39408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn                }
39508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            }
39608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            if (state != NULL) {
39708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn                free(state);
39808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            }
39969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
40069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
40108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
40208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    return array;
40369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
40469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
40569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
40658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonPause_native(JNIEnv* env, jobject clazz, jlong handle)
40769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
408d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    LOG_TRACE("onPause_native");
40969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
41069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
41169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onPause != NULL) {
412289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onPause(code);
41369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
41469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
41569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
41669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
41769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
41858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonStop_native(JNIEnv* env, jobject clazz, jlong handle)
41969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
420d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    LOG_TRACE("onStop_native");
42169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
42269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
42369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onStop != NULL) {
424289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onStop(code);
42569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
42669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
42769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
42869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
42969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
43058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonConfigurationChanged_native(JNIEnv* env, jobject clazz, jlong handle)
43108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn{
43208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    LOG_TRACE("onConfigurationChanged_native");
43308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    if (handle != 0) {
43408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
43508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        if (code->callbacks.onConfigurationChanged != NULL) {
43608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            code->callbacks.onConfigurationChanged(code);
43708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        }
43808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    }
43908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn}
44008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
44108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic void
44258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonLowMemory_native(JNIEnv* env, jobject clazz, jlong handle)
44369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
444d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    LOG_TRACE("onLowMemory_native");
44569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
44669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
44769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onLowMemory != NULL) {
448289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onLowMemory(code);
44969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
45069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
45169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
45269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
45369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
45458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonWindowFocusChanged_native(JNIEnv* env, jobject clazz, jlong handle, jboolean focused)
45569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
456d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    LOG_TRACE("onWindowFocusChanged_native");
45769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
45869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
45969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onWindowFocusChanged != NULL) {
460289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onWindowFocusChanged(code, focused ? 1 : 0);
46169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
46269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
46369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
46469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
46574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void
46658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceCreated_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface)
46774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{
468d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    LOG_TRACE("onSurfaceCreated_native");
46974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    if (handle != 0) {
47074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
47174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        code->setSurface(surface);
47254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        if (code->nativeWindow != NULL && code->callbacks.onNativeWindowCreated != NULL) {
473289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onNativeWindowCreated(code,
47454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn                    code->nativeWindow.get());
47574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
47674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
47774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn}
47874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
479d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic int32_t getWindowProp(ANativeWindow* window, int what) {
480d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    int value;
481d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    int res = window->query(window, what, &value);
482d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    return res < 0 ? res : value;
483d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn}
484d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
48574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void
48658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceChanged_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface,
48774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        jint format, jint width, jint height)
48874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{
489d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    LOG_TRACE("onSurfaceChanged_native");
49074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    if (handle != 0) {
49174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
49254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        sp<ANativeWindow> oldNativeWindow = code->nativeWindow;
49354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        code->setSurface(surface);
49454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        if (oldNativeWindow != code->nativeWindow) {
4958ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn            if (oldNativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) {
496289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn                code->callbacks.onNativeWindowDestroyed(code,
4978ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn                        oldNativeWindow.get());
4988ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn            }
499d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            if (code->nativeWindow != NULL) {
500d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                if (code->callbacks.onNativeWindowCreated != NULL) {
501d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    code->callbacks.onNativeWindowCreated(code,
502d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                            code->nativeWindow.get());
503d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                }
504d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                code->lastWindowWidth = getWindowProp(code->nativeWindow.get(),
505d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                        NATIVE_WINDOW_WIDTH);
506d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                code->lastWindowHeight = getWindowProp(code->nativeWindow.get(),
507d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                        NATIVE_WINDOW_HEIGHT);
508d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            }
509d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        } else {
510d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            // Maybe it resized?
511d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            int32_t newWidth = getWindowProp(code->nativeWindow.get(),
512d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    NATIVE_WINDOW_WIDTH);
513d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            int32_t newHeight = getWindowProp(code->nativeWindow.get(),
514d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    NATIVE_WINDOW_HEIGHT);
515d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            if (newWidth != code->lastWindowWidth
516d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    || newHeight != code->lastWindowHeight) {
517d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                if (code->callbacks.onNativeWindowResized != NULL) {
518d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    code->callbacks.onNativeWindowResized(code,
519d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                            code->nativeWindow.get());
520d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                }
52154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn            }
52274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
52374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
52474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn}
52574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
52674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void
52758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceRedrawNeeded_native(JNIEnv* env, jobject clazz, jlong handle)
528d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{
529d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    LOG_TRACE("onSurfaceRedrawNeeded_native");
530d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    if (handle != 0) {
531d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
532d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        if (code->nativeWindow != NULL && code->callbacks.onNativeWindowRedrawNeeded != NULL) {
533d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            code->callbacks.onNativeWindowRedrawNeeded(code, code->nativeWindow.get());
534d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        }
535d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    }
536d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn}
537d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
538d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void
53958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceDestroyed_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface)
54074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{
541d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    LOG_TRACE("onSurfaceDestroyed_native");
54274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    if (handle != 0) {
54374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
54454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        if (code->nativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) {
545289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onNativeWindowDestroyed(code,
54654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn                    code->nativeWindow.get());
54774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
54874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        code->setSurface(NULL);
54974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
55074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn}
55174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
552a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void
55358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonInputQueueCreated_native(JNIEnv* env, jobject clazz, jlong handle, jlong queuePtr)
554a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{
555d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    LOG_TRACE("onInputChannelCreated_native");
556a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    if (handle != 0) {
557a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
558a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        if (code->callbacks.onInputQueueCreated != NULL) {
559a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright            AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr);
560a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright            code->callbacks.onInputQueueCreated(code, queue);
561a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        }
562a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    }
563a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
564a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
565a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void
56658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonInputQueueDestroyed_native(JNIEnv* env, jobject clazz, jlong handle, jlong queuePtr)
567a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{
568d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    LOG_TRACE("onInputChannelDestroyed_native");
569a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    if (handle != 0) {
570a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
571a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright        if (code->callbacks.onInputQueueDestroyed != NULL) {
572a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright            AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr);
573a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright            code->callbacks.onInputQueueDestroyed(code, queue);
574a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        }
575a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    }
576a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
577a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
578d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void
57958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonContentRectChanged_native(JNIEnv* env, jobject clazz, jlong handle,
580d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        jint x, jint y, jint w, jint h)
581d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{
582d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    LOG_TRACE("onContentRectChanged_native");
583d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    if (handle != 0) {
584d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
585d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        if (code->callbacks.onContentRectChanged != NULL) {
586d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            ARect rect;
587d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            rect.left = x;
588d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            rect.top = y;
589d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            rect.right = x+w;
590d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            rect.bottom = y+h;
591d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            code->callbacks.onContentRectChanged(code, &rect);
592d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        }
593d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    }
594d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn}
595d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
59669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const JNINativeMethod g_methods[] = {
59758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "loadNativeCode", "(Ljava/lang/String;Ljava/lang/String;Landroid/os/MessageQueue;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/content/res/AssetManager;[B)J",
598682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn            (void*)loadNativeCode_native },
59958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "unloadNativeCode", "(J)V", (void*)unloadNativeCode_native },
60058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onStartNative", "(J)V", (void*)onStart_native },
60158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onResumeNative", "(J)V", (void*)onResume_native },
60258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onSaveInstanceStateNative", "(J)[B", (void*)onSaveInstanceState_native },
60358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onPauseNative", "(J)V", (void*)onPause_native },
60458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onStopNative", "(J)V", (void*)onStop_native },
60558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onConfigurationChangedNative", "(J)V", (void*)onConfigurationChanged_native },
60658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onLowMemoryNative", "(J)V", (void*)onLowMemory_native },
60758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onWindowFocusChangedNative", "(JZ)V", (void*)onWindowFocusChanged_native },
60858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onSurfaceCreatedNative", "(JLandroid/view/Surface;)V", (void*)onSurfaceCreated_native },
60958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onSurfaceChangedNative", "(JLandroid/view/Surface;III)V", (void*)onSurfaceChanged_native },
61058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onSurfaceRedrawNeededNative", "(JLandroid/view/Surface;)V", (void*)onSurfaceRedrawNeeded_native },
61158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onSurfaceDestroyedNative", "(J)V", (void*)onSurfaceDestroyed_native },
61258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onInputQueueCreatedNative", "(JJ)V",
613a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright        (void*)onInputQueueCreated_native },
61458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onInputQueueDestroyedNative", "(JJ)V",
615a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright        (void*)onInputQueueDestroyed_native },
61658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onContentRectChangedNative", "(JIIII)V", (void*)onContentRectChanged_native },
61769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn};
61869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
61969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const char* const kNativeActivityPathName = "android/app/NativeActivity";
62069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
6213c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#define FIND_CLASS(var, className) \
6223c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        var = env->FindClass(className); \
62317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro        LOG_FATAL_IF(! var, "Unable to find class %s", className);
6243c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
6253c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#define GET_METHOD_ID(var, clazz, methodName, fieldDescriptor) \
6263c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        var = env->GetMethodID(clazz, methodName, fieldDescriptor); \
6273c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        LOG_FATAL_IF(! var, "Unable to find method" methodName);
6283c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
62969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornint register_android_app_NativeActivity(JNIEnv* env)
63069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
6315baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    //ALOGD("register_android_app_NativeActivity");
63217cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    jclass clazz;
63317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    FIND_CLASS(clazz, kNativeActivityPathName);
63469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
635db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn    GET_METHOD_ID(gNativeActivityClassInfo.finish,
63617cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro            clazz,
637db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn            "finish", "()V");
63854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn    GET_METHOD_ID(gNativeActivityClassInfo.setWindowFlags,
63917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro            clazz,
64054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn            "setWindowFlags", "(II)V");
64154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn    GET_METHOD_ID(gNativeActivityClassInfo.setWindowFormat,
64217cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro            clazz,
64354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn            "setWindowFormat", "(I)V");
644d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    GET_METHOD_ID(gNativeActivityClassInfo.showIme,
64517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro            clazz,
646d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            "showIme", "(I)V");
647d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    GET_METHOD_ID(gNativeActivityClassInfo.hideIme,
64817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro            clazz,
649d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            "hideIme", "(I)V");
65054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn
65169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    return AndroidRuntime::registerNativeMethods(
65269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        env, kNativeActivityPathName,
65369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        g_methods, NELEM(g_methods));
65469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
65569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
656a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} // namespace android
657