android_app_NativeActivity.cpp revision a95e4cb62f3642cb190d032dbf7dc40d9ecc6973
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 { 3274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode(void* _dlhandle, android_activity_create_t* _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) { 76a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn nativeInputQueue = new input_queue_t(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 8969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn android_activity_t activity; 9069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn android_activity_callbacks_t callbacks; 9169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 9269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn void* dlhandle; 9369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn android_activity_create_t* createActivityFunc; 9474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 9574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn jobject surface; 96a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn jobject inputChannel; 97a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn struct input_queue_t* 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) { 11174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code = new NativeCode(handle, (android_activity_create_t*) 11274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn dlsym(handle, "android_onCreateActivity")); 11369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->createActivityFunc == NULL) { 11469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn LOGW("android_onCreateActivity not found"); 11569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn delete code; 11669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn return 0; 11769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 11869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn code->activity.callbacks = &code->callbacks; 11969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn code->activity.env = env; 12069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn code->activity.clazz = clazz; 12169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn code->createActivityFunc(&code->activity, NULL, 0); 12269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 12369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 12469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn return (jint)code; 12569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 12669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 12769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 12869969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornunloadNativeCode_native(JNIEnv* env, jobject clazz, jint handle) 12969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 13069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 13169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 13269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn delete code; 13369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 13469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 13569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 13669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 13769969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonStart_native(JNIEnv* env, jobject clazz, jint handle) 13869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 13969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 14069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 14169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onStart != NULL) { 14269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn code->callbacks.onStart(&code->activity); 14369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 14469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 14569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 14669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 14769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 14869969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonResume_native(JNIEnv* env, jobject clazz, jint handle) 14969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 15069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 15169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 15269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onResume != NULL) { 15369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn code->callbacks.onResume(&code->activity); 15469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 15569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 15669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 15769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 15869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 15969969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonSaveInstanceState_native(JNIEnv* env, jobject clazz, jint handle) 16069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 16169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 16269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 16369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onSaveInstanceState != NULL) { 16469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn size_t len = 0; 16569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn code->callbacks.onSaveInstanceState(&code->activity, &len); 16669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 16769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 16869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 16969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 17069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 17169969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonPause_native(JNIEnv* env, jobject clazz, jint handle) 17269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 17369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 17469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 17569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onPause != NULL) { 17669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn code->callbacks.onPause(&code->activity); 17769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 17869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 17969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 18069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 18169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 18269969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonStop_native(JNIEnv* env, jobject clazz, jint handle) 18369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 18469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 18569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 18669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onStop != NULL) { 18769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn code->callbacks.onStop(&code->activity); 18869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 18969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 19069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 19169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 19269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 19369969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonLowMemory_native(JNIEnv* env, jobject clazz, jint handle) 19469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 19569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 19669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 19769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onLowMemory != NULL) { 19869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn code->callbacks.onLowMemory(&code->activity); 19969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 20069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 20169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 20269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 20369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 20469969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonWindowFocusChanged_native(JNIEnv* env, jobject clazz, jint handle, jboolean focused) 20569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 20669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 20769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 20869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onWindowFocusChanged != NULL) { 20969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn code->callbacks.onWindowFocusChanged(&code->activity, focused ? 1 : 0); 21069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 21169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 21269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 21369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 21474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 21574323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceCreated_native(JNIEnv* env, jobject clazz, jint handle, jobject surface) 21674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 21774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 21874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 21974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->setSurface(surface); 22074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (code->callbacks.onSurfaceCreated != NULL) { 22174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->callbacks.onSurfaceCreated(&code->activity, 22274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn (android_surface_t*)code->surface); 22374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 22474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 22574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 22674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 22774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 22874323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceChanged_native(JNIEnv* env, jobject clazz, jint handle, jobject surface, 22974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn jint format, jint width, jint height) 23074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 23174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 23274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 23374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (code->surface != NULL && code->callbacks.onSurfaceChanged != NULL) { 23474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->callbacks.onSurfaceChanged(&code->activity, 23574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn (android_surface_t*)code->surface, format, width, height); 23674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 23774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 23874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 23974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 24074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 24174323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jobject surface) 24274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 24374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 24474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 24574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (code->surface != NULL && code->callbacks.onSurfaceDestroyed != NULL) { 24674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->callbacks.onSurfaceDestroyed(&code->activity, 24774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn (android_surface_t*)code->surface); 24874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 24974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->setSurface(NULL); 25074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 25174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 25274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 253a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void 254a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne HackbornonInputChannelCreated_native(JNIEnv* env, jobject clazz, jint handle, jobject channel) 255a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{ 256a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (handle != 0) { 257a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn NativeCode* code = (NativeCode*)handle; 258a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn status_t err = code->setInputChannel(channel); 259a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (err != OK) { 260a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", 261a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn "Error setting input channel"); 262a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn return; 263a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 264a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (code->callbacks.onInputQueueCreated != NULL) { 265a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn code->callbacks.onInputQueueCreated(&code->activity, 266a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn code->nativeInputQueue); 267a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 268a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 269a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} 270a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 271a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void 272a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne HackbornonInputChannelDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jobject channel) 273a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{ 274a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (handle != 0) { 275a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn NativeCode* code = (NativeCode*)handle; 276a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (code->nativeInputQueue != NULL 277a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn && code->callbacks.onInputQueueDestroyed != NULL) { 278a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn code->callbacks.onInputQueueDestroyed(&code->activity, 279a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn code->nativeInputQueue); 280a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 281a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn code->setInputChannel(NULL); 282a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 283a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} 284a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 28569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const JNINativeMethod g_methods[] = { 28669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "loadNativeCode", "(Ljava/lang/String;)I", (void*)loadNativeCode_native }, 28769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "unloadNativeCode", "(I)V", (void*)unloadNativeCode_native }, 28869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onStartNative", "(I)V", (void*)onStart_native }, 28969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onResumeNative", "(I)V", (void*)onResume_native }, 29069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onSaveInstanceStateNative", "(I)V", (void*)onSaveInstanceState_native }, 29169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onPauseNative", "(I)V", (void*)onPause_native }, 29269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onStopNative", "(I)V", (void*)onStop_native }, 29369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onLowMemoryNative", "(I)V", (void*)onLowMemory_native }, 29469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onWindowFocusChangedNative", "(IZ)V", (void*)onWindowFocusChanged_native }, 29574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn { "onSurfaceCreatedNative", "(ILandroid/view/SurfaceHolder;)V", (void*)onSurfaceCreated_native }, 29674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn { "onSurfaceChangedNative", "(ILandroid/view/SurfaceHolder;III)V", (void*)onSurfaceChanged_native }, 29774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn { "onSurfaceDestroyedNative", "(ILandroid/view/SurfaceHolder;)V", (void*)onSurfaceDestroyed_native }, 298a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn { "onInputChannelCreatedNative", "(ILandroid/view/InputChannel;)V", (void*)onInputChannelCreated_native }, 299a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn { "onInputChannelDestroyedNative", "(ILandroid/view/InputChannel;)V", (void*)onInputChannelDestroyed_native }, 30069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}; 30169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 30269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const char* const kNativeActivityPathName = "android/app/NativeActivity"; 30369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 30469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornint register_android_app_NativeActivity(JNIEnv* env) 30569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 30669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn //LOGD("register_android_app_NativeActivity"); 30769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 30869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn jclass clazz; 30969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 31069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn clazz = env->FindClass(kNativeActivityPathName); 31169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn LOG_FATAL_IF(clazz == NULL, "Unable to find class android.app.NativeActivity"); 31269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 31369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn return AndroidRuntime::registerNativeMethods( 31469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn env, kNativeActivityPathName, 31569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn g_methods, NELEM(g_methods)); 31669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 31769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 318a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} // namespace android 319