146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/* 246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Copyright (C) 2010 The Android Open Source Project 346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * you may not use this file except in compliance with the License. 646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * You may obtain a copy of the License at 746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 1046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Unless required by applicable law or agreed to in writing, software 1146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 1246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * See the License for the specific language governing permissions and 1446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * limitations under the License. 1546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 1646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#ifndef _ANDROID_OS_MESSAGEQUEUE_H 1846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define _ANDROID_OS_MESSAGEQUEUE_H 1946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include "jni.h" 21603b44589682db3ff33ade172facb0c5e309f1beJeff Brown#include <utils/Looper.h> 2246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android { 2446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 25603b44589682db3ff33ade172facb0c5e309f1beJeff Brownclass MessageQueue : public RefBase { 26603b44589682db3ff33ade172facb0c5e309f1beJeff Brownpublic: 27603b44589682db3ff33ade172facb0c5e309f1beJeff Brown /* Gets the message queue's looper. */ 28603b44589682db3ff33ade172facb0c5e309f1beJeff Brown inline sp<Looper> getLooper() const { 29603b44589682db3ff33ade172facb0c5e309f1beJeff Brown return mLooper; 30603b44589682db3ff33ade172facb0c5e309f1beJeff Brown } 3146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 32603b44589682db3ff33ade172facb0c5e309f1beJeff Brown /* Checks whether the JNI environment has a pending exception. 33603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * 34603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * If an exception occurred, logs it together with the specified message, 35603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * and calls raiseException() to ensure the exception will be raised when 36603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * the callback returns, clears the pending exception from the environment, 37603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * then returns true. 38603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * 39603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * If no exception occurred, returns false. 40603b44589682db3ff33ade172facb0c5e309f1beJeff Brown */ 41603b44589682db3ff33ade172facb0c5e309f1beJeff Brown bool raiseAndClearException(JNIEnv* env, const char* msg); 42603b44589682db3ff33ade172facb0c5e309f1beJeff Brown 43603b44589682db3ff33ade172facb0c5e309f1beJeff Brown /* Raises an exception from within a callback function. 44603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * The exception will be rethrown when control returns to the message queue which 45603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * will typically cause the application to crash. 46603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * 47603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * This message can only be called from within a callback function. If it is called 48603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * at any other time, the process will simply be killed. 49603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * 50603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * Does nothing if exception is NULL. 51603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * 52603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * (This method does not take ownership of the exception object reference. 53603b44589682db3ff33ade172facb0c5e309f1beJeff Brown * The caller is responsible for releasing its reference when it is done.) 54603b44589682db3ff33ade172facb0c5e309f1beJeff Brown */ 55603b44589682db3ff33ade172facb0c5e309f1beJeff Brown virtual void raiseException(JNIEnv* env, const char* msg, jthrowable exceptionObj) = 0; 56603b44589682db3ff33ade172facb0c5e309f1beJeff Brown 57603b44589682db3ff33ade172facb0c5e309f1beJeff Brownprotected: 58603b44589682db3ff33ade172facb0c5e309f1beJeff Brown MessageQueue(); 59603b44589682db3ff33ade172facb0c5e309f1beJeff Brown virtual ~MessageQueue(); 60603b44589682db3ff33ade172facb0c5e309f1beJeff Brown 61603b44589682db3ff33ade172facb0c5e309f1beJeff Brownprotected: 62603b44589682db3ff33ade172facb0c5e309f1beJeff Brown sp<Looper> mLooper; 63603b44589682db3ff33ade172facb0c5e309f1beJeff Brown}; 64603b44589682db3ff33ade172facb0c5e309f1beJeff Brown 65603b44589682db3ff33ade172facb0c5e309f1beJeff Brown/* Gets the native object associated with a MessageQueue. */ 66603b44589682db3ff33ade172facb0c5e309f1beJeff Brownextern sp<MessageQueue> android_os_MessageQueue_getMessageQueue( 67603b44589682db3ff33ade172facb0c5e309f1beJeff Brown JNIEnv* env, jobject messageQueueObj); 6846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 6946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android 7046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 7146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif // _ANDROID_OS_MESSAGEQUEUE_H 72