【问题标题】:How to return float32 array from c++ in node-addon-api?如何在 node-addon-api 中从 c++ 返回 float32 数组?
【发布时间】:2021-05-19 11:12:07
【问题描述】:

我正在尝试使用 node-addon-api 在 node.js 中运行 c++。 我从媒体上读过一篇写得很好的文章。 但是我想将一个浮点数传递给我的一个函数,并将一个浮点数组传递给另一个函数。 我想从他们两个返回一个浮点数组。 函数示例(greeting.cpp

#include <iostream>
#include <string>
#include <cmath>
#include "greeting.h"

float* helloUser( float name ) {
  float* result = new float[3];
  result[0] = 1;
  result[1] = 2;
  result[2] = name;
  return result;
}

以及index.cpp 的代码以及模块的本机实现:

#include <napi.h>
#include <string>
#include "greeting.h"

Napi::Float32Array greetHello(const Napi::CallbackInfo& info) {
    Napi::Env env = info.Env();

    float user = (float) info[0].ToNumber();
    float* result = helloUser( user );

    return Napi::Float32Array::New(env, result);
}

Napi::Object Init(Napi::Env env, Napi::Object exports) {

    exports.Set(
        Napi::String::New(env, "greetHello"), // property name => "greetHello"
        Napi::Function::New(env, greetHello) // property value => `greetHello` function
    );

    return exports;
}

NODE_API_MODULE(greet, Init)

问题是,Napi::Float32Array 不起作用,我试过 Napi::TypedArrayOf&lt;float&gt;,它也不起作用。我不太喜欢编写模块。 我只希望我在节点中运行的纯 c++ 代码将其结果发送到前端。 我尝试使用Napi::Number 接受和返回浮点数,它工作正常。 但我不知道如何让它开始使用数组。 任何帮助表示赞赏。

【问题讨论】:

  • 为什么不在调用者中分配并通过引用传递?
  • 斯塔克,您能详细说明一下吗?您谈论函数参数,但我也需要从该函数返回。我现在找到了一个折衷的解决方案——传递和接收一个字符串,然后在 JS 中解析它以获得我的浮点数。但它显然违背了使用 c++ 的全部目的。
  • 生成的项目位于此处:github.com/agt-ru/cone3d 我使用 c++ 进行一些计算并返回一串浮点值,然后在传递给前端的节点中对其进行解析。如果有人对如何提高性能并最终在 c++/node 通信中返回和接收数组有任何建议,或者可能提供文章的链接,并在其中进行了正确解释,我将非常高兴听到答案。

标签: c++ node.js node-addon-api


【解决方案1】:

我遇到了类似的问题,Napi instance methods 期望:

void MethodName(const Napi::CallbackInfo& info);

Napi::Value MethodName(const Napi::CallbackInfo& info);

即使 Napi::TypedArray 继承自 Napi::Object 继承自 Napi::Value,但事实证明您必须显式返回 Napi::Value,如下所示:

Napi::Value greetHello(Napi::CallbackInfo const& info)
{
  Napi::Float32Array arr = Napi::Float32Array::New(info.Env(), 16);
  arr[0] = 1;
  arr[15] = 16;
  return arr;
}

这会给你一个Float32Array

{
  greetHello: [Function (anonymous)]
}
Float32Array(16) [
  1, 0, 0,  0, 0, 0,
  0, 0, 0,  0, 0, 0,
  0, 0, 0, 16
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多