mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-02-10 17:22:45 +08:00
Summary: This patch adds two pieces of functionality:
- Exposes `JSBundleLoader` to allow a developer to load JavaScript bundles as they choose.
- Adds `ReactBridge.loadScripFromFile` method which loads a JavaScript bundle from an arbitrary file path.
Example usage:
```
JSBundleLoader jsBundleLoader = new JSBundleLoader() {
Override
public void loadScript(ReactBridge reactBridge) {
reactBridge.loadScriptFromFile("/sdcard/Download/index.android.bundle");
}
};
mReactInstanceManager = ReactInstanceManager.builder()
.setApplication(getApplication())
.setJSBundleLoader(jsBundleLoader)
.setJSMainModuleName("") /* necessary due to TODO(6803830) */
.addPackage(new MainReactPackage())
.setInitialLifecycleState(LifecycleState.RESUMED)
.build();
```
cc ide
Closes https://github.com/facebook/react-native/pull/3189
Reviewed By: svcscm
Differential Revision: D2535819
Pulled By: mkonicek
fb-gh-sync-id: f319299dbe29bab3b7e91f94249c14b270d9fec3
76 lines
2.5 KiB
Java
76 lines
2.5 KiB
Java
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
package com.facebook.react.bridge;
|
|
|
|
import javax.annotation.Nullable;
|
|
|
|
import android.content.res.AssetManager;
|
|
|
|
import com.facebook.react.bridge.queue.MessageQueueThread;
|
|
import com.facebook.jni.Countable;
|
|
import com.facebook.proguard.annotations.DoNotStrip;
|
|
import com.facebook.soloader.SoLoader;
|
|
|
|
/**
|
|
* Interface to the JS execution environment and means of transport for messages Java<->JS.
|
|
*/
|
|
@DoNotStrip
|
|
public class ReactBridge extends Countable {
|
|
|
|
/* package */ static final String REACT_NATIVE_LIB = "reactnativejni";
|
|
|
|
static {
|
|
SoLoader.loadLibrary(REACT_NATIVE_LIB);
|
|
}
|
|
|
|
private final ReactCallback mCallback;
|
|
private final JavaScriptExecutor mJSExecutor;
|
|
private final MessageQueueThread mNativeModulesQueueThread;
|
|
|
|
/**
|
|
* @param jsExecutor the JS executor to use to run JS
|
|
* @param callback the callback class used to invoke native modules
|
|
* @param nativeModulesQueueThread the MessageQueueThread the callbacks should be invoked on
|
|
*/
|
|
public ReactBridge(
|
|
JavaScriptExecutor jsExecutor,
|
|
ReactCallback callback,
|
|
MessageQueueThread nativeModulesQueueThread) {
|
|
mJSExecutor = jsExecutor;
|
|
mCallback = callback;
|
|
mNativeModulesQueueThread = nativeModulesQueueThread;
|
|
initialize(jsExecutor, callback, mNativeModulesQueueThread);
|
|
}
|
|
|
|
@Override
|
|
public void dispose() {
|
|
mJSExecutor.close();
|
|
mJSExecutor.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
private native void initialize(
|
|
JavaScriptExecutor jsExecutor,
|
|
ReactCallback callback,
|
|
MessageQueueThread nativeModulesQueueThread);
|
|
|
|
/**
|
|
* All native functions are not thread safe and appropriate queues should be used
|
|
*/
|
|
public native void loadScriptFromAssets(AssetManager assetManager, String assetName);
|
|
public native void loadScriptFromFile(@Nullable String fileName, @Nullable String sourceURL);
|
|
public native void callFunction(int moduleId, int methodId, NativeArray arguments);
|
|
public native void invokeCallback(int callbackID, NativeArray arguments);
|
|
public native void setGlobalVariable(String propertyName, String jsonEncodedArgument);
|
|
public native boolean supportsProfiling();
|
|
public native void startProfiler(String title);
|
|
public native void stopProfiler(String title, String filename);
|
|
}
|