Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(android,ios): add jsi document & demo #1508

Merged
merged 2 commits into from
Jan 31, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added docs/assets/img/jsi_type_android.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
147 changes: 147 additions & 0 deletions docs/guide/jsi.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,155 @@ JSI 并非适用于所有场景:
* 随着所需读取的成员占比上升,JNI 调用次数的增加,所累计的耗时也随之上涨,反而不如编解码实现性能优异。
* 同步调用简化了编码,耗时更稳定,但会阻塞 JS 执行,不适用于复杂逻辑。

## 接入说明

### 客户端

#### Android

* 通过设置引擎初始化参数开启JSI能力

```java
HippyEngine.EngineInitParams initParams = new HippyEngine.EngineInitParams();
initParams.enableTurbo = true;
```

* 定义Module

> 跟普通NativeModule类似,区别在于需要添加注解表明是同步调用 `@HippyMethod(isSync = true)`

```java
@HippyNativeModule(name = "demoTurbo")
public class DemoJavaTurboModule extends HippyNativeModuleBase {

...
@HippyMethod(isSync = true)
public double getNum(double num) {
return num;
}
...
}
```

> 支持的数据类型说明:

<br />
<img src="assets/img/jsi_type_android.png" alt="数据类型" width="100%"/>
<br />
<br />

更多示例可参考类[DemoJavaTurboModule](https://github.com/Tencent/Hippy/blob/master/examples/android-demo/example/src/main/java/com/tencent/mtt/hippy/example/module/turbo/DemoJavaTurboModule.java)

* 注册TurboModule模块,跟NativeModule注册方法完全一致

```java
public class MyAPIProvider implements HippyAPIProvider {

@Override
public Map<Class<? extends HippyNativeModuleBase>, Provider<? extends HippyNativeModuleBase>> getNativeModules(final HippyEngineContext context) {
Map<Class<? extends HippyNativeModuleBase>, Provider<? extends HippyNativeModuleBase>> modules = new HashMap<>();
...
modules.put(DemoJavaTurboModule.class, new Provider<HippyNativeModuleBase>() {
@Override
public HippyNativeModuleBase get() {
return new DemoJavaTurboModule(context);
}
});
...
return modules;
}
```

#### iOS

* 通过设置引擎初始化参数开启JSI能力
iOS有两种方式去打开关闭enableTurbo能力,如下:

```objc
// 方式一:bridge初始化时通过配置参数设置生效
NSDictionary *launchOptions = @{@"EnableTurbo": @(DEMO_ENABLE_TURBO)};
HippyBridge *bridge = [[HippyBridge alloc] initWithDelegate:self
bundleURL:[NSURL fileURLWithPath:commonBundlePath]
moduleProvider:nil
launchOptions:launchOptions
executorKey:@"Demo"];

// 方式二:bridge初始化完成后,设置属性生效
HippyRootView *rootView = [[HippyRootView alloc] initWithBridge:nil
businessURL:nil
moduleName:@"Demo"
initialProperties:@{@"isSimulator": @(isSimulator)}
launchOptions:nil
shareOptions:nil
debugMode:YES
delegate:nil];
rootView.bridge.enableTurbo = YES;

```

* 定义Module

> 继承HippyOCTurboModule,实现协议HippyTurboModule。

目前iOS端仅支持继承关系来实现JSI能力,后续会考虑升级,只需实现协议HippyTurboModule就能实现能力。

具体使用与实现协议如下:

```obj

@implementation TurboConfig

...

// 注册模块
HIPPY_EXPORT_TURBO_MODULE(TurboConfig)

// 注册交互函数
HIPPY_EXPORT_TURBO_METHOD(getInfo) {
return self.strInfo;
}
HIPPY_EXPORT_TURBO_METHOD(setInfo:(NSString *)string) {
self.strInfo = string;
return @(YES);
}

...

@end

```

> 支持的数据类型说明:

| Objec类型 | Js类型 |
|:----------|:----------|
| BOOL | Bool |
| NSInteger | Number |
| NSUInteger | Number |
| CGDouble | Number |
| CGFloat | Number |
| NSString | String |
| NSArray | Array |
| NSDictionary | Object |
| Promise | Function |
| NULL | null |



更多示例可参考类[DemoIOSTurboModule](https://github.com/Tencent/Hippy/blob/master/examples/ios-demo/HippyDemo/turbomodule/TurboBaseModule.mm)


## 使用例子

[Android Demo](https://github.com/Tencent/Hippy/blob/master/examples/android-demo)

[iOS Demo](https://github.com/Tencent/Hippy/blob/master/examples/ios-demo)

[HippyReact Demo](https://github.com/Tencent/Hippy/blob/master/examples/hippy-react-demo/src/externals/Turbo/index.jsx)

[HippyVue Demo](https://github.com/Tencent/Hippy/blob/master/examples/hippy-vue-demo/src/components/demos/demo-turbo.vue)