From 682674154e3fe88f6061245145f934f25f1a2eb8 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Fri, 2 Jul 2010 18:52:01 -0700 Subject: Add new native Looper API. This allows us to avoid exposing the file descriptor of the event queue; instead, you attach an event queue to a looper. This will also should allow native apps to be written without the need for a separate thread, by attaching the event queue to the main thread's looper and scheduling their own messages there. Change-Id: I38489282635895ae2cbfacb88599c1b1cad9b239 --- native/android/Android.mk | 1 + native/android/input.cpp | 13 ++++++- native/android/looper.cpp | 63 ++++++++++++++++++++++++++++++++ native/include/android/input.h | 14 ++++--- native/include/android/looper.h | 51 ++++++++++++++++++++++++++ native/include/android/native_activity.h | 15 ++++++++ 6 files changed, 150 insertions(+), 7 deletions(-) create mode 100644 native/android/looper.cpp create mode 100644 native/include/android/looper.h (limited to 'native') diff --git a/native/android/Android.mk b/native/android/Android.mk index fe8ed00..376c64f 100644 --- a/native/android/Android.mk +++ b/native/android/Android.mk @@ -8,6 +8,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ activity.cpp \ input.cpp \ + looper.cpp \ native_window.cpp LOCAL_SHARED_LIBRARIES := \ diff --git a/native/android/input.cpp b/native/android/input.cpp index 8498840..015a1ce 100644 --- a/native/android/input.cpp +++ b/native/android/input.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -184,8 +185,16 @@ float AMotionEvent_getHistoricalSize(AInputEvent* motion_event, size_t pointer_i pointer_index, history_index); } -int AInputQueue_getFd(AInputQueue* queue) { - return queue->getConsumer().getChannel()->getReceivePipeFd(); +void AInputQueue_attachLooper(AInputQueue* queue, ALooper* looper, + ALooper_callbackFunc callback, void* data) { + queue->setPollLoop(static_cast(looper)); + ALooper_setCallback(looper, queue->getConsumer().getChannel()->getReceivePipeFd(), + POLLIN, callback, data); +} + +void AInputQueue_detachLooper(AInputQueue* queue) { + queue->getPollLoop()->removeCallback( + queue->getConsumer().getChannel()->getReceivePipeFd()); } int AInputQueue_hasEvents(AInputQueue* queue) { diff --git a/native/android/looper.cpp b/native/android/looper.cpp new file mode 100644 index 0000000..6e78bbd --- /dev/null +++ b/native/android/looper.cpp @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "ALooper" +#include + +#include +#include + +using android::PollLoop; +using android::sp; + +ALooper* ALooper_forThread() { + return PollLoop::getForThread().get(); +} + +ALooper* ALooper_prepare() { + sp loop = PollLoop::getForThread(); + if (loop == NULL) { + loop = new PollLoop(); + PollLoop::setForThread(loop); + } + return loop.get(); +} + +int32_t ALooper_pollOnce(int timeoutMillis) { + sp loop = PollLoop::getForThread(); + if (loop == NULL) { + LOGW("ALooper_pollOnce: No looper for this thread!"); + return -1; + } + return loop->pollOnce(timeoutMillis) ? 1 : 0; +} + +void ALooper_acquire(ALooper* looper) { + static_cast(looper)->incStrong((void*)ALooper_acquire); +} + +void ALooper_release(ALooper* looper) { + static_cast(looper)->decStrong((void*)ALooper_acquire); +} + +void ALooper_setCallback(ALooper* looper, int fd, int events, + ALooper_callbackFunc* callback, void* data) { + static_cast(looper)->setLooperCallback(fd, events, callback, data); +} + +int32_t ALooper_removeCallback(ALooper* looper, int fd) { + return static_cast(looper)->removeCallback(fd) ? 1 : 0; +} diff --git a/native/include/android/input.h b/native/include/android/input.h index 7617662..75be85a 100644 --- a/native/include/android/input.h +++ b/native/include/android/input.h @@ -42,6 +42,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -533,12 +534,15 @@ struct AInputQueue; typedef struct AInputQueue AInputQueue; /* - * Return a file descriptor for the queue, which you - * can use to determine if there are events available. This - * is typically used with select() or poll() to multiplex - * with other kinds of events. + * Add this input queue to a looper for processing. */ -int AInputQueue_getFd(AInputQueue* queue); +void AInputQueue_attachLooper(AInputQueue* queue, ALooper* looper, + ALooper_callbackFunc callback, void* data); + +/* + * Remove the input queue from the looper it is currently attached to. + */ +void AInputQueue_detachLooper(AInputQueue* queue); /* * Returns true if there are one or more events available in the diff --git a/native/include/android/looper.h b/native/include/android/looper.h new file mode 100644 index 0000000..90a8983 --- /dev/null +++ b/native/include/android/looper.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef ANDROID_LOOPER_H +#define ANDROID_LOOPER_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct ALooper; +typedef struct ALooper ALooper; + +typedef int ALooper_callbackFunc(int fd, int events, void* data); + +ALooper* ALooper_forThread(); + +ALooper* ALooper_prepare(); + +int32_t ALooper_pollOnce(int timeoutMillis); + +void ALooper_acquire(ALooper* looper); + +void ALooper_release(ALooper* looper); + +void ALooper_setCallback(ALooper* looper, int fd, int events, + ALooper_callbackFunc* callback, void* data); + +int32_t ALooper_removeCallback(ALooper* looper, int fd); + +#ifdef __cplusplus +}; +#endif + +#endif // ANDROID_NATIVE_WINDOW_H diff --git a/native/include/android/native_activity.h b/native/include/android/native_activity.h index bf5c641..a31c5af 100644 --- a/native/include/android/native_activity.h +++ b/native/include/android/native_activity.h @@ -64,6 +64,21 @@ typedef struct ANativeActivity { jobject clazz; /** + * Path to this application's internal data directory. + */ + const char* internalDataPath; + + /** + * Path to this application's external (removable/mountable) data directory. + */ + const char* externalDataPath; + + /** + * The platform's SDK version code. + */ + int32_t sdkVersion; + + /** * This is the native instance of the application. It is not used by * the framework, but can be set by the application to its own instance * state. -- cgit v1.1