1 #include "AndroidScheduler.h" 2 #include <android/log.h> 3 #include <fbjni/fbjni.h> 4 #include <jsi/jsi.h> 5 #include <memory> 6 #include <string> 7 8 namespace reanimated { 9 10 using namespace facebook; 11 using namespace react; 12 13 class SchedulerWrapper : public Scheduler { 14 private: 15 jni::global_ref<AndroidScheduler::javaobject> scheduler_; 16 17 public: SchedulerWrapper(jni::global_ref<AndroidScheduler::javaobject> scheduler)18 explicit SchedulerWrapper( 19 jni::global_ref<AndroidScheduler::javaobject> scheduler) 20 : scheduler_(scheduler) {} 21 scheduleOnUI(std::function<void ()> job)22 void scheduleOnUI(std::function<void()> job) override { 23 Scheduler::scheduleOnUI(job); 24 if (!scheduledOnUI) { 25 scheduledOnUI = true; 26 scheduler_->cthis()->scheduleOnUI(); 27 } 28 } 29 ~SchedulerWrapper()30 ~SchedulerWrapper() {} 31 }; 32 AndroidScheduler(jni::alias_ref<AndroidScheduler::javaobject> jThis)33AndroidScheduler::AndroidScheduler( 34 jni::alias_ref<AndroidScheduler::javaobject> jThis) 35 : javaPart_(jni::make_global(jThis)), 36 scheduler_(new SchedulerWrapper(jni::make_global(jThis))) {} 37 initHybrid(jni::alias_ref<jhybridobject> jThis)38jni::local_ref<AndroidScheduler::jhybriddata> AndroidScheduler::initHybrid( 39 jni::alias_ref<jhybridobject> jThis) { 40 return makeCxxInstance(jThis); 41 } 42 triggerUI()43void AndroidScheduler::triggerUI() { 44 scheduler_->triggerUI(); 45 } 46 scheduleOnUI()47void AndroidScheduler::scheduleOnUI() { 48 static auto method = javaPart_->getClass()->getMethod<void()>("scheduleOnUI"); 49 method(javaPart_.get()); 50 } 51 registerNatives()52void AndroidScheduler::registerNatives() { 53 registerHybrid({ 54 makeNativeMethod("initHybrid", AndroidScheduler::initHybrid), 55 makeNativeMethod("triggerUI", AndroidScheduler::triggerUI), 56 }); 57 } 58 59 } // namespace reanimated 60