本文目录 1 个章节
JavaScriptCpp互操作深入-JSB
# JavaScriptCpp互操作深入-JSB
📚 JavaScript Bindings(JavaScript 绑定)
JSB = JavaScript Bindings,即 自动生成的 C++ ↔ JavaScript 双向通信层
JSB 原本用于原生平台(如 iOS、Android)上,通过 JavaScript 引擎(如 JavaScriptCore、V8)调用 C++ 代码。
对于WebGL平台,将 C++ 编译成 WebAssembly(wasm32),并在 Web 平台运行。因此,需要一种机制让 JavaScript(由 TypeScript 生成)能够调用 WebAssembly 中的 C++ 函数。这就是“绑定”(bindings)的作用。在 Emscripten 中,通常使用 Embind 或 WebAssembly 的 Table 来实现 JavaScript 与 C++ 之间的绑定。但是,在 Cocos 引擎中,他们可能使用了自己的自动化绑定工具(如 CodeGen.py)来生成这些绑定代码,并称之为 JSB(即使是在 Web 平台)。
在 Cocos 官方文档中,JSB 通常特指原生平台的绑定。但在 WebAssembly 平台,他们可能沿用了相同的术语(或者称为 WASM 绑定)。
核心作用
- 将 C++ 引擎的功能(如图形渲染、物理引擎、文件系统等)暴露给 JavaScript/TS 层调用
- 允许 JavaScript/TS 代码直接操作 C++ 对象(如创建
Sprite、调用Physics方法)
当使用 Emscripten 将 C++ 编译为 WebAssembly (wasm32) 时:
- JSB 通过 自动生成的绑定代码 实现:
// 示例:JSB 自动绑定 C++ 类到 JS
EMSCRIPTEN_BINDINGS(MyClass) {
class_<MyClass>("MyClass")
.constructor<>()
.function("doSomething", &MyClass::doSomething);
}
- 在 TS 中可直接调用:
const obj = new MyClass(); // C++ 对象
obj.doSomething(); // 调用 C++ 方法
- 技术流程中的角色(对应你的图示)
graph LR Cpp -->|Clang/LLVM| WASM TypeScript -->|tsc| JavaScript WASM -->|JSB-Bindings| JavaScript JavaScript -->|WebGL API| 渲染- CodeGen.py:生成绑定胶水代码(如将 C++ 类映射为 JS 可调用的接口)
- CMake + Emscripten:编译时注入绑定逻辑,生成可直接与 JS 交互的 WASM 模块