问题标签 [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.
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
直接使用
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++ 代码:
这是节点部分:
我的问题
- 夏普输出一个缓冲区而不是一个数组,但是
ArrayBuffer
我Array
无法获得工作代码。编译没问题,但是当我在节点中执行它时,我得到了
错误:D:\temp\testSCB\index.js:30:34 处的参数无效
这是这行代码const result = HelloWorld.Test(testArr, smin, smax);)
- 如果我更改
redArray[i] = inputArray[i * 3];
为redArray[i] = ~(inputArray[i * 3]);
反转颜色,则会出现两个错误:
错误 C2675:一元“~”:“Napi::Value”未定义此运算符或转换为预定义运算符可接受的类型
和
错误 C2088:“~”:类非法
我的问题
实现我的 c-Function 以从 node.js 工作的正确方法是什么?
谢谢你的帮助!
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中添加测试指令:
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
.
我该如何解决?
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 并重新安装了所有软件包,但没有区别。
node.js - 为什么 N-API 在使用 napi_property_descriptor 数组时找不到某些绑定?
我有以下代码...
当我运行 hello world 部分工作正常但前进和停止功能失败...
TypeError:bindings.forward 不是函数
我对 C 开发很陌生,不明白如何找到错误。为什么 hello world 函数工作正常但 forward 函数失败?
node.js - 添加节点 NAPI 函数作为回调到本机库
是否可以将javascript函数作为回调添加到通过NAPI接受回调的本机库?
这是我到目前为止的一个示例插件代码。
问题是声明的顺序。它似乎OnReadyCallback
必须在 RegisterReadyEvent 函数之前声明,否则将无法编译。但是如果我在RegisterReadyEvent之前声明它,jsCallback就变成了一个空指针,它仍然不会编译。
还是有更好更合适的方法来实现同样的目标?
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。
javascript - 如何使用返回 Promises 的 NAPI 创建异步函数
我正在尝试使用 NAPI 创建节点模块。我必须创建返回承诺的异步函数。我不希望 testasynfunction 会阻塞 NodeJS 事件循环。do_something_asynchronous 是一个同步函数。
问题:1)我怎样才能异步运行 do_something_synchronous 以便 nodejs 事件循环不会被阻塞并返回承诺?