gpt4 book ai didi

javascript - 用输出参数包装一个 c++ 函数,以便在 javascript/node 中使用

转载 作者:行者123 更新时间:2023-11-30 04:59:15 25 4
gpt4 key购买 nike

给定一个定义为 int test(char* input, char** output); 的函数。如何配置 SWIG 接口(interface)以便获取输出值?

这是我在 js 中调用它的方式:

var input = 'input1';
var output = '';
var result = mylib.test(input, output);
console.log(output);

我知道这是行不通的,因为字符串在 javascript 中是不可变的,而且在 SWIG 中创建的接口(interface)不会写回输出参数。

C++代码如下:

int test(char* input, char** output) {
*output = input;
return 0;
}

最佳答案

将您展示的 C++ 语义映射到 JavaScript 的最简单方法是使 SWIG 使函数的行为与您用真正的 JavaScript 而不是 C++ 编写的函数一样。也就是说,我们将使您的函数的行为类似于以下 JavaScript 伪代码:

function test(input) {
if (error) {
throw ....
}
return input;
}

要使用 SWIG 做到这一点,我们需要编写一些类型映射。 (在某些情况下 those typemaps already exist 对于我们来说是标准 SWIG 库的一部分,但对于 char ** 没有这样的类型映射,因为语义不太明显)。

我使您的代码与以下 SWIG 接口(interface)一起工作,注释如下:

%module test

// #1
%typemap(in,numinputs=0) char **output (char *tmp) {
$1 = &tmp; // #2
}

// #3
%typemap(argout,fragment="SWIG_FromCharPtr") char **output {
$result = SWIG_FromCharPtr(tmp$argnum);
// Without more effort the following would be an illegal cast I think:
//SWIG_AppendOutput($result, tmp$argnum);
}

// #4
%typemap(out) int test %{
if ($1) {
SWIG_exception_fail(SWIG_ERROR, "Well, that was unexpected");
}
%}

%inline %{
int test(char *input, char **output) {
*output = input;
return 0;
}
%}

基本上我们在这里做了 4 件事:

  1. 设置 **output 参数的类型映射,根本不从 JavaScript 获取输入。 numinputs=0是什么抑制了从 JavaScript 被调用方接收参数的需要。
  2. 相反,我们使用局部变量作为纯粹在包装器内的输出
  3. 调用函数后,使用局部变量中的值作为函数返回 JavaScript。我们需要将其称为 tmp$argnum,因为 SWIG 已在内部对局部变量进行编号,以避免在类型映射在 in 类型映射上多次匹配时发生冲突,但它不会在 argout 上自动执行此操作. SWIG 提供了一些标准宏,用于附加事物以返回多个项目,但它们在这里不起作用,因为它最终会进行非法转换,而且我不太喜欢使用这些语义。此处的片段确保我们在生成的代码中获得了对可用字符串输出的一些预先编写的支持。
  4. 对原始返回值做一些事情,在这种情况下,如果我们从 C++ 得到非零值(即错误),则抛出异常。还有其他方法可以处理此问题,但这是最简单的方法,而不是默默地忽略错误。

我以前几乎从未使用过 SWIG 的 JavaScript 支持,所以一旦我完成了 basic documentation for building a module这足以让我运行以下测试:

var test = require("./build/Release/test");

console.log(test.test("blah blah"));

按预期工作。我还做了一个快速测试,更改返回值以强制出现异常,并且它的行为也符合预期。

免责声明:这样做几乎使我对 node/V8 的接触增加了一倍,所以请仔细检查我的工作。

关于javascript - 用输出参数包装一个 c++ 函数,以便在 javascript/node 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51330378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com