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