Loading core/java/android/app/NativeActivity.java +9 −2 Original line number Diff line number Diff line Loading @@ -6,7 +6,9 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.PixelFormat; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Looper; import android.os.MessageQueue; import android.view.InputChannel; Loading @@ -33,7 +35,8 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback, private boolean mDestroyed; private native int loadNativeCode(String path, MessageQueue queue); private native int loadNativeCode(String path, MessageQueue queue, String internalDataPath, String externalDataPath, int sdkVersion); private native void unloadNativeCode(int handle); private native void onStartNative(int handle); Loading Loading @@ -90,7 +93,11 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback, throw new IllegalArgumentException("Unable to find native library: " + libname); } mNativeHandle = loadNativeCode(path, Looper.myQueue()); mNativeHandle = loadNativeCode(path, Looper.myQueue(), getFilesDir().toString(), Environment.getExternalStorageAppFilesDirectory(ai.packageName).toString(), Build.VERSION.SDK_INT); if (mNativeHandle == 0) { throw new IllegalArgumentException("Unable to load native library: " + path); } Loading core/jni/android_app_NativeActivity.cpp +20 −2 Original line number Diff line number Diff line Loading @@ -166,6 +166,9 @@ struct NativeCode { void* dlhandle; ANativeActivity_createFunc* createActivityFunc; String8 internalDataPath; String8 externalDataPath; sp<ANativeWindow> nativeWindow; jobject inputChannel; struct MyInputQueue* nativeInputQueue; Loading Loading @@ -204,7 +207,8 @@ static bool mainWorkCallback(int fd, int events, void* data) { // ------------------------------------------------------------------------ static jint loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jobject messageQueue) loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jobject messageQueue, jstring internalDataDir, jstring externalDataDir, int sdkVersion) { const char* pathStr = env->GetStringUTFChars(path, NULL); NativeCode* code = NULL; Loading Loading @@ -247,6 +251,19 @@ loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jobject messageQ } code->activity.env = env; code->activity.clazz = env->NewGlobalRef(clazz); const char* dirStr = env->GetStringUTFChars(internalDataDir, NULL); code->internalDataPath = dirStr; code->activity.internalDataPath = code->internalDataPath.string(); env->ReleaseStringUTFChars(path, dirStr); dirStr = env->GetStringUTFChars(externalDataDir, NULL); code->externalDataPath = dirStr; code->activity.externalDataPath = code->externalDataPath.string(); env->ReleaseStringUTFChars(path, dirStr); code->activity.sdkVersion = sdkVersion; code->createActivityFunc(&code->activity, NULL, 0); } Loading Loading @@ -420,7 +437,8 @@ onInputChannelDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jobject } static const JNINativeMethod g_methods[] = { { "loadNativeCode", "(Ljava/lang/String;Landroid/os/MessageQueue;)I", (void*)loadNativeCode_native }, { "loadNativeCode", "(Ljava/lang/String;Landroid/os/MessageQueue;Ljava/lang/String;Ljava/lang/String;I)I", (void*)loadNativeCode_native }, { "unloadNativeCode", "(I)V", (void*)unloadNativeCode_native }, { "onStartNative", "(I)V", (void*)onStart_native }, { "onResumeNative", "(I)V", (void*)onResume_native }, Loading core/jni/android_os_MessageQueue.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -51,7 +51,11 @@ private: // ---------------------------------------------------------------------------- NativeMessageQueue::NativeMessageQueue() { mPollLoop = PollLoop::getForThread(); if (mPollLoop == NULL) { mPollLoop = new PollLoop(); PollLoop::setForThread(mPollLoop); } } NativeMessageQueue::~NativeMessageQueue() { Loading include/ui/InputTransport.h +5 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ #include <semaphore.h> #include <ui/Input.h> #include <utils/Errors.h> #include <utils/PollLoop.h> #include <utils/Timers.h> #include <utils/RefBase.h> #include <utils/String8.h> Loading Loading @@ -345,11 +346,15 @@ public: android::status_t consume(android::InputEvent** event); void setPollLoop(const android::sp<android::PollLoop>& pollLoop) { mPollLoop = pollLoop; } const android::sp<android::PollLoop> getPollLoop() const { return mPollLoop; } virtual void doDefaultKey(android::KeyEvent* keyEvent) = 0; private: android::InputConsumer mConsumer; android::PreallocatedInputEventFactory mInputEventFactory; android::sp<android::PollLoop> mPollLoop; }; #endif // _UI_INPUT_TRANSPORT_H include/utils/PollLoop.h +33 −1 Original line number Diff line number Diff line Loading @@ -22,12 +22,22 @@ #include <sys/poll.h> #include <android/looper.h> struct ALooper : public android::RefBase { protected: virtual ~ALooper() { } public: ALooper() { } }; namespace android { /** * A basic file descriptor polling loop based on poll() with callbacks. */ class PollLoop : public RefBase { class PollLoop : public ALooper { protected: virtual ~PollLoop(); Loading Loading @@ -82,6 +92,11 @@ public: */ void setCallback(int fd, int events, Callback callback, void* data = NULL); /** * Like setCallback(), but for the NDK callback function. */ void setLooperCallback(int fd, int events, ALooper_callbackFunc* callback, void* data); /** * Removes the callback for a file descriptor, if one exists. * Loading @@ -100,9 +115,22 @@ public: */ bool removeCallback(int fd); /** * Set the given PollLoop to be associated with the * calling thread. There must be a 1:1 relationship between * PollLoop and thread. */ static void setForThread(const sp<PollLoop>& pollLoop); /** * Return the PollLoop associated with the calling thread. */ static sp<PollLoop> getForThread(); private: struct RequestedCallback { Callback callback; ALooper_callbackFunc* looperCallback; void* data; }; Loading @@ -110,6 +138,7 @@ private: int fd; int events; Callback callback; ALooper_callbackFunc* looperCallback; void* data; }; Loading @@ -130,8 +159,11 @@ private: void openWakePipe(); void closeWakePipe(); void setCallbackCommon(int fd, int events, Callback callback, ALooper_callbackFunc* looperCallback, void* data); ssize_t getRequestIndexLocked(int fd); void wakeAndLock(); static void threadDestructor(void *st); }; } // namespace android Loading Loading
core/java/android/app/NativeActivity.java +9 −2 Original line number Diff line number Diff line Loading @@ -6,7 +6,9 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.PixelFormat; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Looper; import android.os.MessageQueue; import android.view.InputChannel; Loading @@ -33,7 +35,8 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback, private boolean mDestroyed; private native int loadNativeCode(String path, MessageQueue queue); private native int loadNativeCode(String path, MessageQueue queue, String internalDataPath, String externalDataPath, int sdkVersion); private native void unloadNativeCode(int handle); private native void onStartNative(int handle); Loading Loading @@ -90,7 +93,11 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback, throw new IllegalArgumentException("Unable to find native library: " + libname); } mNativeHandle = loadNativeCode(path, Looper.myQueue()); mNativeHandle = loadNativeCode(path, Looper.myQueue(), getFilesDir().toString(), Environment.getExternalStorageAppFilesDirectory(ai.packageName).toString(), Build.VERSION.SDK_INT); if (mNativeHandle == 0) { throw new IllegalArgumentException("Unable to load native library: " + path); } Loading
core/jni/android_app_NativeActivity.cpp +20 −2 Original line number Diff line number Diff line Loading @@ -166,6 +166,9 @@ struct NativeCode { void* dlhandle; ANativeActivity_createFunc* createActivityFunc; String8 internalDataPath; String8 externalDataPath; sp<ANativeWindow> nativeWindow; jobject inputChannel; struct MyInputQueue* nativeInputQueue; Loading Loading @@ -204,7 +207,8 @@ static bool mainWorkCallback(int fd, int events, void* data) { // ------------------------------------------------------------------------ static jint loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jobject messageQueue) loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jobject messageQueue, jstring internalDataDir, jstring externalDataDir, int sdkVersion) { const char* pathStr = env->GetStringUTFChars(path, NULL); NativeCode* code = NULL; Loading Loading @@ -247,6 +251,19 @@ loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jobject messageQ } code->activity.env = env; code->activity.clazz = env->NewGlobalRef(clazz); const char* dirStr = env->GetStringUTFChars(internalDataDir, NULL); code->internalDataPath = dirStr; code->activity.internalDataPath = code->internalDataPath.string(); env->ReleaseStringUTFChars(path, dirStr); dirStr = env->GetStringUTFChars(externalDataDir, NULL); code->externalDataPath = dirStr; code->activity.externalDataPath = code->externalDataPath.string(); env->ReleaseStringUTFChars(path, dirStr); code->activity.sdkVersion = sdkVersion; code->createActivityFunc(&code->activity, NULL, 0); } Loading Loading @@ -420,7 +437,8 @@ onInputChannelDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jobject } static const JNINativeMethod g_methods[] = { { "loadNativeCode", "(Ljava/lang/String;Landroid/os/MessageQueue;)I", (void*)loadNativeCode_native }, { "loadNativeCode", "(Ljava/lang/String;Landroid/os/MessageQueue;Ljava/lang/String;Ljava/lang/String;I)I", (void*)loadNativeCode_native }, { "unloadNativeCode", "(I)V", (void*)unloadNativeCode_native }, { "onStartNative", "(I)V", (void*)onStart_native }, { "onResumeNative", "(I)V", (void*)onResume_native }, Loading
core/jni/android_os_MessageQueue.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -51,7 +51,11 @@ private: // ---------------------------------------------------------------------------- NativeMessageQueue::NativeMessageQueue() { mPollLoop = PollLoop::getForThread(); if (mPollLoop == NULL) { mPollLoop = new PollLoop(); PollLoop::setForThread(mPollLoop); } } NativeMessageQueue::~NativeMessageQueue() { Loading
include/ui/InputTransport.h +5 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ #include <semaphore.h> #include <ui/Input.h> #include <utils/Errors.h> #include <utils/PollLoop.h> #include <utils/Timers.h> #include <utils/RefBase.h> #include <utils/String8.h> Loading Loading @@ -345,11 +346,15 @@ public: android::status_t consume(android::InputEvent** event); void setPollLoop(const android::sp<android::PollLoop>& pollLoop) { mPollLoop = pollLoop; } const android::sp<android::PollLoop> getPollLoop() const { return mPollLoop; } virtual void doDefaultKey(android::KeyEvent* keyEvent) = 0; private: android::InputConsumer mConsumer; android::PreallocatedInputEventFactory mInputEventFactory; android::sp<android::PollLoop> mPollLoop; }; #endif // _UI_INPUT_TRANSPORT_H
include/utils/PollLoop.h +33 −1 Original line number Diff line number Diff line Loading @@ -22,12 +22,22 @@ #include <sys/poll.h> #include <android/looper.h> struct ALooper : public android::RefBase { protected: virtual ~ALooper() { } public: ALooper() { } }; namespace android { /** * A basic file descriptor polling loop based on poll() with callbacks. */ class PollLoop : public RefBase { class PollLoop : public ALooper { protected: virtual ~PollLoop(); Loading Loading @@ -82,6 +92,11 @@ public: */ void setCallback(int fd, int events, Callback callback, void* data = NULL); /** * Like setCallback(), but for the NDK callback function. */ void setLooperCallback(int fd, int events, ALooper_callbackFunc* callback, void* data); /** * Removes the callback for a file descriptor, if one exists. * Loading @@ -100,9 +115,22 @@ public: */ bool removeCallback(int fd); /** * Set the given PollLoop to be associated with the * calling thread. There must be a 1:1 relationship between * PollLoop and thread. */ static void setForThread(const sp<PollLoop>& pollLoop); /** * Return the PollLoop associated with the calling thread. */ static sp<PollLoop> getForThread(); private: struct RequestedCallback { Callback callback; ALooper_callbackFunc* looperCallback; void* data; }; Loading @@ -110,6 +138,7 @@ private: int fd; int events; Callback callback; ALooper_callbackFunc* looperCallback; void* data; }; Loading @@ -130,8 +159,11 @@ private: void openWakePipe(); void closeWakePipe(); void setCallbackCommon(int fd, int events, Callback callback, ALooper_callbackFunc* looperCallback, void* data); ssize_t getRequestIndexLocked(int fd); void wakeAndLock(); static void threadDestructor(void *st); }; } // namespace android Loading