From 36f254aa75316d3605d4becee8a6dc8fb2e202cc Mon Sep 17 00:00:00 2001 From: David Aurelio Date: Thu, 3 May 2018 08:38:06 -0700 Subject: [PATCH] `CatalystInstanceImpl`: Method for loading from delta client Summary: Adds `loadScriptFromDeltaBundle` / `jniLoadScriptFromDeltaBundle` methods to `CatalystInstanceImpl`. These methods allow to run JS coming from a native delta client as RAM bundles, to leverage the RAM bundle mechanism for development / reload scenarios. Reviewed By: fromcelticpark Differential Revision: D7845140 fbshipit-source-id: b79b340f36c28939a31eb63a3c463d0792a208f7 --- .../react/bridge/CatalystInstanceImpl.java | 9 +++++++++ .../jni/react/jni/CatalystInstanceImpl.cpp | 18 ++++++++++++++++++ .../main/jni/react/jni/CatalystInstanceImpl.h | 2 ++ 3 files changed, 29 insertions(+) diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java index 7ab121626..b8930d1a4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java @@ -221,10 +221,19 @@ public class CatalystInstanceImpl implements CatalystInstance { jniLoadScriptFromFile(fileName, sourceURL, loadSynchronously); } + /* package */ void loadScriptFromDeltaBundle( + String sourceURL, + NativeDeltaClient deltaClient, + boolean loadSynchronously) { + mSourceURL = sourceURL; + jniLoadScriptFromDeltaBundle(sourceURL, deltaClient, loadSynchronously); + } + private native void jniSetSourceURL(String sourceURL); private native void jniRegisterSegment(int segmentId, String path); private native void jniLoadScriptFromAssets(AssetManager assetManager, String assetURL, boolean loadSynchronously); private native void jniLoadScriptFromFile(String fileName, String sourceURL, boolean loadSynchronously); + private native void jniLoadScriptFromDeltaBundle(String sourceURL, NativeDeltaClient deltaClient, boolean loadSynchronously); @Override public void runJSBundle() { diff --git a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp index 7b136f0d0..aeb4cc55e 100644 --- a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp +++ b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp @@ -4,17 +4,21 @@ #include #include +#include +#include #include #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -100,6 +104,7 @@ void CatalystInstanceImpl::registerNatives() { makeNativeMethod("jniRegisterSegment", CatalystInstanceImpl::jniRegisterSegment), makeNativeMethod("jniLoadScriptFromAssets", CatalystInstanceImpl::jniLoadScriptFromAssets), makeNativeMethod("jniLoadScriptFromFile", CatalystInstanceImpl::jniLoadScriptFromFile), + makeNativeMethod("jniLoadScriptFromDeltaBundle", CatalystInstanceImpl::jniLoadScriptFromDeltaBundle), makeNativeMethod("jniCallJSFunction", CatalystInstanceImpl::jniCallJSFunction), makeNativeMethod("jniCallJSCallback", CatalystInstanceImpl::jniCallJSCallback), makeNativeMethod("setGlobalVariable", CatalystInstanceImpl::setGlobalVariable), @@ -210,6 +215,19 @@ void CatalystInstanceImpl::jniLoadScriptFromFile(const std::string& fileName, } } +void CatalystInstanceImpl::jniLoadScriptFromDeltaBundle( + const std::string& sourceURL, + jni::alias_ref jDeltaClient, + bool loadSynchronously) { + + auto deltaClient = jDeltaClient->cthis()->getDeltaClient(); + auto registry = RAMBundleRegistry::singleBundleRegistry( + folly::make_unique(deltaClient)); + + instance_->loadRAMBundle( + std::move(registry), deltaClient->getStartupCode(), sourceURL, loadSynchronously); +} + void CatalystInstanceImpl::jniCallJSFunction(std::string module, std::string method, NativeArray* arguments) { // We want to share the C++ code, and on iOS, modules pass module/method // names as strings all the way through to JS, and there's no way to do diff --git a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h index 5f7b1be15..622edb769 100644 --- a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h +++ b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h @@ -10,6 +10,7 @@ #include "JMessageQueueThread.h" #include "JSLoader.h" #include "ModuleRegistryBuilder.h" +#include "NativeDeltaClient.h" namespace facebook { namespace react { @@ -66,6 +67,7 @@ class CatalystInstanceImpl : public jni::HybridClass { void jniLoadScriptFromAssets(jni::alias_ref assetManager, const std::string& assetURL, bool loadSynchronously); void jniLoadScriptFromFile(const std::string& fileName, const std::string& sourceURL, bool loadSynchronously); + void jniLoadScriptFromDeltaBundle(const std::string& sourceURL, jni::alias_ref deltaClient, bool loadSynchronously); void jniCallJSFunction(std::string module, std::string method, NativeArray* arguments); void jniCallJSCallback(jint callbackId, NativeArray* arguments); void setGlobalVariable(std::string propName,