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