android_app_NativeActivity.cpp revision 048a0db7b512326d0fae0efa7fef7ea2d17a3dd8
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,
262048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov        jbyteArray savedState, jobject classLoader, jstring libraryPath,
263048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov        jstring isolationPath) {
264ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
265ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("loadNativeCode_native");
266ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
267d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
26869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    const char* pathStr = env->GetStringUTFChars(path, NULL);
269048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov    std::unique_ptr<NativeCode> code;
27003c866020b46079afe895dd90f2d60bda06dbe05Yong WU    bool needNativeBridge = false;
27103c866020b46079afe895dd90f2d60bda06dbe05Yong WU
272048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov    void* handle = OpenNativeLibrary(env, sdkVersion, pathStr, classLoader,
273048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov                                     libraryPath, isolationPath);
27403c866020b46079afe895dd90f2d60bda06dbe05Yong WU    if (handle == NULL) {
27503c866020b46079afe895dd90f2d60bda06dbe05Yong WU        if (NativeBridgeIsSupported(pathStr)) {
27603c866020b46079afe895dd90f2d60bda06dbe05Yong WU            handle = NativeBridgeLoadLibrary(pathStr, RTLD_LAZY);
27703c866020b46079afe895dd90f2d60bda06dbe05Yong WU            needNativeBridge = true;
27803c866020b46079afe895dd90f2d60bda06dbe05Yong WU        }
27903c866020b46079afe895dd90f2d60bda06dbe05Yong WU    }
28069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    env->ReleaseStringUTFChars(path, pathStr);
28103c866020b46079afe895dd90f2d60bda06dbe05Yong WU
28269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != NULL) {
28303c866020b46079afe895dd90f2d60bda06dbe05Yong WU        void* funcPtr = NULL;
284e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn        const char* funcStr = env->GetStringUTFChars(funcName, NULL);
28503c866020b46079afe895dd90f2d60bda06dbe05Yong WU        if (needNativeBridge) {
28603c866020b46079afe895dd90f2d60bda06dbe05Yong WU            funcPtr = NativeBridgeGetTrampoline(handle, funcStr, NULL, 0);
28703c866020b46079afe895dd90f2d60bda06dbe05Yong WU        } else {
28803c866020b46079afe895dd90f2d60bda06dbe05Yong WU            funcPtr = dlsym(handle, funcStr);
28903c866020b46079afe895dd90f2d60bda06dbe05Yong WU        }
29003c866020b46079afe895dd90f2d60bda06dbe05Yong WU
291048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov        code.reset(new NativeCode(handle, (ANativeActivity_createFunc*)funcPtr));
292e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn        env->ReleaseStringUTFChars(funcName, funcStr);
29303c866020b46079afe895dd90f2d60bda06dbe05Yong WU
29469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->createActivityFunc == NULL) {
2958564c8da817a845353d213acd8636b76f567b234Steve Block            ALOGW("ANativeActivity_onCreate not found");
29669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            return 0;
29769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
2983c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
299603b44589682db3ff33ade172facb0c5e309f1beJeff Brown        code->messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueue);
300603b44589682db3ff33ade172facb0c5e309f1beJeff Brown        if (code->messageQueue == NULL) {
301603b44589682db3ff33ade172facb0c5e309f1beJeff Brown            ALOGW("Unable to retrieve native MessageQueue");
3023c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn            return 0;
3033c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        }
3043c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
3053c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        int msgpipe[2];
3063c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        if (pipe(msgpipe)) {
3078564c8da817a845353d213acd8636b76f567b234Steve Block            ALOGW("could not create pipe: %s", strerror(errno));
3083c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn            return 0;
3093c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        }
3103c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        code->mainWorkRead = msgpipe[0];
3113c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        code->mainWorkWrite = msgpipe[1];
312d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        int result = fcntl(code->mainWorkRead, F_SETFL, O_NONBLOCK);
313d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        SLOGW_IF(result != 0, "Could not make main work read pipe "
314d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                "non-blocking: %s", strerror(errno));
315d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        result = fcntl(code->mainWorkWrite, F_SETFL, O_NONBLOCK);
316d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        SLOGW_IF(result != 0, "Could not make main work write pipe "
317d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                "non-blocking: %s", strerror(errno));
318603b44589682db3ff33ade172facb0c5e309f1beJeff Brown        code->messageQueue->getLooper()->addFd(
319048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov                code->mainWorkRead, 0, ALOOPER_EVENT_INPUT, mainWorkCallback, code.get());
3203c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
321289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        code->ANativeActivity::callbacks = &code->callbacks;
322289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        if (env->GetJavaVM(&code->vm) < 0) {
3238564c8da817a845353d213acd8636b76f567b234Steve Block            ALOGW("NativeActivity GetJavaVM failed");
3242e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn            return 0;
3252e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn        }
326289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        code->env = env;
327289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        code->clazz = env->NewGlobalRef(clazz);
3286cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate
329682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn        const char* dirStr = env->GetStringUTFChars(internalDataDir, NULL);
330805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        code->internalDataPathObj = dirStr;
331805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        code->internalDataPath = code->internalDataPathObj.string();
332805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        env->ReleaseStringUTFChars(internalDataDir, dirStr);
333682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
334e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey        if (externalDataDir != NULL) {
335e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            dirStr = env->GetStringUTFChars(externalDataDir, NULL);
336e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            code->externalDataPathObj = dirStr;
337e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            env->ReleaseStringUTFChars(externalDataDir, dirStr);
338e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey        }
339805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        code->externalDataPath = code->externalDataPathObj.string();
3406cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate
341289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn        code->sdkVersion = sdkVersion;
342682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
3436cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate        code->assetManager = assetManagerForJavaObject(env, jAssetMgr);
3446cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate
345e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey        if (obbDir != NULL) {
346e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            dirStr = env->GetStringUTFChars(obbDir, NULL);
347e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            code->obbPathObj = dirStr;
348e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey            env->ReleaseStringUTFChars(obbDir, dirStr);
349e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey        }
350805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        code->obbPath = code->obbPathObj.string();
351805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn
35208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        jbyte* rawSavedState = NULL;
35308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        jsize rawSavedSize = 0;
35408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        if (savedState != NULL) {
35508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            rawSavedState = env->GetByteArrayElements(savedState, NULL);
35608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            rawSavedSize = env->GetArrayLength(savedState);
35708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        }
35808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
359048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov        code->createActivityFunc(code.get(), rawSavedState, rawSavedSize);
36008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
36108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        if (rawSavedState != NULL) {
36208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            env->ReleaseByteArrayElements(savedState, rawSavedState, 0);
36308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        }
36469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
36569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
366048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov    return (jlong)code.release();
367048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov}
368048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov
369048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanovstatic jstring getDlError_native(JNIEnv* env, jobject clazz) {
370048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov  return env->NewStringUTF(dlerror());
37169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
37269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
37369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
37458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatunloadNativeCode_native(JNIEnv* env, jobject clazz, jlong handle)
37569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
376ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
377ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("unloadNativeCode_native");
378ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
37969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
38069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
38169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        delete code;
38269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
38369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
38469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
38569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
38658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonStart_native(JNIEnv* env, jobject clazz, jlong handle)
38769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
388ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
389ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onStart_native");
390ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
39169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
39269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
39369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onStart != NULL) {
394289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onStart(code);
39569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
39669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
39769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
39869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
39969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
40058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonResume_native(JNIEnv* env, jobject clazz, jlong handle)
40169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
402ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
403ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onResume_native");
404ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
40569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
40669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
40769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onResume != NULL) {
408289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onResume(code);
40969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
41069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
41169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
41269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
41308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic jbyteArray
41458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSaveInstanceState_native(JNIEnv* env, jobject clazz, jlong handle)
41569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
416ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
417ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onSaveInstanceState_native");
418ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
41908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
42008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jbyteArray array = NULL;
42108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
42269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
42369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
42469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onSaveInstanceState != NULL) {
42569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            size_t len = 0;
42608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            jbyte* state = (jbyte*)code->callbacks.onSaveInstanceState(code, &len);
42708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            if (len > 0) {
42808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn                array = env->NewByteArray(len);
42908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn                if (array != NULL) {
43008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn                    env->SetByteArrayRegion(array, 0, len, state);
43108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn                }
43208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            }
43308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            if (state != NULL) {
43408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn                free(state);
43508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            }
43669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
43769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
43808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
43908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    return array;
44069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
44169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
44269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
44358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonPause_native(JNIEnv* env, jobject clazz, jlong handle)
44469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
445ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
446ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onPause_native");
447ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
44869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
44969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
45069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onPause != NULL) {
451289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onPause(code);
45269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
45369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
45469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
45569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
45669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
45758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonStop_native(JNIEnv* env, jobject clazz, jlong handle)
45869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
459ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
460ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onStop_native");
461ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
46269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
46369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
46469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onStop != NULL) {
465289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onStop(code);
46669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
46769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
46869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
46969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
47069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
47158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonConfigurationChanged_native(JNIEnv* env, jobject clazz, jlong handle)
47208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn{
473ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
474ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onConfigurationChanged_native");
475ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
47608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    if (handle != 0) {
47708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
47808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        if (code->callbacks.onConfigurationChanged != NULL) {
47908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            code->callbacks.onConfigurationChanged(code);
48008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        }
48108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    }
48208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn}
48308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
48408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic void
48558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonLowMemory_native(JNIEnv* env, jobject clazz, jlong handle)
48669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
487ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
488ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onLowMemory_native");
489ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
49069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
49169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
49269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onLowMemory != NULL) {
493289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onLowMemory(code);
49469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
49569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
49669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
49769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
49869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
49958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonWindowFocusChanged_native(JNIEnv* env, jobject clazz, jlong handle, jboolean focused)
50069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
501ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
502ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onWindowFocusChanged_native");
503ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
50469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
50569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
50669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onWindowFocusChanged != NULL) {
507289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onWindowFocusChanged(code, focused ? 1 : 0);
50869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
50969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
51069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
51169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
51274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void
51358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceCreated_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface)
51474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{
515ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
516ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onSurfaceCreated_native");
517ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
51874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    if (handle != 0) {
51974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
52074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        code->setSurface(surface);
52154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        if (code->nativeWindow != NULL && code->callbacks.onNativeWindowCreated != NULL) {
522289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onNativeWindowCreated(code,
52354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn                    code->nativeWindow.get());
52474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
52574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
52674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn}
52774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
528d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic int32_t getWindowProp(ANativeWindow* window, int what) {
529d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    int value;
530d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    int res = window->query(window, what, &value);
531d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    return res < 0 ? res : value;
532d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn}
533d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
53474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void
53558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceChanged_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface,
53674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        jint format, jint width, jint height)
53774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{
538ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
539ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onSurfaceChanged_native");
540ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
54174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    if (handle != 0) {
54274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
54354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        sp<ANativeWindow> oldNativeWindow = code->nativeWindow;
54454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        code->setSurface(surface);
54554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        if (oldNativeWindow != code->nativeWindow) {
5468ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn            if (oldNativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) {
547289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn                code->callbacks.onNativeWindowDestroyed(code,
5488ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn                        oldNativeWindow.get());
5498ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn            }
550d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            if (code->nativeWindow != NULL) {
551d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                if (code->callbacks.onNativeWindowCreated != NULL) {
552d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    code->callbacks.onNativeWindowCreated(code,
553d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                            code->nativeWindow.get());
554d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                }
555d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                code->lastWindowWidth = getWindowProp(code->nativeWindow.get(),
556d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                        NATIVE_WINDOW_WIDTH);
557d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                code->lastWindowHeight = getWindowProp(code->nativeWindow.get(),
558d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                        NATIVE_WINDOW_HEIGHT);
559d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            }
560d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        } else {
561d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            // Maybe it resized?
562d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            int32_t newWidth = getWindowProp(code->nativeWindow.get(),
563d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    NATIVE_WINDOW_WIDTH);
564d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            int32_t newHeight = getWindowProp(code->nativeWindow.get(),
565d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    NATIVE_WINDOW_HEIGHT);
566d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            if (newWidth != code->lastWindowWidth
567d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    || newHeight != code->lastWindowHeight) {
568d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                if (code->callbacks.onNativeWindowResized != NULL) {
569d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    code->callbacks.onNativeWindowResized(code,
570d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                            code->nativeWindow.get());
571d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                }
57254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn            }
57374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
57474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
57574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn}
57674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
57774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void
57858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceRedrawNeeded_native(JNIEnv* env, jobject clazz, jlong handle)
579d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{
580ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
581ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onSurfaceRedrawNeeded_native");
582ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
583d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    if (handle != 0) {
584d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
585d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        if (code->nativeWindow != NULL && code->callbacks.onNativeWindowRedrawNeeded != NULL) {
586d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            code->callbacks.onNativeWindowRedrawNeeded(code, code->nativeWindow.get());
587d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        }
588d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    }
589d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn}
590d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
591d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void
59258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonSurfaceDestroyed_native(JNIEnv* env, jobject clazz, jlong handle, jobject surface)
59374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{
594ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
595ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onSurfaceDestroyed_native");
596ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
59774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    if (handle != 0) {
59874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
59954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn        if (code->nativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) {
600289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn            code->callbacks.onNativeWindowDestroyed(code,
60154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn                    code->nativeWindow.get());
60274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
60374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        code->setSurface(NULL);
60474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
60574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn}
60674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
607a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void
60858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonInputQueueCreated_native(JNIEnv* env, jobject clazz, jlong handle, jlong queuePtr)
609a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{
610ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
611ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onInputChannelCreated_native");
612ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
613a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    if (handle != 0) {
614a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
615a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        if (code->callbacks.onInputQueueCreated != NULL) {
616a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright            AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr);
617a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright            code->callbacks.onInputQueueCreated(code, queue);
618a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        }
619a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    }
620a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
621a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
622a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void
62358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonInputQueueDestroyed_native(JNIEnv* env, jobject clazz, jlong handle, jlong queuePtr)
624a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{
625ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
626ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onInputChannelDestroyed_native");
627ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
628a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    if (handle != 0) {
629a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
630a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright        if (code->callbacks.onInputQueueDestroyed != NULL) {
631a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright            AInputQueue* queue = reinterpret_cast<AInputQueue*>(queuePtr);
632a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright            code->callbacks.onInputQueueDestroyed(code, queue);
633a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        }
634a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    }
635a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
636a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
637d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void
63858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatonContentRectChanged_native(JNIEnv* env, jobject clazz, jlong handle,
639d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        jint x, jint y, jint w, jint h)
640d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{
641ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    if (kLogTrace) {
642ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe        ALOGD("onContentRectChanged_native");
643ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    }
644d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    if (handle != 0) {
645d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
646d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        if (code->callbacks.onContentRectChanged != NULL) {
647d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            ARect rect;
648d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            rect.left = x;
649d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            rect.top = y;
650d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            rect.right = x+w;
651d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            rect.bottom = y+h;
652d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            code->callbacks.onContentRectChanged(code, &rect);
653d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        }
654d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    }
655d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn}
656d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
65769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const JNINativeMethod g_methods[] = {
658048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov    { "loadNativeCode",
659048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy 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;Ljava/lang/String;)J",
660048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov        (void*)loadNativeCode_native },
661048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov    { "getDlError", "()Ljava/lang/String;", (void*) getDlError_native },
66258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "unloadNativeCode", "(J)V", (void*)unloadNativeCode_native },
66358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onStartNative", "(J)V", (void*)onStart_native },
66458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onResumeNative", "(J)V", (void*)onResume_native },
66558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onSaveInstanceStateNative", "(J)[B", (void*)onSaveInstanceState_native },
66658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onPauseNative", "(J)V", (void*)onPause_native },
66758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onStopNative", "(J)V", (void*)onStop_native },
66858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onConfigurationChangedNative", "(J)V", (void*)onConfigurationChanged_native },
66958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onLowMemoryNative", "(J)V", (void*)onLowMemory_native },
67058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onWindowFocusChangedNative", "(JZ)V", (void*)onWindowFocusChanged_native },
67158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onSurfaceCreatedNative", "(JLandroid/view/Surface;)V", (void*)onSurfaceCreated_native },
67258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onSurfaceChangedNative", "(JLandroid/view/Surface;III)V", (void*)onSurfaceChanged_native },
67358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onSurfaceRedrawNeededNative", "(JLandroid/view/Surface;)V", (void*)onSurfaceRedrawNeeded_native },
67458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onSurfaceDestroyedNative", "(J)V", (void*)onSurfaceDestroyed_native },
67558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onInputQueueCreatedNative", "(JJ)V",
676a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright        (void*)onInputQueueCreated_native },
67758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onInputQueueDestroyedNative", "(JJ)V",
678a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright        (void*)onInputQueueDestroyed_native },
67958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "onContentRectChangedNative", "(JIIII)V", (void*)onContentRectChanged_native },
68069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn};
68169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
68269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const char* const kNativeActivityPathName = "android/app/NativeActivity";
68369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
68469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornint register_android_app_NativeActivity(JNIEnv* env)
68569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
6865baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    //ALOGD("register_android_app_NativeActivity");
687987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    jclass clazz = FindClassOrDie(env, kNativeActivityPathName);
688987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
689987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gNativeActivityClassInfo.finish = GetMethodIDOrDie(env, clazz, "finish", "()V");
690987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gNativeActivityClassInfo.setWindowFlags = GetMethodIDOrDie(env, clazz, "setWindowFlags",
691987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe                                                               "(II)V");
692987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gNativeActivityClassInfo.setWindowFormat = GetMethodIDOrDie(env, clazz, "setWindowFormat",
693987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe                                                                "(I)V");
694987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gNativeActivityClassInfo.showIme = GetMethodIDOrDie(env, clazz, "showIme", "(I)V");
695987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gNativeActivityClassInfo.hideIme = GetMethodIDOrDie(env, clazz, "hideIme", "(I)V");
696987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
697987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return RegisterMethodsOrDie(env, kNativeActivityPathName, g_methods, NELEM(g_methods));
69869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
69969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
700a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} // namespace android
701