C语言与JavaScript的交互调用,如何实现?
- 行业动态
- 2025-03-06
- 9
javascript,function addNumbers(a, b) {, return a + b;,},console.log(addNumbers(5, 7)); // 输出: 12,
“
在C语言中调用JavaScript代码,主要有以下几种方法:
1、使用Emscripten将C代码编译为WebAssembly并在JavaScript中调用
编写C代码并编译为Wasm模块:编写一个简单的C函数,创建一个名为add.c
的文件,内容如下:
#include <stdio.h> int add(int a, int b) { return a + b; }
然后使用Emscripten编译器将这个C代码编译为Wasm模块,在命令行中执行以下命令:
emcc -o add.js add.c -s WASM=1
这条命令会生成一个add.js
文件和一个add.wasm
文件。add.js
文件包含了加载和调用Wasm模块的JavaScript代码。
在JavaScript中加载和调用Wasm模块:在JavaScript中加载并调用编译好的Wasm模块,假设我们有一个index.html
如下:
<!DOCTYPE html> <html> <head> <title>Wasm Example</title> </head> <body> <script src="add.js"></script> <script> Module.onRuntimeInitialized = function() { const result = Module._add(10, 20); console.log("Result of add(10, 20):", result); }; </script> </body> </html>
在这个例子中,当Wasm模块初始化完成后,我们调用了Module._add
函数,并传入两个参数(10和20),结果将被打印到控制台。
2、通过Node.js与C语言交互
编写和编译C++插件:编写一个简单的C++代码,并将其编译为Node.js的插件,创建一个名为addon.cpp
的文件,内容如下:
#include <napi.h> Napi::Number Add(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); int a = info[0].As<Napi::Number>().Int32Value(); int b = info[1].As<Napi::Number>().Int32Value(); return Napi::Number::New(env, a + b); } Napi::Object Init(Napi::Env env, Napi::Object exports) { exports.Set(Napi::String::New(env, "add"), Napi::Function::New(env, Add)); return exports; } NODE_API_MODULE(addon, Init)
然后创建一个binding.gyp
文件用于配置编译过程:
{ "target_name": "addon", "sources": ["addon.cpp"] }
使用node-gyp
编译插件:
node-gyp configure node-gyp build
这将生成一个addon.node
文件。
在JavaScript中使用C++插件:在Node.js中加载并使用生成的插件,创建一个名为app.js
的文件,内容如下:
const addon = require('./build/Release/addon'); const result = addon.add(10, 20); console.log("Result of add(10, 20):", result);
3、嵌入浏览器引擎
使用Electron实现桌面应用中的JavaScript调用:Electron是一个使用Web技术(HTML、CSS、JavaScript)构建跨平台桌面应用的框架,通过Electron,可以在C++应用中嵌入JavaScript代码,创建一个简单的Electron应用,在项目目录中创建一个main.js
如下:
const { app, BrowserWindow } = require('electron'); function createWindow () { const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true } }); win.loadFile('index.html'); } app.whenReady().then(createWindow);
然后创建一个index.html
如下:
<!DOCTYPE html> <html> <head> <title>Electron Example</title> </head> <body> <script> const result = require('child_process').execSync('echo Hello from C').toString(); console.log(result); </script> </body> </html>
运行Electron应用,在命令行中执行以下命令:
npm install electron --save-dev npx electron .
以下是两个关于C调用JS的常见问题及解答:
1、问:使用Emscripten编译C代码时,如何导出多个函数供JavaScript调用?
答:可以在编译命令中使用-s EXPORTED_FUNCTIONS
选项来指定要导出的函数,如果有两个函数add
和subtract
需要导出,可以这样编译:
emcc -o my_module.js my_module.c -s WASM=1 -s EXPORTED_FUNCTIONS="['_add', '_subtract']"
然后在JavaScript中就可以像调用Module._add
一样调用Module._subtract
。
2、问:在Node.js中加载C++插件时,如果遇到“Cannot find module”错误,可能是什么原因?
答:可能是插件的路径不正确,或者没有正确安装相关的依赖,确保插件的路径正确,并且在项目中安装了node-gyp
和相应的构建工具链,检查binding.gyp
文件中的配置是否正确,特别是target_name
和sources
字段。