问题标签 [n-api]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2855 浏览

c - 如何为 NodeJS 原生插件使用 napi_threadsafe_function

我一直在查看NAPI 文档以尝试了解它是如何处理multithreading. 根据文档napi_create_threadsafe_function()napi_call_threadsafe_function()用于js functions从多个线程创建和调用。问题是文档不是那么直截了当,没有示例,我在其他任何地方都找不到。

如果有人有任何使用经验napi_create_threadsafe_function()napi_call_threadsafe_function()或者知道在哪里可以找到使用它们的示例。请您提供一个基本示例,以便我了解如何正确使用它们。

我正在编写一个C插件C++,不需要使用这些功能。我没有使用包装器node-addon-api,而是napi直接使用

0 投票
1 回答
2158 浏览

node.js - 使用 N-API 从 Node.JS 调用 C(++) 函数

我想通过使用带有 node-addon-api 模块包装器的 N-API 来使用 Node.js 中的 C-Function。这是我第一次使用 N-API,我也是 Node 和 C++ 的初学者。我有嵌入式系统的 C 编程经验,但是我还不完全理解这个 Node.jS / N-API 的东西......

我不想做的是使用 Node.js 中的这个原型调用 C-Function:

*data是指向包含 RGB 图像数据 [R0, G0, B0, R1, G1, B1, ...] 的数组的指针,其大小size应在 MyFunction 中处理(提取 RGB 通道,反转,...)。

到目前为止,我所拥有的是这个 c++ 代码:

这是节点部分:

我的问题

  1. 夏普输出一个缓冲区而不是一个数组,但是ArrayBufferArray无法获得工作代码。编译没问题,但是当我在节点中执行它时,我得到了

错误:D:\temp\testSCB\index.js:30:34 处的参数无效

这是这行代码const result = HelloWorld.Test(testArr, smin, smax);)

  1. 如果我更改redArray[i] = inputArray[i * 3];redArray[i] = ~(inputArray[i * 3]);反转颜色,则会出现两个错误:

错误 C2675:一元“~”:“Napi::Value”未定义此运算符或转换为预定义运算符可接受的类型

错误 C2088:“~”:类非法

我的问题

实现我的 c-Function 以从 node.js 工作的正确方法是什么?

谢谢你的帮助!

0 投票
2 回答
2619 浏览

c++ - 如何将 C++ 类返回给 NODE.JS

设置:
我有一个 NODE.JS 应用程序,它必须以低延迟执行一些计算
我决定使用 N-API 和 node-gyp 将本机 C++ 模块包含到 NODE.JS 应用程序中

当前状态:
我已经到了工具链工作的地步,我可以将 C++ 源代码编译成二进制文件,在 NODE.JS 应用程序中包含二进制模块,NODE.JS 应用程序执行
我可以使用标准 NODE.JS 调用 C++ 方法来自 NODE.JS 的类型和方法可以在执行完成后将标准 NODE.JS 类型返回给 NODE.JS

问题:
我不知道如何将自定义类型/对象从 C++ 返回到 NODE.JS
目前我想基本上返回一个具有多种类型的结构,以便将复杂解析的结果返回给 NODE.JS单个 NODE.JS 调用

最少的代码输出:
我做了一个最小的实现来展示我想做的事情。如果您评论#define ENABLE_RETURN_CLASS代码仅使用标准的 NODE.JS 类型并且一切正常。在输出图像下方,显示工具链和执行按预期工作:
浮动工程

如果留下#define ENABLE_RETURN_CLASS代码编译失败。据我了解,它不了解如何从 C++ 对象转换为 NODE.JS 对象。这是错误: 在此处输入图像描述

最少的代码:
初始化 NODE.JS 应用程序

将 C++ 二进制文件编译成 NODE.JS 模块

启动 NODE.JS 应用程序

该代码可以在此存储库中找到:
https
://github.com/OrsoEric/2020-01-18-Test-NODEJS-Return-Class 我计划在找到解决方案后对其进行更新。

我要返回到 NODE.JS 应用程序的类的代码:

my_class.h

my_class.cpp

C++ 和 NODE.JS 之间的绑定代码。#define ENABLE_RETURN_CLASS启用返回类的代码。本例中的实例是一个全局变量。

node_bindings.cpp

NODE.JS 应用程序main.js包含并执行 C++ 模块:

绑定在文件binding.gyp中描述:

package.json是 NODE.JS 解析依赖项所需要的,编译并运行


解决方案

我无法在 Napi::Object 中放置自定义类,但我可以创建一个空的 Napi::Object 并一个一个地创建字段。 https://github.com/OrsoEric/2020-01-18-Test-NODEJS-Return-Class

在 node_bindings.cpp 中实现 Napi ::Object 的正确构造

在main.js中添加测试指令:

输出:
在此处输入图像描述

0 投票
4 回答
3708 浏览

vue.js - 错误“无法读取未定义的属性 'indexOf'”绑定 n-api 模块

我使用n-api编写了一个 c++ 模块,用cmake-js编译它,现在想在我的electron-vue应用程序中使用它。electron-vue如果我在没有它的项目中使用该模块。但是当我尝试在我的electron-vue应用程序中使用它时,我总是遇到这个错误:

我正在使用这样的绑定

我试图根据这个将我的模块定义为外部的,但它没有解决问题:

0 投票
1 回答
267 浏览

c++ - engine.node:未定义符号:_ZTV6Config

我已经编写了我的第一个Node.JS N-Api 插件,但它会因日志而崩溃:

下面是我的代码:
wrapper.h

包装器.cc

引擎.cc

绑定.gyp

当我重建项目时,它没有任何错误。之前我写了一个简单的Hello, World!我刚刚注册了打印文本的功能并且一切正常。但是现在当我尝试将我的模块导入为const engine = require('./build/Release/engine.node');.
当我得到我的模块寄存器但在 Node.JS 之后找不到Config.

我该如何解决?

0 投票
1 回答
1632 浏览

node.js - Nodejs 12 + N-api 版本冲突

我正在尝试在 vue-electron 项目中使用 bcrypt-package,但是当我尝试运行它时出现 N-api 版本问题:

我正在运行节点 12.16.1。

我阅读了有关 N-API 的文档,根据该版本矩阵,我不可能安装版本 1。但我找不到任何关于如何安装/配置/管理这些 N-API 版本的进一步文档。

我的 package.json:

完整的控制台堆栈跟踪:

到目前为止,我擦除并重新安装了 nodejs,清除了 node_modules 并重新安装了所有软件包,但没有区别。

0 投票
1 回答
43 浏览

node.js - 为什么 N-API 在使用 napi_property_descriptor 数组时找不到某些绑定?

我有以下代码...

当我运行 hello world 部分工作正常但前进和停止功能失败...

TypeError:bindings.forward 不是函数

我对 C 开发很陌生,不明白如何找到错误。为什么 hello world 函数工作正常但 forward 函数失败?

0 投票
1 回答
1243 浏览

node.js - 添加节点 NAPI 函数作为回调到本机库

是否可以将javascript函数作为回调添加到通过NAPI接受回调的本机库?

这是我到目前为止的一个示例插件代码。

问题是声明的顺序。它似乎OnReadyCallback必须在 RegisterReadyEvent 函数之前声明,否则将无法编译。但是如果我在RegisterReadyEvent之前声明它,jsCallback就变成了一个空指针,它仍然不会编译。

还是有更好更合适的方法来实现同样的目标?

0 投票
1 回答
351 浏览

node.js - NAPI 插件从 .node 文件中抛出“未定义的符号:omp_get_max_threads”

这似乎是一个奇怪的错误。我尝试逐行调试本机代码,但这个错误似乎突然发生,就像在函数调用结束时一样。这似乎是由我正在使用的本机库中的某些代码部分引起的,因为如果我删除一些函数调用,这个错误似乎消失了。

节点版本:12.16.3 节点gyp版本:6.1.0

顺便说一句,我正在使用 nvm。如果这有帮助。

在搜索了 omp_get_max_threads 之后,我尝试将 -fopenmp 添加到 binding.gyp 文件中的编译器标志中,就像这样。

尽管如此,问题仍然存在。顺便说一句,我使用的是 node-addon-api 包,而不是直接使用 n-api。

0 投票
1 回答
1489 浏览

javascript - 如何使用返回 Promises 的 NAPI 创建异步函数

我正在尝试使用 NAPI 创建节点模块。我必须创建返回承诺的异步函数。我不希望 testasynfunction 会阻塞 NodeJS 事件循环。do_something_asynchronous 是一个同步函数。

问题:1)我怎样才能异步运行 do_something_synchronous 以便 nodejs 事件循环不会被阻塞并返回承诺?