简体   繁体   中英

How to return float32 array from c++ in node-addon-api?

I am trying to run c++ in node.js using node-addon-api. I've read one well-written elaborate article from medium. But I want to pass to one of my functions a float, and a float array to another function. I want to return a float array from both of them. The example of a function ( 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;
}

And the code of index.cpp with a native implementation of the module:

#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)

The thing is, Napi::Float32Array doesn't work, I tried Napi::TypedArrayOf<float> , it doesn't work either. I am not that much into writing modules. I just want my pure c++ code running in node to send its result to the frontend. I tried accepting and returning floats with Napi::Number and it works fine. But I have no clue how to get it start working with arrays. Any help is appreciated.

I ran into a similar issue and the Napi instance methods expect either a:

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

or

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

Even though Napi::TypedArray inherits from Napi::Object which inherits from Napi::Value , it turns out you have to explicitly return a Napi::Value as follows:

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

Which will get you a Float32Array :

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM