android_app_NativeActivity.cpp revision 69969e48f2bca9339662dddfacff0bbf6374ed7f
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 {
3069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    android_activity_t activity;
3169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    android_activity_callbacks_t callbacks;
3269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
3369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    void* dlhandle;
3469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
3569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    android_activity_create_t* createActivityFunc;
3669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    void* clientContext;
3769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn};
3869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
3969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic jint
4069969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornloadNativeCode_native(JNIEnv* env, jobject clazz, jstring path)
4169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
4269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    const char* pathStr = env->GetStringUTFChars(path, NULL);
4369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    NativeCode* code = NULL;
4469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
4569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    void* handle = dlopen(pathStr, RTLD_LAZY);
4669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
4769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    env->ReleaseStringUTFChars(path, pathStr);
4869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
4969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != NULL) {
5069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        code = new NativeCode();
5169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        code->dlhandle = handle;
5269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        code->createActivityFunc = (android_activity_create_t*)
5369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn                dlsym(handle, "android_onCreateActivity");
5469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->createActivityFunc == NULL) {
5569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            LOGW("android_onCreateActivity not found");
5669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            delete code;
5769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            dlclose(handle);
5869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            return 0;
5969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
6069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        memset(&code->activity, sizeof(code->activity), 0);
6169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        memset(&code->callbacks, sizeof(code->callbacks), 0);
6269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        code->activity.callbacks = &code->callbacks;
6369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        code->activity.env = env;
6469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        code->activity.clazz = clazz;
6569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        code->createActivityFunc(&code->activity, NULL, 0);
6669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
6769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
6869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    return (jint)code;
6969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
7069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
7169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
7269969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornunloadNativeCode_native(JNIEnv* env, jobject clazz, jint handle)
7369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
7469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
7569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
7669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onDestroy != NULL) {
7769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onDestroy(&code->activity);
7869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
7969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        dlclose(code->dlhandle);
8069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        delete code;
8169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
8269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
8369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
8469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
8569969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonStart_native(JNIEnv* env, jobject clazz, jint handle)
8669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
8769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
8869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
8969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onStart != NULL) {
9069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onStart(&code->activity);
9169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
9269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
9369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
9469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
9569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
9669969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonResume_native(JNIEnv* env, jobject clazz, jint handle)
9769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
9869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
9969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
10069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onResume != NULL) {
10169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onResume(&code->activity);
10269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
10369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
10469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
10569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
10669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
10769969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonSaveInstanceState_native(JNIEnv* env, jobject clazz, jint handle)
10869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
10969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
11069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
11169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onSaveInstanceState != NULL) {
11269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            size_t len = 0;
11369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onSaveInstanceState(&code->activity, &len);
11469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
11569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
11669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
11769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
11869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
11969969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonPause_native(JNIEnv* env, jobject clazz, jint handle)
12069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
12169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
12269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
12369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onPause != NULL) {
12469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onPause(&code->activity);
12569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
12669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
12769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
12869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
12969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
13069969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonStop_native(JNIEnv* env, jobject clazz, jint handle)
13169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
13269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
13369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
13469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onStop != NULL) {
13569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onStop(&code->activity);
13669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
13769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
13869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
13969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
14069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
14169969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonLowMemory_native(JNIEnv* env, jobject clazz, jint handle)
14269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
14369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
14469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
14569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onLowMemory != NULL) {
14669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onLowMemory(&code->activity);
14769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
14869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
14969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
15069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
15169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void
15269969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonWindowFocusChanged_native(JNIEnv* env, jobject clazz, jint handle, jboolean focused)
15369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
15469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    if (handle != 0) {
15569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        NativeCode* code = (NativeCode*)handle;
15669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        if (code->callbacks.onWindowFocusChanged != NULL) {
15769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn            code->callbacks.onWindowFocusChanged(&code->activity, focused ? 1 : 0);
15869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        }
15969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    }
16069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
16169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
16269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const JNINativeMethod g_methods[] = {
16369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "loadNativeCode", "(Ljava/lang/String;)I", (void*)loadNativeCode_native },
16469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "unloadNativeCode", "(I)V", (void*)unloadNativeCode_native },
16569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onStartNative", "(I)V", (void*)onStart_native },
16669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onResumeNative", "(I)V", (void*)onResume_native },
16769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onSaveInstanceStateNative", "(I)V", (void*)onSaveInstanceState_native },
16869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onPauseNative", "(I)V", (void*)onPause_native },
16969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onStopNative", "(I)V", (void*)onStop_native },
17069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onLowMemoryNative", "(I)V", (void*)onLowMemory_native },
17169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    { "onWindowFocusChangedNative", "(IZ)V", (void*)onWindowFocusChanged_native },
17269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn};
17369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
17469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const char* const kNativeActivityPathName = "android/app/NativeActivity";
17569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
17669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornint register_android_app_NativeActivity(JNIEnv* env)
17769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{
17869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    //LOGD("register_android_app_NativeActivity");
17969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
18069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    jclass clazz;
18169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
18269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    clazz = env->FindClass(kNativeActivityPathName);
18369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    LOG_FATAL_IF(clazz == NULL, "Unable to find class android.app.NativeActivity");
18469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
18569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn    return AndroidRuntime::registerNativeMethods(
18669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        env, kNativeActivityPathName,
18769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn        g_methods, NELEM(g_methods));
18869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
18969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn
19069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}
191