169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn/*
269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * Copyright (C) 2010 The Android Open Source Project
369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn *
469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * you may not use this file except in compliance with the License.
669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * You may obtain a copy of the License at
769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn *
869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn *
1069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * Unless required by applicable law or agreed to in writing, software
1169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
1269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * See the License for the specific language governing permissions and
1469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * limitations under the License.
1569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn */
1669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
1769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn#define LOG_TAG "NativeActivity"
1869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn#include <utils/Log.h>
1969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
203c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include <poll.h>
213c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include <dlfcn.h>
22d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn#include <fcntl.h>
233c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
24048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov#include <memory>
25048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov
26289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#include <android_runtime/android_app_NativeActivity.h>
276cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate#include <android_runtime/android_util_AssetManager.h>
288335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <android_runtime/android_view_Surface.h>
298335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <android_runtime/AndroidRuntime.h>
309d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/InputTransport.h>
318335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian
328335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <gui/Surface.h>
338335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian
348335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <system/window.h>
358335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian
364fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown#include <utils/Looper.h>
3769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
383c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "JNIHelp.h"
393c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "android_os_MessageQueue.h"
403c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "android_view_InputChannel.h"
413c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "android_view_KeyEvent.h"
4269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
4303c866020b46079afe895dd90f2d60bda06dbe05Yong WU#include "nativebridge/native_bridge.h"
44048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov#include "nativeloader/native_loader.h"
4503c866020b46079afe895dd90f2d60bda06dbe05Yong WU
46987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h"
47987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
48ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe
49db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn#define LOG_TRACE(...)
5028d9f024e043817212b15f04128d0464330502eaSteve Block//#define LOG_TRACE(...) ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)
51d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
5269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornnamespace android
5369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
5469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
55ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampestatic const bool kLogTrace = false;
56ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe
573c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornstatic struct {
58db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn    jmethodID finish;
5954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn    jmethodID setWindowFlags;
6054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn    jmethodID setWindowFormat;
61d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    jmethodID showIme;
62d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    jmethodID hideIme;
633c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} gNativeActivityClassInfo;
643c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
6554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------
6654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn
67289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstruct ActivityWork {
68289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    int32_t cmd;
69289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    int32_t arg1;
70289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    int32_t arg2;
71289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn};
72289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn
73289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornenum {
74a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright    CMD_FINISH = 1,
75289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    CMD_SET_WINDOW_FORMAT,
76289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    CMD_SET_WINDOW_FLAGS,
77d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    CMD_SHOW_SOFT_INPUT,
78d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    CMD_HIDE_SOFT_INPUT,
79289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn};
80289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn
81289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstatic void write_work(int fd, int32_t cmd, int32_t arg1=0, int32_t arg2=0) {
82289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    ActivityWork work;
83289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    work.cmd = cmd;
84289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    work.arg1 = arg1;
85289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    work.arg2 = arg2;
86ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe
87ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
88ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("write_work: cmd=%d", cmd);
89ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
90d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
91289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornrestart:
92289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    int res = write(fd, &work, sizeof(work));
93289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    if (res < 0 && errno == EINTR) {
94289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        goto restart;
95289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    }
96289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn
97289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    if (res == sizeof(work)) return;
98289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn
998564c8da817a845353d213acd8636b76f567b234Steve Block    if (res < 0) ALOGW("Failed writing to work fd: %s", strerror(errno));
1008564c8da817a845353d213acd8636b76f567b234Steve Block    else ALOGW("Truncated writing to work fd: %d", res);
101289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn}
102289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn
103289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstatic bool read_work(int fd, ActivityWork* outWork) {
104289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    int res = read(fd, outWork, sizeof(ActivityWork));
105289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    // no need to worry about EINTR, poll loop will just come back again.
106289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    if (res == sizeof(ActivityWork)) return true;
107289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn
1088564c8da817a845353d213acd8636b76f567b234Steve Block    if (res < 0) ALOGW("Failed reading work fd: %s", strerror(errno));
1098564c8da817a845353d213acd8636b76f567b234Steve Block    else ALOGW("Truncated reading work fd: %d", res);
110289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    return false;
111289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn}
112289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn
11354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn/*
11454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Native state for interacting with the NativeActivity class.
11554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn */
116289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstruct NativeCode : public ANativeActivity {
1172e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn    NativeCode(void* _dlhandle, ANativeActivity_createFunc* _createFunc) {
118d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        memset((ANativeActivity*)this, 0, sizeof(ANativeActivity));
119d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        memset(&callbacks, 0, sizeof(callbacks));
12074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        dlhandle = _dlhandle;
12174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        createActivityFunc = _createFunc;
12254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        nativeWindow = NULL;
1233c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        mainWorkRead = mainWorkWrite = -1;
12474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
12574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
12674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    ~NativeCode() {
127289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        if (callbacks.onDestroy != NULL) {
128289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            callbacks.onDestroy(this);
129289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        }
130289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        if (env != NULL && clazz != NULL) {
131289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            env->DeleteGlobalRef(clazz);
1323c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        }
133603b44589682db3ff33ade172facb0c5e309f1beJeff Brown        if (messageQueue != NULL && mainWorkRead >= 0) {
134603b44589682db3ff33ade172facb0c5e309f1beJeff Brown            messageQueue->getLooper()->removeFd(mainWorkRead);
1353c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        }
136a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        setSurface(NULL);
1373c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        if (mainWorkRead >= 0) close(mainWorkRead);
1383c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        if (mainWorkWrite >= 0) close(mainWorkWrite);
13974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (dlhandle != NULL) {
14054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn            // for now don't unload...  we probably should clean this
14154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn            // up and only keep one open dlhandle per proc, since there
14254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn            // is really no benefit to unloading the code.
14354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn            //dlclose(dlhandle);
14474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
14574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
14674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
14774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    void setSurface(jobject _surface) {
14874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (_surface != NULL) {
14964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            nativeWindow = android_view_Surface_getNativeWindow(env, _surface);
15074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        } else {
15154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn            nativeWindow = NULL;
15274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
15374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
15474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
1552e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn    ANativeActivityCallbacks callbacks;
15669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
15769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    void* dlhandle;
1582e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn    ANativeActivity_createFunc* createActivityFunc;
15974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
160805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    String8 internalDataPathObj;
161805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    String8 externalDataPathObj;
162805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    String8 obbPathObj;
163682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
16454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn    sp<ANativeWindow> nativeWindow;
165d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    int32_t lastWindowWidth;
166d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    int32_t lastWindowHeight;
167d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
1683c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    // These are used to wake up the main thread to process work.
1693c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    int mainWorkRead;
1703c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    int mainWorkWrite;
171603b44589682db3ff33ade172facb0c5e309f1beJeff Brown    sp<MessageQueue> messageQueue;
17269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn};
17369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
174db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackbornvoid android_NativeActivity_finish(ANativeActivity* activity) {
175db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn    NativeCode* code = static_cast<NativeCode*>(activity);
176db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn    write_work(code->mainWorkWrite, CMD_FINISH, 0);
177db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn}
178db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn
179289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornvoid android_NativeActivity_setWindowFormat(
180289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        ANativeActivity* activity, int32_t format) {
181289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    NativeCode* code = static_cast<NativeCode*>(activity);
182289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    write_work(code->mainWorkWrite, CMD_SET_WINDOW_FORMAT, format);
183289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn}
184289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn
185289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornvoid android_NativeActivity_setWindowFlags(
186289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        ANativeActivity* activity, int32_t values, int32_t mask) {
187289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    NativeCode* code = static_cast<NativeCode*>(activity);
188289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    write_work(code->mainWorkWrite, CMD_SET_WINDOW_FLAGS, values, mask);
189289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn}
190289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn
191d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid android_NativeActivity_showSoftInput(
192d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        ANativeActivity* activity, int32_t flags) {
193d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    NativeCode* code = static_cast<NativeCode*>(activity);
194d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    write_work(code->mainWorkWrite, CMD_SHOW_SOFT_INPUT, flags);
195d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn}
196d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
197d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid android_NativeActivity_hideSoftInput(
198d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        ANativeActivity* activity, int32_t flags) {
199d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    NativeCode* code = static_cast<NativeCode*>(activity);
200d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    write_work(code->mainWorkWrite, CMD_HIDE_SOFT_INPUT, flags);
201d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn}
202d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
20354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------
20454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn
20554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn/*
20654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Callback for handling native events on the application's main thread.
20754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn */
2084fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownstatic int mainWorkCallback(int fd, int events, void* data) {
2093c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    NativeCode* code = (NativeCode*)data;
210289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    if ((events & POLLIN) == 0) {
2114fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        return 1;
212289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    }
213289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn
214289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    ActivityWork work;
215289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    if (!read_work(code->mainWorkRead, &work)) {
2164fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        return 1;
217289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    }
218d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
219ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
220ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("mainWorkCallback: cmd=%d", work.cmd);
221ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
222d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
223289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn    switch (work.cmd) {
224db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn        case CMD_FINISH: {
225db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn            code->env->CallVoidMethod(code->clazz, gNativeActivityClassInfo.finish);
226603b44589682db3ff33ade172facb0c5e309f1beJeff Brown            code->messageQueue->raiseAndClearException(code->env, "finish");
227db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn        } break;
228289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        case CMD_SET_WINDOW_FORMAT: {
229289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->env->CallVoidMethod(code->clazz,
230289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn                    gNativeActivityClassInfo.setWindowFormat, work.arg1);
231603b44589682db3ff33ade172facb0c5e309f1beJeff Brown            code->messageQueue->raiseAndClearException(code->env, "setWindowFormat");
232289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        } break;
233289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        case CMD_SET_WINDOW_FLAGS: {
234289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->env->CallVoidMethod(code->clazz,
235289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn                    gNativeActivityClassInfo.setWindowFlags, work.arg1, work.arg2);
236603b44589682db3ff33ade172facb0c5e309f1beJeff Brown            code->messageQueue->raiseAndClearException(code->env, "setWindowFlags");
237289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        } break;
238d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        case CMD_SHOW_SOFT_INPUT: {
239d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            code->env->CallVoidMethod(code->clazz,
240d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    gNativeActivityClassInfo.showIme, work.arg1);
241603b44589682db3ff33ade172facb0c5e309f1beJeff Brown            code->messageQueue->raiseAndClearException(code->env, "showIme");
242d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        } break;
243d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        case CMD_HIDE_SOFT_INPUT: {
244d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            code->env->CallVoidMethod(code->clazz,
245d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    gNativeActivityClassInfo.hideIme, work.arg1);
246603b44589682db3ff33ade172facb0c5e309f1beJeff Brown            code->messageQueue->raiseAndClearException(code->env, "hideIme");
247d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        } break;
248289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        default:
2498564c8da817a845353d213acd8636b76f567b234Steve Block            ALOGW("Unknown work command: %d", work.cmd);
250289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            break;
2513c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    }
2523c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
2534fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    return 1;
2543c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn}
2553c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
25654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------
25754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn
25858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhatstatic jlong
259e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne HackbornloadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jstring funcName,
260805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        jobject messageQueue, jstring internalDataDir, jstring obbDir,
261048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov        jstring externalDataDir, jint sdkVersion, jobject jAssetMgr,
262a55c7f15a3c386ec643f21eeb2f4e9fd7b03ba70Dimitry Ivanov        jbyteArray savedState, jobject classLoader, jstring libraryPath) {
263ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
264ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("loadNativeCode_native");
265ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
266d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
26769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    const char* pathStr = env->GetStringUTFChars(path, NULL);
268048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov    std::unique_ptr<NativeCode> code;
26903c866020b46079afe895dd90f2d60bda06dbe05Yong WU    bool needNativeBridge = false;
27003c866020b46079afe895dd90f2d60bda06dbe05Yong WU
271a55c7f15a3c386ec643f21eeb2f4e9fd7b03ba70Dimitry Ivanov    void* handle = OpenNativeLibrary(env, sdkVersion, pathStr, classLoader, libraryPath);
27203c866020b46079afe895dd90f2d60bda06dbe05Yong WU    if (handle == NULL) {
27303c866020b46079afe895dd90f2d60bda06dbe05Yong WU        if (NativeBridgeIsSupported(pathStr)) {
27403c866020b46079afe895dd90f2d60bda06dbe05Yong WU            handle = NativeBridgeLoadLibrary(pathStr, RTLD_LAZY);
27503c866020b46079afe895dd90f2d60bda06dbe05Yong WU            needNativeBridge = true;
27603c866020b46079afe895dd90f2d60bda06dbe05Yong WU        }
27703c866020b46079afe895dd90f2d60bda06dbe05Yong WU    }
27869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    env->ReleaseStringUTFChars(path, pathStr);
27903c866020b46079afe895dd90f2d60bda06dbe05Yong WU
28069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != NULL) {
28103c866020b46079afe895dd90f2d60bda06dbe05Yong WU        void* funcPtr = NULL;
282e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn        const char* funcStr = env->GetStringUTFChars(funcName, NULL);
28303c866020b46079afe895dd90f2d60bda06dbe05Yong WU        if (needNativeBridge) {
28403c866020b46079afe895dd90f2d60bda06dbe05Yong WU            funcPtr = NativeBridgeGetTrampoline(handle, funcStr, NULL, 0);
28503c866020b46079afe895dd90f2d60bda06dbe05Yong WU        } else {
28603c866020b46079afe895dd90f2d60bda06dbe05Yong WU            funcPtr = dlsym(handle, funcStr);
28703c866020b46079afe895dd90f2d60bda06dbe05Yong WU        }
28803c866020b46079afe895dd90f2d60bda06dbe05Yong WU
289048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov        code.reset(new NativeCode(handle, (ANativeActivity_createFunc*)funcPtr));
290e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn        env->ReleaseStringUTFChars(funcName, funcStr);
29103c866020b46079afe895dd90f2d60bda06dbe05Yong WU
29269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->createActivityFunc == NULL) {
2938564c8da817a845353d213acd8636b76f567b234Steve Block            ALOGW("ANativeActivity_onCreate not found");
29469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            return 0;
29569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
2963c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
297603b44589682db3ff33ade172facb0c5e309f1beJeff Brown        code->messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueue);
298603b44589682db3ff33ade172facb0c5e309f1beJeff Brown        if (code->messageQueue == NULL) {
299603b44589682db3ff33ade172facb0c5e309f1beJeff Brown            ALOGW("Unable to retrieve native MessageQueue");
3003c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn            return 0;
3013c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        }
3023c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
3033c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        int msgpipe[2];
3043c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        if (pipe(msgpipe)) {
3058564c8da817a845353d213acd8636b76f567b234Steve Block            ALOGW("could not create pipe: %s", strerror(errno));
3063c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn            return 0;
3073c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        }
3083c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        code->mainWorkRead = msgpipe[0];
3093c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        code->mainWorkWrite = msgpipe[1];
310d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        int result = fcntl(code->mainWorkRead, F_SETFL, O_NONBLOCK);
311d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        SLOGW_IF(result != 0, "Could not make main work read pipe "
312d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                "non-blocking: %s", strerror(errno));
313d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        result = fcntl(code->mainWorkWrite, F_SETFL, O_NONBLOCK);
314d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        SLOGW_IF(result != 0, "Could not make main work write pipe "
315d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                "non-blocking: %s", strerror(errno));
316603b44589682db3ff33ade172facb0c5e309f1beJeff Brown        code->messageQueue->getLooper()->addFd(
317048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov                code->mainWorkRead, 0, ALOOPER_EVENT_INPUT, mainWorkCallback, code.get());
3183c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
319289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        code->ANativeActivity::callbacks = &code->callbacks;
320289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        if (env->GetJavaVM(&code->vm) < 0) {
3218564c8da817a845353d213acd8636b76f567b234Steve Block            ALOGW("NativeActivity GetJavaVM failed");
3222e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn            return 0;
3232e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn        }
324289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        code->env = env;
325289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        code->clazz = env->NewGlobalRef(clazz);
3266cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate
327682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn        const char* dirStr = env->GetStringUTFChars(internalDataDir, NULL);
328805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        code->internalDataPathObj = dirStr;
329805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        code->internalDataPath = code->internalDataPathObj.string();
330805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        env->ReleaseStringUTFChars(internalDataDir, dirStr);
331682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
332e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey        if (externalDataDir != NULL) {
333e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            dirStr = env->GetStringUTFChars(externalDataDir, NULL);
334e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            code->externalDataPathObj = dirStr;
335e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            env->ReleaseStringUTFChars(externalDataDir, dirStr);
336e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey        }
337805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        code->externalDataPath = code->externalDataPathObj.string();
3386cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate
339289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        code->sdkVersion = sdkVersion;
340682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
3416cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate        code->assetManager = assetManagerForJavaObject(env, jAssetMgr);
3426cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate
343e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey        if (obbDir != NULL) {
344e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            dirStr = env->GetStringUTFChars(obbDir, NULL);
345e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            code->obbPathObj = dirStr;
346e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            env->ReleaseStringUTFChars(obbDir, dirStr);
347e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey        }
348805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        code->obbPath = code->obbPathObj.string();
349805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn
35008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        jbyte* rawSavedState = NULL;
35108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        jsize rawSavedSize = 0;
35208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        if (savedState != NULL) {
35308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            rawSavedState = env->GetByteArrayElements(savedState, NULL);
35408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            rawSavedSize = env->GetArrayLength(savedState);
35508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        }
35608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
357048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov        code->createActivityFunc(code.get(), rawSavedState, rawSavedSize);
35808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
35908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        if (rawSavedState != NULL) {
36008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            env->ReleaseByteArrayElements(savedState, rawSavedState, 0);
36108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        }
36269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
36369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
364048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov    return (jlong)code.release();
365048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov}
366048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov
367048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanovstatic jstring getDlError_native(JNIEnv* env, jobject clazz) {
368048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov  return env->NewStringUTF(dlerror());
36969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
37069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
37169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
37258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatunloadNativeCode_native(JNIEnv* env, jobject clazz, jlong handle)
37369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
374ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
375ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("unloadNativeCode_native");
376ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
37769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
37869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
37969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        delete code;
38069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
38169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
38269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
38369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
38458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonStart_native(JNIEnv* env, jobject clazz, jlong handle)
38569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
386ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
387ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onStart_native");
388ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
38969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
39069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
39169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onStart != NULL) {
392289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onStart(code);
39369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
39469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
39569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
39669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
39769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
39858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonResume_native(JNIEnv* env, jobject clazz, jlong handle)
39969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
400ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
401ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onResume_native");
402ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
40369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
40469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
40569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onResume != NULL) {
406289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onResume(code);
40769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
40869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
40969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
41069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
41108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic jbyteArray
41258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSaveInstanceState_native(JNIEnv* env, jobject clazz, jlong handle)
41369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
414ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
415ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onSaveInstanceState_native");
416ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
41708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
41808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jbyteArray array = NULL;
41908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
42069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
42169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
42269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onSaveInstanceState != NULL) {
42369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            size_t len = 0;
42408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            jbyte* state = (jbyte*)code->callbacks.onSaveInstanceState(code, &len);
42508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            if (len > 0) {
42608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn                array = env->NewByteArray(len);
42708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn                if (array != NULL) {
42808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn                    env->SetByteArrayRegion(array, 0, len, state);
42908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn                }
43008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            }
43108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            if (state != NULL) {
43208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn                free(state);
43308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            }
43469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
43569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
43608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
43708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    return array;
43869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
43969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
44069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
44158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonPause_native(JNIEnv* env, jobject clazz, jlong handle)
44269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
443ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
444ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onPause_native");
445ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
44669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
44769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
44869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onPause != NULL) {
449289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onPause(code);
45069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
45169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
45269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
45369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
45469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
45558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonStop_native(JNIEnv* env, jobject clazz, jlong handle)
45669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
457ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
458ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onStop_native");
459ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
46069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
46169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
46269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onStop != NULL) {
463289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onStop(code);
46469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
46569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
46669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
46769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
46869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
46958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonConfigurationChanged_native(JNIEnv* env, jobject clazz, jlong handle)
47008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn{
471ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
472ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onConfigurationChanged_native");
473ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
47408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    if (handle != 0) {
47508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
47608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        if (code->callbacks.onConfigurationChanged != NULL) {
47708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            code->callbacks.onConfigurationChanged(code);
47808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        }
47908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    }
48008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn}
48108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
48208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic void
48358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonLowMemory_native(JNIEnv* env, jobject clazz, jlong handle)
48469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
485ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
486ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onLowMemory_native");
487ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
48869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
48969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
49069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onLowMemory != NULL) {
491289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onLowMemory(code);
49269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
49369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
49469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
49569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
49669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
49758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonWindowFocusChanged_native(JNIEnv* env, jobject clazz, jlong handle, jboolean focused)
49869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
499ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
500ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onWindowFocusChanged_native");
501ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
50269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
50369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
50469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onWindowFocusChanged != NULL) {
505289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onWindowFocusChanged(code, focused ? 1 : 0);
50669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
50769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
50869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
50969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
51074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void
51158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceCreated_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface)
51274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{
513ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
514ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onSurfaceCreated_native");
515ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
51674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    if (handle != 0) {
51774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
51874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        code->setSurface(surface);
51954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        if (code->nativeWindow != NULL && code->callbacks.onNativeWindowCreated != NULL) {
520289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onNativeWindowCreated(code,
52154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn                    code->nativeWindow.get());
52274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
52374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
52474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn}
52574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
526d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic int32_t getWindowProp(ANativeWindow* window, int what) {
527d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    int value;
528d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    int res = window->query(window, what, &value);
529d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    return res < 0 ? res : value;
530d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn}
531d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
53274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void
53358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceChanged_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface,
53474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        jint format, jint width, jint height)
53574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{
536ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
537ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onSurfaceChanged_native");
538ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
53974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    if (handle != 0) {
54074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
54154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        sp<ANativeWindow> oldNativeWindow = code->nativeWindow;
54254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        code->setSurface(surface);
54354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        if (oldNativeWindow != code->nativeWindow) {
5448ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn            if (oldNativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) {
545289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn                code->callbacks.onNativeWindowDestroyed(code,
5468ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn                        oldNativeWindow.get());
5478ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn            }
548d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            if (code->nativeWindow != NULL) {
549d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                if (code->callbacks.onNativeWindowCreated != NULL) {
550d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    code->callbacks.onNativeWindowCreated(code,
551d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                            code->nativeWindow.get());
552d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                }
553d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                code->lastWindowWidth = getWindowProp(code->nativeWindow.get(),
554d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                        NATIVE_WINDOW_WIDTH);
555d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                code->lastWindowHeight = getWindowProp(code->nativeWindow.get(),
556d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                        NATIVE_WINDOW_HEIGHT);
557d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            }
558d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        } else {
559d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            // Maybe it resized?
560d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            int32_t newWidth = getWindowProp(code->nativeWindow.get(),
561d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    NATIVE_WINDOW_WIDTH);
562d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            int32_t newHeight = getWindowProp(code->nativeWindow.get(),
563d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    NATIVE_WINDOW_HEIGHT);
564d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            if (newWidth != code->lastWindowWidth
565d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    || newHeight != code->lastWindowHeight) {
566d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                if (code->callbacks.onNativeWindowResized != NULL) {
567d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    code->callbacks.onNativeWindowResized(code,
568d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                            code->nativeWindow.get());
569d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                }
57054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn            }
57174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
57274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
57374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn}
57474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
57574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void
57658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceRedrawNeeded_native(JNIEnv* env, jobject clazz, jlong handle)
577d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{
578ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
579ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onSurfaceRedrawNeeded_native");
580ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
581d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    if (handle != 0) {
582d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
583d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        if (code->nativeWindow != NULL && code->callbacks.onNativeWindowRedrawNeeded != NULL) {
584d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            code->callbacks.onNativeWindowRedrawNeeded(code, code->nativeWindow.get());
585d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        }
586d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    }
587d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn}
588d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
589d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void
59058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceDestroyed_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface)
59174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{
592ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
593ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onSurfaceDestroyed_native");
594ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
59574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    if (handle != 0) {
59674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
59754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        if (code->nativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) {
598289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onNativeWindowDestroyed(code,
59954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn                    code->nativeWindow.get());
60074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
60174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        code->setSurface(NULL);
60274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
60374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn}
60474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
605a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void
60658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonInputQueueCreated_native(JNIEnv* env, jobject clazz, jlong handle, jlong queuePtr)
607a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{
608ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
609ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onInputChannelCreated_native");
610ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
611a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    if (handle != 0) {
612a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
613a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        if (code->callbacks.onInputQueueCreated != NULL) {
614a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright            AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr);
615a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright            code->callbacks.onInputQueueCreated(code, queue);
616a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        }
617a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    }
618a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
619a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
620a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void
62158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonInputQueueDestroyed_native(JNIEnv* env, jobject clazz, jlong handle, jlong queuePtr)
622a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{
623ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
624ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onInputChannelDestroyed_native");
625ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
626a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    if (handle != 0) {
627a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
628a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright        if (code->callbacks.onInputQueueDestroyed != NULL) {
629a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright            AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr);
630a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright            code->callbacks.onInputQueueDestroyed(code, queue);
631a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        }
632a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    }
633a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
634a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
635d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void
63658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonContentRectChanged_native(JNIEnv* env, jobject clazz, jlong handle,
637d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        jint x, jint y, jint w, jint h)
638d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{
639ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
640ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onContentRectChanged_native");
641ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
642d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    if (handle != 0) {
643d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
644d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        if (code->callbacks.onContentRectChanged != NULL) {
645d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            ARect rect;
646d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            rect.left = x;
647d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            rect.top = y;
648d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            rect.right = x+w;
649d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            rect.bottom = y+h;
650d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            code->callbacks.onContentRectChanged(code, &rect);
651d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        }
652d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    }
653d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn}
654d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
65569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const JNINativeMethod g_methods[] = {
656048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov    { "loadNativeCode",
657a55c7f15a3c386ec643f21eeb2f4e9fd7b03ba70Dimitry Ivanov        "(Ljava/lang/String;Ljava/lang/String;Landroid/os/MessageQueue;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/content/res/AssetManager;[BLjava/lang/ClassLoader;Ljava/lang/String;)J",
658048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov        (void*)loadNativeCode_native },
659048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov    { "getDlError", "()Ljava/lang/String;", (void*) getDlError_native },
66058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "unloadNativeCode", "(J)V", (void*)unloadNativeCode_native },
66158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onStartNative", "(J)V", (void*)onStart_native },
66258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onResumeNative", "(J)V", (void*)onResume_native },
66358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onSaveInstanceStateNative", "(J)[B", (void*)onSaveInstanceState_native },
66458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onPauseNative", "(J)V", (void*)onPause_native },
66558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onStopNative", "(J)V", (void*)onStop_native },
66658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onConfigurationChangedNative", "(J)V", (void*)onConfigurationChanged_native },
66758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onLowMemoryNative", "(J)V", (void*)onLowMemory_native },
66858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onWindowFocusChangedNative", "(JZ)V", (void*)onWindowFocusChanged_native },
66958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onSurfaceCreatedNative", "(JLandroid/view/Surface;)V", (void*)onSurfaceCreated_native },
67058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onSurfaceChangedNative", "(JLandroid/view/Surface;III)V", (void*)onSurfaceChanged_native },
67158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onSurfaceRedrawNeededNative", "(JLandroid/view/Surface;)V", (void*)onSurfaceRedrawNeeded_native },
67258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onSurfaceDestroyedNative", "(J)V", (void*)onSurfaceDestroyed_native },
67358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onInputQueueCreatedNative", "(JJ)V",
674a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright        (void*)onInputQueueCreated_native },
67558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onInputQueueDestroyedNative", "(JJ)V",
676a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright        (void*)onInputQueueDestroyed_native },
67758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onContentRectChangedNative", "(JIIII)V", (void*)onContentRectChanged_native },
67869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn};
67969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
68069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const char* const kNativeActivityPathName = "android/app/NativeActivity";
68169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
68269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornint register_android_app_NativeActivity(JNIEnv* env)
68369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
6845baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    //ALOGD("register_android_app_NativeActivity");
685987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    jclass clazz = FindClassOrDie(env, kNativeActivityPathName);
686987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
687987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gNativeActivityClassInfo.finish = GetMethodIDOrDie(env, clazz, "finish", "()V");
688987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gNativeActivityClassInfo.setWindowFlags = GetMethodIDOrDie(env, clazz, "setWindowFlags",
689987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe                                                               "(II)V");
690987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gNativeActivityClassInfo.setWindowFormat = GetMethodIDOrDie(env, clazz, "setWindowFormat",
691987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe                                                                "(I)V");
692987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gNativeActivityClassInfo.showIme = GetMethodIDOrDie(env, clazz, "showIme", "(I)V");
693987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gNativeActivityClassInfo.hideIme = GetMethodIDOrDie(env, clazz, "hideIme", "(I)V");
694987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
695987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return RegisterMethodsOrDie(env, kNativeActivityPathName, g_methods, NELEM(g_methods));
69669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
69769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
698a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} // namespace android
699