【问题标题】:What's the difference between bridging a module with C++ or with JSI in React Native?在 React Native 中使用 C++ 或 JSI 桥接模块有什么区别?
【发布时间】:2021-10-08 20:44:45
【问题描述】:
在 React Native 中,可以通过多种方式从 Android 和 iOS 引入本机功能。
我一直认为所有可能的方式都受到 Java/Kotlin 和 Objective-C/Swift 等平台相关语言的限制。但是,我注意到即使从 C++(不使用 JSI)也仍然可以桥接本机功能。
具体来说,我注意到从react-native-builder-bob 可以轻松启动一个使用 C++ 桥接本机模块的包。
此时我想知道,如果 JSI 已经可以将 JS 与 C++ 集成,那么 JSI 引入了什么新功能?为什么它应该比当前解决方案带来性能改进?
对于我缺乏知识,我提前道歉,但我真的找不到答案。
【问题讨论】:
标签:
c++
react-native
react-native-bridge
react-native-jsi
【解决方案1】:
Native 和 JS 之间的当前React Native Bridge 架构异步工作并且仅以 JSON 格式传输数据。
它产生下一个问题:
异步调用
- 许多线程和它们之间的跳转:JS、Shadow、Main、Native...
- JS 和主线程不直接通信(UI 渲染缓慢)
JSON
- JS 和 Native 线程之间没有数据共享
- 由于 JSON 序列化导致数据传输缓慢(瓶颈)
您可以连接到任何本机代码 Java/Konlin、ObjC/Swift、C++ 等,但您总是会遇到上述问题。
React Native JSI 为 JS 运行时引擎提供 API,并允许直接向 JS 公开原生函数和对象 - 根本没有桥接。
它提供了下一个优势:
- 从 JS 线程同步调用到 Native,反之亦然
- 使用直接调用 UI 主线程的快速渲染
- 线程间数据共享
您必须仅使用 C++ 来处理 JSI,因为 JS Runtime 具有 C++ API,但可以在 JSI 和您现有的 Java 或 Swift 代码之间建立 C++ 层。
JSI 是未来新的 React Native 架构的基础,其中包括:Fabric、TurboModules、CodeGen。阅读更多:https://github.com/react-native-community/discussions-and-proposals/issues/91