diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThreadRegistry.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThreadRegistry.java index b924fd88b..fd0602a93 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThreadRegistry.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThreadRegistry.java @@ -29,6 +29,7 @@ public class MessageQueueThreadRegistry { /** * @return the MessageQueueThread that owns the current Thread. */ + @DoNotStrip public static MessageQueueThread myMessageQueueThread() { return Assertions.assertNotNull( sMyMessageQueueThread.get(), diff --git a/ReactAndroid/src/main/jni/react/jni/JMessageQueueThread.cpp b/ReactAndroid/src/main/jni/react/jni/JMessageQueueThread.cpp new file mode 100644 index 000000000..0202f4a4d --- /dev/null +++ b/ReactAndroid/src/main/jni/react/jni/JMessageQueueThread.cpp @@ -0,0 +1,32 @@ +// Copyright 2004-present Facebook. All Rights Reserved. + +#include "JMessageQueueThread.h" + +#include +#include +#include + +#include "JNativeRunnable.h" + +namespace facebook { +namespace react { + +JMessageQueueThread::JMessageQueueThread(alias_ref jobj) : + m_jobj(make_global(jobj)) { +} + +void JMessageQueueThread::runOnQueue(std::function&& runnable) { + static auto method = MessageQueueThread::javaClassStatic()-> + getMethod("runOnQueue"); + method(m_jobj, JNativeRunnable::newObjectCxxArgs(runnable).get()); +} + +/* static */ +std::unique_ptr JMessageQueueThread::currentMessageQueueThread() { + static auto method = MessageQueueThreadRegistry::javaClassStatic()-> + getStaticMethod("myMessageQueueThread"); + return folly::make_unique(method(MessageQueueThreadRegistry::javaClassStatic())); +} + +} } + diff --git a/ReactAndroid/src/main/jni/react/jni/JMessageQueueThread.h b/ReactAndroid/src/main/jni/react/jni/JMessageQueueThread.h new file mode 100644 index 000000000..1a0f52bc9 --- /dev/null +++ b/ReactAndroid/src/main/jni/react/jni/JMessageQueueThread.h @@ -0,0 +1,41 @@ +// Copyright 2004-present Facebook. All Rights Reserved. + +#pragma once + +#include + +#include + +using namespace facebook::jni; + +namespace facebook { +namespace react { + +class MessageQueueThread : public jni::JavaClass { +public: + static constexpr auto kJavaDescriptor = "Lcom/facebook/react/bridge/queue/MessageQueueThread;"; +}; + +class JMessageQueueThread { +public: + JMessageQueueThread(alias_ref jobj); + + /** + * Enqueues the given function to run on this MessageQueueThread. + */ + void runOnQueue(std::function&& runnable); + + /** + * Returns the current MessageQueueThread that owns this thread. + */ + static std::unique_ptr currentMessageQueueThread(); +private: + global_ref m_jobj; +}; + +class MessageQueueThreadRegistry : public jni::JavaClass { +public: + static constexpr auto kJavaDescriptor = "Lcom/facebook/react/bridge/queue/MessageQueueThreadRegistry;"; +}; + +} }