如何在 C++ 中从 V8 调用 Javascript 函数
How to call a Javascript function from V8 in C++
为了 运行 使用 v8 的简单 Javascript 程序,我按如下方式进行:
// Create a string containing the JavaScript source code.
v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, "'Hello' + ', from Javascript!'", v8::NewStringType::kNormal).ToLocalChecked();
// Compile the source code.
v8::Local<v8::Script> script = v8::Script::Compile(context, source).ToLocalChecked();
// Run the script to get the result.
v8::Local<v8::Value> result = script->Run(context).ToLocalChecked();
如何在 /path/to/my_js_functions.js 文件中调用 Javascript 函数?
function myJsFunction(stringParam) {
return stringParam // The function returns a stringParam from the parameter
}
提前谢谢大家。
首先你必须得到函数对象。假设它在全局范围内(== 在全局对象上),您可以像这样访问它:
v8::Local<v8::String> name = v8::String::NewFromUtf8(
isolate, "myJsFunction", v8::NewStringType::kInternalized).ToLocalChecked();
v8::Local<v8::Value> obj =
context->Global()->Get(context.local(), name).ToLocalChecked();
if (!obj->IsFunction()) {
/* someone overwrote it, handle error */
}
v8::Local<v8::Function> my_function = v8::Local<v8::Function>::Cast(obj);
请注意,每次获得 MaybeLocal
时,结果可能为空,这在抛出异常时发生。如果你不能保证那不会发生,那么你不应该只使用 .ToLocalChecked()
(当 MaybeLocal
为空时会崩溃),而是正确地检查和处理错误情况.
一旦你有了一个函数,你就可以为它准备参数并调用它:
v8::Local<v8::Value> receiver = ...;
int argc = ...;
v8::Local<v8::Value> args[argc] = ...;
v8::MaybeLocal<v8::Value> result = my_function->Call(context.local(), receiver, argc, args);
同样,结果是 MaybeLocal
,因为函数可以抛出异常(显式或间接地由 calling/doing 抛出的东西)。由您来捕获任何错误情况,否则 Cast
将结果转换为适当的类型并对其进行处理。
(通过 C++ API 使用 JavaScript 并不完全令人愉快。这主要是由于两种语言之间的许多概念差异。)
有关更多示例,请查看 V8 的 test-api.cc。
为了 运行 使用 v8 的简单 Javascript 程序,我按如下方式进行:
// Create a string containing the JavaScript source code.
v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, "'Hello' + ', from Javascript!'", v8::NewStringType::kNormal).ToLocalChecked();
// Compile the source code.
v8::Local<v8::Script> script = v8::Script::Compile(context, source).ToLocalChecked();
// Run the script to get the result.
v8::Local<v8::Value> result = script->Run(context).ToLocalChecked();
如何在 /path/to/my_js_functions.js 文件中调用 Javascript 函数?
function myJsFunction(stringParam) {
return stringParam // The function returns a stringParam from the parameter
}
提前谢谢大家。
首先你必须得到函数对象。假设它在全局范围内(== 在全局对象上),您可以像这样访问它:
v8::Local<v8::String> name = v8::String::NewFromUtf8(
isolate, "myJsFunction", v8::NewStringType::kInternalized).ToLocalChecked();
v8::Local<v8::Value> obj =
context->Global()->Get(context.local(), name).ToLocalChecked();
if (!obj->IsFunction()) {
/* someone overwrote it, handle error */
}
v8::Local<v8::Function> my_function = v8::Local<v8::Function>::Cast(obj);
请注意,每次获得 MaybeLocal
时,结果可能为空,这在抛出异常时发生。如果你不能保证那不会发生,那么你不应该只使用 .ToLocalChecked()
(当 MaybeLocal
为空时会崩溃),而是正确地检查和处理错误情况.
一旦你有了一个函数,你就可以为它准备参数并调用它:
v8::Local<v8::Value> receiver = ...;
int argc = ...;
v8::Local<v8::Value> args[argc] = ...;
v8::MaybeLocal<v8::Value> result = my_function->Call(context.local(), receiver, argc, args);
同样,结果是 MaybeLocal
,因为函数可以抛出异常(显式或间接地由 calling/doing 抛出的东西)。由您来捕获任何错误情况,否则 Cast
将结果转换为适当的类型并对其进行处理。
(通过 C++ API 使用 JavaScript 并不完全令人愉快。这主要是由于两种语言之间的许多概念差异。)
有关更多示例,请查看 V8 的 test-api.cc。