问题标签 [node-addon-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 投票
1 回答
329 浏览

c++ - 如何将带有缓冲区的对象从插件发送到节点线程安全?

0 投票
1 回答
884 浏览

c++ - 从 shared_ptr 获取原始指针以将其传递给需要原始的函数

好的,首先我对 C++ 很陌生,如果我的理解很差,我深表歉意。我会尽力解释自己。我所拥有的是我正在使用一个返回 a 的库函数,std::shared_ptr<SomeObject>然后我有一个不同的库函数,它接受一个原始指针参数(更具体地说是 node-addon-apiNapi::External<T>::New(Napi::Env env, T *data)静态函数)。我想Napi::External使用我的 std::shared_ptr 创建一个对象。我目前正在做的是这样的:

但我担心这会遇到内存问题。我的 pSomeObject 只存在于当前范围内,所以我想在返回之后应该发生什么,它的引用计数将下降到 0 并且它指向的 SomeObject 实例将被销毁,因此我会遇到我返回的实例的问题使用这个对象。但是,我已经能够从我的实例中运行此代码并在 SomeObject 上调用函数,所以我想我的理解可能是错误的。

我的问题是当给定一个共享指针但由于其他第三方库的要求我需要处理一个原始指针时我应该怎么做?向我提出的一个选项是制作对象的深层副本并创建指向该对象的指针

如果我对此的任何理解是错误的,请纠正我,因为我说我对 C++ 很陌生。

==============================

编辑:

因此,我的原始帖子信息中缺少有关所有权以及该块到底是什么的信息。该块是我对实例的实现的实例方法Napi::ObjectWrap。此实例方法需要返回一个Napi::Object可供 node.js 中的调用者使用的对象。我正在使用Napi::External,因为我需要在创建 I 返回时将子类型传递Napi::Value给构造函数,并且我需要在构造函数中提取的外部包装对象,如下所示:NewNapi:ObjectSomeObjectMyNapiObjectWrapper

从那以后我意识到我可以在创建外部时传递共享指针的地址并按如下方式使用它

所以现在我传递一个指向 shared_ptr 的指针来创建我的Napi::External,我现在的问题是这样可以吗?就像我在开始时所说的那样,我是 C++ 新手,但这似乎有点异味。但是我通过一些调试对其进行了测试,并且可以看到引用计数上升,所以我想我很清楚???

0 投票
0 回答
151 浏览

c++ - 从 node.js 本机插件工作池线程创建 napi_value

是否可以从 node.js(本机)工作线程创建napi_value并与主线程共享该值。

例如:

然后从“Execute()”函数(将由工作池线程执行)构造一个napi_value 。 例如:

0 投票
1 回答
575 浏览

javascript - 使用 node-addon-api 将 C 库回调传递给 NodeJS EventEmitter

我目前正在编写一个节点模块,该模块使用Node-Addon-API绑定 Alex Diner 的跨平台游戏手柄代码

在大多数情况下,这是一项相当容易的任务。唯一有问题的是 Gamepad 库的回调函数。

我的想法是通过.on(...)使模块成为 EventEmitter 来公开这些回调。该节点模块中的Nan 模块已经以类似的方式完成。

问题是,每当从我的本机模块触发事件时,我都会收到以下错误:

我的重要部分binding.cc

并将index.jsC++ 模块与 EventEmitter 连接起来:

如果需要更多信息,请随时询问!

提前致谢!:)

0 投票
3 回答
545 浏览

c++ - 使用自定义nodejs插件时“找不到指定的模块”

我正在编写一个依赖于 OpenGL ( glfw) 的 nodejs 插件。它编译成功,但是当我尝试在节点中使用它时,我得到了错误The specified module could not be found

这是插件 C++ 代码的问题部分:

在插件中使用这个,它可以编译但会导致节点中的错误。没有它,它可以毫无问题地编译和运行。

这是我的 binding.gyp:

以及插件文件结构:

编辑:新的 binding.gyp:

0 投票
1 回答
4350 浏览

node.js - 本地原生节点模块导致错误:未捕获的错误:未找到平台=win32 arch=x64 runtime=electron abi=75 uv=1 libc=glibc 的原生构建

我有一个本地节点插件,我写了我正在尝试添加到电子应用程序中。我npm install /path/to/addon用来安装插件。然后electron-rebuildelectron-build,不抱怨。

但是当我运行时npm start,在开发控制台中出现以下错误:

我在网上找不到太多关于这个错误的信息。我尝试重新编译所有内容,尝试以 Electron 为目标重建插件,但没有任何帮助。为什么会发生此错误,我该如何补救?

0 投票
1 回答
333 浏览

javascript - napi 中的字符串返回限制

我想使用 napi (node-addon-api) 将一些 C++ 代码移植到 js。该代码是一个返回字符串的搜索处理程序。所以我想知道 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 投票
1 回答
410 浏览

c++ - 如何使用 node-addon-api 实现 node-nan 回调

到目前为止,我只实现了同步的 node-addon-api 方法,即一个 JavaScript 函数进行调用,工作完成,然后插件返回。关于 v8、libuv 和 node 的内部工作原理,我有很大的知识空白,所以请纠正任何明显的误解。

目标是在从 v8 调用 C++ 垃圾回收回调时调用 JavaScript 回调。我最初只是从 v8 垃圾收集回调中调用了 JavaScript 回调,但在几次调用后最终得到了一个 segv。似乎只是在从 v8 回调调用时调用 JavaScript 有一些问题(v8 文档回调不应该分配对象)。所以我环顾四周,发现了一个基于 Nan 的示例,它使用libuv和 NanAsyncResource进行回调。以下方法使用node-nan

我的问题是如何使用 node-addon-api 而不是 nan 来做到这一点?

我不清楚 node-addon-api 等价的uv_async_init,uv_async_send等是什么。这部分是因为我不清楚需要哪些底层N-API(而不是node-addon-api)功能。

我一直找不到这样的例子。回调示例是完全同步的。async pi 示例使用工作线程来执行任务,但与使用原语的基于 nan 的代码中的方法相比,这似乎有点过头了uv

0 投票
1 回答
279 浏览

c++ - 调用 Napi::ThreadSafeFunction::Release() 导致 ELIFECYCLE 3221225477 (STATUS_ACCESS_VIOLATION)

标题中提到我有一些奇怪的线程问题。

基本上我在链接示例中使用node-addon-api包装PS2000 Api 。

由于这些 api 回调需要“C”之类的函数,我用类似的东西来蹦床:

void my_get_overview_buffers

api函数ps2000_get_streaming_last_values可以多次调用callback,callback的数量可以通过**overviewBuffers( nValues)的长度来估计。

当我离开时tsfn.Release()没有错误。

使用时也会返回napi_ok

感觉就像有某种迟到的回调到空虚 - 但只有当线程被释放时......

我不知所措-有人有想法吗?


等待!

*buffers传入的 memcpied 会发生什么jsCallback.Call({Napi::ArrayBuffer::New(env, *buffer, size)})

这是访问冲突吗?那么你如何在不发布 tsfn 的情况下解决这个问题?


我在 VSCODE 中的 Windows 上工作,

我的启动 json 包含:

但调试器没有触发......