android_app_NativeActivity.cpp revision 2e9f93e8db509d5236229dc8540e0904c5dbb9f5
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
2069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn#include "JNIHelp.h"
21a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn#include "android_view_InputChannel.h"
2269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn#include <android_runtime/AndroidRuntime.h>
2369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn#include <android/native_activity.h>
24a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn#include <ui/InputTransport.h>
2569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
2669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn#include <dlfcn.h>
2769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
2869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornnamespace android
2969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
3069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
3169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstruct NativeCode {
322e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn    NativeCode(void* _dlhandle, ANativeActivity_createFunc* _createFunc) {
3374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        memset(&activity, sizeof(activity), 0);
3474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        memset(&callbacks, sizeof(callbacks), 0);
3574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        dlhandle = _dlhandle;
3674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        createActivityFunc = _createFunc;
3774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        surface = NULL;
38a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        inputChannel = NULL;
39a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        nativeInputQueue = NULL;
4074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
4174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
4274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    ~NativeCode() {
43a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        setSurface(NULL);
44a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        setInputChannel(NULL);
4574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (callbacks.onDestroy != NULL) {
4674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            callbacks.onDestroy(&activity);
4774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
4874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (dlhandle != NULL) {
4974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            dlclose(dlhandle);
5074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
5174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
5274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
5374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    void setSurface(jobject _surface) {
5474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (surface != NULL) {
5574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            activity.env->DeleteGlobalRef(surface);
5674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
5774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (_surface != NULL) {
5874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            surface = activity.env->NewGlobalRef(_surface);
5974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        } else {
6074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            surface = NULL;
6174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
6274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
6374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
64a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    status_t setInputChannel(jobject _channel) {
65a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        if (inputChannel != NULL) {
66a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            delete nativeInputQueue;
67a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            activity.env->DeleteGlobalRef(inputChannel);
68a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        }
69a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        inputChannel = NULL;
70a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        nativeInputQueue = NULL;
71a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        if (_channel != NULL) {
72a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            inputChannel = activity.env->NewGlobalRef(_channel);
73a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            sp<InputChannel> ic =
74a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn                    android_view_InputChannel_getInputChannel(activity.env, _channel);
75a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            if (ic != NULL) {
762e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn                nativeInputQueue = new AInputQueue(ic);
77a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn                if (nativeInputQueue->getConsumer().initialize() != android::OK) {
78a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn                    delete nativeInputQueue;
79a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn                    nativeInputQueue = NULL;
80a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn                    return UNKNOWN_ERROR;
81a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn                }
82a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            } else {
83a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn                return UNKNOWN_ERROR;
84a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            }
85a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        }
86a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        return OK;
87a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    }
88a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
892e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn    ANativeActivity activity;
902e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn    ANativeActivityCallbacks callbacks;
9169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
9269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    void* dlhandle;
932e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn    ANativeActivity_createFunc* createActivityFunc;
9474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
9574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    jobject surface;
96a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    jobject inputChannel;
972e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn    struct AInputQueue* nativeInputQueue;
9869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn};
9969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
10069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic jint
10169969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornloadNativeCode_native(JNIEnv* env, jobject clazz, jstring path)
10269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
10369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    const char* pathStr = env->GetStringUTFChars(path, NULL);
10469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    NativeCode* code = NULL;
10569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
10669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    void* handle = dlopen(pathStr, RTLD_LAZY);
10769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
10869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    env->ReleaseStringUTFChars(path, pathStr);
10969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
11069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != NULL) {
1112e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn        code = new NativeCode(handle, (ANativeActivity_createFunc*)
1122e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn                dlsym(handle, "ANativeActivity_onCreate"));
11369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->createActivityFunc == NULL) {
1142e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn            LOGW("ANativeActivity_onCreate not found");
11569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            delete code;
11669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            return 0;
11769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
11869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        code->activity.callbacks = &code->callbacks;
1192e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn        if (env->GetJavaVM(&code->activity.vm) < 0) {
1202e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn            LOGW("NativeActivity GetJavaVM failed");
1212e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn            delete code;
1222e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn            return 0;
1232e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn        }
12469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        code->activity.env = env;
12569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        code->activity.clazz = clazz;
12669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        code->createActivityFunc(&code->activity, NULL, 0);
12769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
12869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
12969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    return (jint)code;
13069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
13169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
13269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
13369969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornunloadNativeCode_native(JNIEnv* env, jobject clazz, jint handle)
13469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
13569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
13669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
13769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        delete code;
13869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
13969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
14069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
14169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
14269969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonStart_native(JNIEnv* env, jobject clazz, jint handle)
14369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
14469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
14569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
14669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onStart != NULL) {
14769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onStart(&code->activity);
14869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
14969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
15069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
15169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
15269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
15369969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonResume_native(JNIEnv* env, jobject clazz, jint handle)
15469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
15569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
15669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
15769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onResume != NULL) {
15869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onResume(&code->activity);
15969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
16069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
16169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
16269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
16369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
16469969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonSaveInstanceState_native(JNIEnv* env, jobject clazz, jint handle)
16569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
16669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
16769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
16869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onSaveInstanceState != NULL) {
16969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            size_t len = 0;
17069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onSaveInstanceState(&code->activity, &len);
17169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
17269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
17369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
17469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
17569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
17669969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonPause_native(JNIEnv* env, jobject clazz, jint handle)
17769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
17869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
17969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
18069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onPause != NULL) {
18169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onPause(&code->activity);
18269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
18369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
18469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
18569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
18669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
18769969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonStop_native(JNIEnv* env, jobject clazz, jint handle)
18869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
18969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
19069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
19169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onStop != NULL) {
19269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onStop(&code->activity);
19369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
19469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
19569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
19669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
19769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
19869969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonLowMemory_native(JNIEnv* env, jobject clazz, jint handle)
19969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
20069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
20169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
20269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onLowMemory != NULL) {
20369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onLowMemory(&code->activity);
20469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
20569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
20669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
20769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
20869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
20969969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonWindowFocusChanged_native(JNIEnv* env, jobject clazz, jint handle, jboolean focused)
21069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
21169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
21269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
21369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onWindowFocusChanged != NULL) {
21469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onWindowFocusChanged(&code->activity, focused ? 1 : 0);
21569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
21669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
21769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
21869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
21974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void
22074323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceCreated_native(JNIEnv* env, jobject clazz, jint handle, jobject surface)
22174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{
22274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    if (handle != 0) {
22374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
22474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        code->setSurface(surface);
22574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (code->callbacks.onSurfaceCreated != NULL) {
22674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            code->callbacks.onSurfaceCreated(&code->activity,
2272e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn                    (ASurfaceHolder*)code->surface);
22874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
22974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
23074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn}
23174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
23274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void
23374323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceChanged_native(JNIEnv* env, jobject clazz, jint handle, jobject surface,
23474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        jint format, jint width, jint height)
23574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{
23674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    if (handle != 0) {
23774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
23874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (code->surface != NULL && code->callbacks.onSurfaceChanged != NULL) {
23974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            code->callbacks.onSurfaceChanged(&code->activity,
2402e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn                    (ASurfaceHolder*)code->surface, format, width, height);
24174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
24274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
24374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn}
24474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
24574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void
24674323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jobject surface)
24774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{
24874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    if (handle != 0) {
24974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
25074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (code->surface != NULL && code->callbacks.onSurfaceDestroyed != NULL) {
25174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            code->callbacks.onSurfaceDestroyed(&code->activity,
2522e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn                    (ASurfaceHolder*)code->surface);
25374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
25474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        code->setSurface(NULL);
25574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
25674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn}
25774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
258a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void
259a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne HackbornonInputChannelCreated_native(JNIEnv* env, jobject clazz, jint handle, jobject channel)
260a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{
261a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    if (handle != 0) {
262a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
263a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        status_t err = code->setInputChannel(channel);
264a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        if (err != OK) {
265a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            jniThrowException(env, "java/lang/IllegalStateException",
266a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn                    "Error setting input channel");
267a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            return;
268a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        }
269a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        if (code->callbacks.onInputQueueCreated != NULL) {
270a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            code->callbacks.onInputQueueCreated(&code->activity,
271a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn                    code->nativeInputQueue);
272a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        }
273a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    }
274a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
275a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
276a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void
277a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne HackbornonInputChannelDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jobject channel)
278a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{
279a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    if (handle != 0) {
280a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
281a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        if (code->nativeInputQueue != NULL
282a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn                && code->callbacks.onInputQueueDestroyed != NULL) {
283a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            code->callbacks.onInputQueueDestroyed(&code->activity,
284a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn                    code->nativeInputQueue);
285a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        }
286a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        code->setInputChannel(NULL);
287a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    }
288a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
289a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
29069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const JNINativeMethod g_methods[] = {
29169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "loadNativeCode", "(Ljava/lang/String;)I", (void*)loadNativeCode_native },
29269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "unloadNativeCode", "(I)V", (void*)unloadNativeCode_native },
29369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onStartNative", "(I)V", (void*)onStart_native },
29469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onResumeNative", "(I)V", (void*)onResume_native },
29569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onSaveInstanceStateNative", "(I)V", (void*)onSaveInstanceState_native },
29669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onPauseNative", "(I)V", (void*)onPause_native },
29769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onStopNative", "(I)V", (void*)onStop_native },
29869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onLowMemoryNative", "(I)V", (void*)onLowMemory_native },
29969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onWindowFocusChangedNative", "(IZ)V", (void*)onWindowFocusChanged_native },
30074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    { "onSurfaceCreatedNative", "(ILandroid/view/SurfaceHolder;)V", (void*)onSurfaceCreated_native },
30174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    { "onSurfaceChangedNative", "(ILandroid/view/SurfaceHolder;III)V", (void*)onSurfaceChanged_native },
30274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    { "onSurfaceDestroyedNative", "(ILandroid/view/SurfaceHolder;)V", (void*)onSurfaceDestroyed_native },
303a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    { "onInputChannelCreatedNative", "(ILandroid/view/InputChannel;)V", (void*)onInputChannelCreated_native },
304a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    { "onInputChannelDestroyedNative", "(ILandroid/view/InputChannel;)V", (void*)onInputChannelDestroyed_native },
30569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn};
30669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
30769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const char* const kNativeActivityPathName = "android/app/NativeActivity";
30869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
30969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornint register_android_app_NativeActivity(JNIEnv* env)
31069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
31169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    //LOGD("register_android_app_NativeActivity");
31269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
31369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    jclass clazz;
31469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
31569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    clazz = env->FindClass(kNativeActivityPathName);
31669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    LOG_FATAL_IF(clazz == NULL, "Unable to find class android.app.NativeActivity");
31769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
31869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    return AndroidRuntime::registerNativeMethods(
31969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        env, kNativeActivityPathName,
32069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        g_methods, NELEM(g_methods));
32169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
32269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
323a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} // namespace android
324