android_app_NativeActivity.cpp revision 74323fd1ab8eb11beea286d5c213c63e4b803141
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"
2169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn#include <android_runtime/AndroidRuntime.h>
2269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn#include <android/native_activity.h>
2369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
2469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn#include <dlfcn.h>
2569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
2669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornnamespace android
2769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
2869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
2969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstruct NativeCode {
3074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    NativeCode(void* _dlhandle, android_activity_create_t* _createFunc) {
3174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        memset(&activity, sizeof(activity), 0);
3274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        memset(&callbacks, sizeof(callbacks), 0);
3374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        dlhandle = _dlhandle;
3474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        createActivityFunc = _createFunc;
3574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        surface = NULL;
3674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
3774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
3874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    ~NativeCode() {
3974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (callbacks.onDestroy != NULL) {
4074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            callbacks.onDestroy(&activity);
4174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
4274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (dlhandle != NULL) {
4374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            dlclose(dlhandle);
4474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
4574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
4674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
4774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    void setSurface(jobject _surface) {
4874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (surface != NULL) {
4974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            activity.env->DeleteGlobalRef(surface);
5074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
5174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (_surface != NULL) {
5274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            surface = activity.env->NewGlobalRef(_surface);
5374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        } else {
5474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            surface = NULL;
5574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
5674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
5774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
5869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    android_activity_t activity;
5969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    android_activity_callbacks_t callbacks;
6069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
6169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    void* dlhandle;
6269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    android_activity_create_t* createActivityFunc;
6374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
6474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    jobject surface;
6569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn};
6669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
6769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic jint
6869969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornloadNativeCode_native(JNIEnv* env, jobject clazz, jstring path)
6969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
7069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    const char* pathStr = env->GetStringUTFChars(path, NULL);
7169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    NativeCode* code = NULL;
7269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
7369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    void* handle = dlopen(pathStr, RTLD_LAZY);
7469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
7569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    env->ReleaseStringUTFChars(path, pathStr);
7669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
7769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != NULL) {
7874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        code = new NativeCode(handle, (android_activity_create_t*)
7974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn                dlsym(handle, "android_onCreateActivity"));
8069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->createActivityFunc == NULL) {
8169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            LOGW("android_onCreateActivity not found");
8269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            delete code;
8369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            return 0;
8469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
8569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        code->activity.callbacks = &code->callbacks;
8669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        code->activity.env = env;
8769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        code->activity.clazz = clazz;
8869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        code->createActivityFunc(&code->activity, NULL, 0);
8969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
9069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
9169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    return (jint)code;
9269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
9369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
9469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
9569969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornunloadNativeCode_native(JNIEnv* env, jobject clazz, jint handle)
9669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
9769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
9869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
9969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        delete code;
10069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
10169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
10269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
10369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
10469969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonStart_native(JNIEnv* env, jobject clazz, jint handle)
10569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
10669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
10769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
10869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onStart != NULL) {
10969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onStart(&code->activity);
11069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
11169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
11269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
11369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
11469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
11569969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonResume_native(JNIEnv* env, jobject clazz, jint handle)
11669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
11769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
11869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
11969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onResume != NULL) {
12069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onResume(&code->activity);
12169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
12269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
12369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
12469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
12569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
12669969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonSaveInstanceState_native(JNIEnv* env, jobject clazz, jint handle)
12769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
12869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
12969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
13069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onSaveInstanceState != NULL) {
13169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            size_t len = 0;
13269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onSaveInstanceState(&code->activity, &len);
13369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
13469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
13569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
13669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
13769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
13869969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonPause_native(JNIEnv* env, jobject clazz, jint handle)
13969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
14069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
14169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
14269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onPause != NULL) {
14369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onPause(&code->activity);
14469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
14569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
14669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
14769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
14869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
14969969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonStop_native(JNIEnv* env, jobject clazz, jint handle)
15069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
15169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
15269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
15369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onStop != NULL) {
15469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onStop(&code->activity);
15569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
15669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
15769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
15869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
15969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
16069969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonLowMemory_native(JNIEnv* env, jobject clazz, jint handle)
16169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
16269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
16369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
16469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onLowMemory != NULL) {
16569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onLowMemory(&code->activity);
16669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
16769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
16869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
16969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
17069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
17169969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonWindowFocusChanged_native(JNIEnv* env, jobject clazz, jint handle, jboolean focused)
17269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
17369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
17469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
17569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onWindowFocusChanged != NULL) {
17669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onWindowFocusChanged(&code->activity, focused ? 1 : 0);
17769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
17869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
17969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
18069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
18174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void
18274323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceCreated_native(JNIEnv* env, jobject clazz, jint handle, jobject surface)
18374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{
18474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    if (handle != 0) {
18574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
18674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        code->setSurface(surface);
18774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (code->callbacks.onSurfaceCreated != NULL) {
18874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            code->callbacks.onSurfaceCreated(&code->activity,
18974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn                    (android_surface_t*)code->surface);
19074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
19174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
19274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn}
19374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
19474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void
19574323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceChanged_native(JNIEnv* env, jobject clazz, jint handle, jobject surface,
19674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        jint format, jint width, jint height)
19774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{
19874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    if (handle != 0) {
19974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
20074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (code->surface != NULL && code->callbacks.onSurfaceChanged != NULL) {
20174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            code->callbacks.onSurfaceChanged(&code->activity,
20274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn                    (android_surface_t*)code->surface, format, width, height);
20374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
20474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
20574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn}
20674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
20774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void
20874323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jobject surface)
20974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{
21074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    if (handle != 0) {
21174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        NativeCode* code = (NativeCode*)handle;
21274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        if (code->surface != NULL && code->callbacks.onSurfaceDestroyed != NULL) {
21374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn            code->callbacks.onSurfaceDestroyed(&code->activity,
21474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn                    (android_surface_t*)code->surface);
21574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        }
21674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn        code->setSurface(NULL);
21774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    }
21874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn}
21974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn
22069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const JNINativeMethod g_methods[] = {
22169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "loadNativeCode", "(Ljava/lang/String;)I", (void*)loadNativeCode_native },
22269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "unloadNativeCode", "(I)V", (void*)unloadNativeCode_native },
22369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onStartNative", "(I)V", (void*)onStart_native },
22469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onResumeNative", "(I)V", (void*)onResume_native },
22569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onSaveInstanceStateNative", "(I)V", (void*)onSaveInstanceState_native },
22669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onPauseNative", "(I)V", (void*)onPause_native },
22769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onStopNative", "(I)V", (void*)onStop_native },
22869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onLowMemoryNative", "(I)V", (void*)onLowMemory_native },
22969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onWindowFocusChangedNative", "(IZ)V", (void*)onWindowFocusChanged_native },
23074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    { "onSurfaceCreatedNative", "(ILandroid/view/SurfaceHolder;)V", (void*)onSurfaceCreated_native },
23174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    { "onSurfaceChangedNative", "(ILandroid/view/SurfaceHolder;III)V", (void*)onSurfaceChanged_native },
23274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn    { "onSurfaceDestroyedNative", "(ILandroid/view/SurfaceHolder;)V", (void*)onSurfaceDestroyed_native },
23369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn};
23469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
23569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const char* const kNativeActivityPathName = "android/app/NativeActivity";
23669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
23769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornint register_android_app_NativeActivity(JNIEnv* env)
23869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
23969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    //LOGD("register_android_app_NativeActivity");
24069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
24169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    jclass clazz;
24269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
24369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    clazz = env->FindClass(kNativeActivityPathName);
24469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    LOG_FATAL_IF(clazz == NULL, "Unable to find class android.app.NativeActivity");
24569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
24669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    return AndroidRuntime::registerNativeMethods(
24769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        env, kNativeActivityPathName,
24869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        g_methods, NELEM(g_methods));
24969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
25069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
25169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
252