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