问题标签 [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 回答
236 浏览

c++ - 存储稍后在 Node C++ 插件中调用的 JS 回调

我正在为 macOS 创建一个 Node C++ 插件,因此我将 Objective-C 与 C++ 和 Node Addon API 混合使用。

我想为 Node JS 提供一个函数,该函数接收一个回调,以便稍后在调用 Obj-C 观察者时调用。这就是我试图实现这一目标的方式:

我创建了一个JSCallback类来保存触发 JS 回调函数所需的变量。然后将其作为inClientDatafor传递AudioObjectAddPropertyListener

然后当audioOutputDeviceChanged被调用时,我尝试使用我存储的变量来触发 JS 回调。但是,当我这样做时,JS 脚本崩溃,并且只打印以下内容(无堆栈跟踪):

我认为这可能会发生,因为当setOnAudioOutputDeviceChange返回时,它会释放(或类似的东西)变量(上下文、cb 和隔离)。因此它们在函数之外无法使用。我怎样才能解决这个问题?

如果需要,这是我使用插件的 JS 代码:

这是我的binding.gyp文件,尽管我怀疑它是相关的:

0 投票
1 回答
23 浏览

npm - 安装的包有过期的头文件

安装了 node-addon-api 包,我一直在使用这些头文件进行编译。但是我去利用一个功能,我的插件无法编译;标题中缺少该符号。在与他们的 github 存储库中的头文件进行比较之后,很明显安装的不是当前的。

一切的文件日期(在 Windows 安装上)显示为 1985 年 10 月 26 日,但我不知道这是否是 npm 只是在它写出文件时没有得到正确的日期,或者什么。

我需要做什么才能获得当前版本?npm 报告 v.3.0.2 已安装,但即使在删除目录并让 npm 再次获取它之后,文件也已过期。

0 投票
1 回答
320 浏览

c++ - 如何将 libnode.a 链接到 linux 中的共享库

我正在将大型 C++ 代码从 Windows 移植到 linux。一部分由一些包含节点插件的共享库组成。我的代码编译得很好,但是在链接到 node.js 时出现了数千个错误。

我重新编译了节点,在 common.gypi 文件中添加了 -fPIC 标志。在发布部分我添加了

我链接到 cmake 文件中的节点:

我这样做是因为我将静态节点库链接到共享库。就像我说的那样,找到了标头并且一切都编译得很好,但是在链接时我得到了所有类型的错误,这些错误涉及到缺少 v8 组件,例如:

所有错误都来自属于节点的文件。node_errors.cc、js_native_api_v8.cc 等等。所有错误均涉及 v8:: 组件。

我会说我缺少另一个要链接的库,但 windows 项目只链接到节点。也许我缺少一个链接到静态库的标志?

编辑:我尝试链接到已编译的其他库(并且我希望捆绑在 libnode 中)。我得到的错误少了很多,但仍然有很多。我的 cmake 文件的一部分看起来像这样:

也许我的顺序错了,但感觉不对,这是要走的路,而 windows 构建是如此易于使用。我有一种强烈的感觉,我错过了别的东西。

0 投票
1 回答
232 浏览

c++ - 如何在线程之间传递 IUIAutomationElement

我正在用 C++ 编写一个 Node.js 原生插件(使用node-addon-api)来与Microsoft 的 UIAutomation API交互。我正在尝试收听焦点事件,包装IUIAutomationElement导致事件的事件并将包装的元素传递给 javascript。

我可以附加一个事件侦听器(按照处理焦点事件的示例),它成功接收焦点事件和IUIAutomationElement. 但是,所有 UIAutomation 事件侦听器都在单独的线程中运行

在 UI 自动化事件处理程序中进行 UI 自动化调用是安全的,因为事件处理程序总是在非 UI 线程上调用。(参见:https ://docs.microsoft.com/en-us/windows/win32/winauto/uiauto-threading )。

例如,这里我将一个 lambda 函数传递给该IUIAutomation::AddFocusChangedEventHandler方法的包装器。

为了将IUIAutomationElement返回传递给 Javascript,我需要将其传递给主线程。node-addon-api提供Napi::ThreadSafeFunction这意味着在线程之间传递变量。

注意:这info[0]是一个代表 Javascript 函数的函数参数。

问题是,虽然el有效,但现在任何函数都在passedEl抛出异常时运行。

例如:

我试过的

  1. El并且passedEl具有相同的内存地址,所以我相信IUIAutomationElement当非主线程停止时它会失效。

  2. callback.NonBlockingCall与其他变量(int, string, 自定义类)完美配合

我的问题是IUIAutomationElement在线程之间传递的正确方法是什么?

根据我的阅读,我需要阻止微软在非主线程停止时回收对象。我相信要做到这一点,我需要获取并存储对该对象的引用,但没有找到任何有关如何操作的文档。

0 投票
1 回答
477 浏览

javascript - 如何使用 node-addon-api 从 char 向量创建新缓冲区?

我正在尝试使用node-addon-apiBuffer创建一个新的vector,但生成的内容总是与. 这是我的cpp代码:charBuffervector

这是我的js代码:

结果缓冲区的内容总是不同的,为什么?如何使它正确?

0 投票
1 回答
463 浏览

c++ - 是否可以使用私有 js 构造函数在 node-addon-api 中创建一个 ObjectWrap 并且只能在 c++ 中实例化?

我目前正在使用 C++ 编写一个 node.js 插件node-addon-api (Napi)。从我在不同的文档和教程中看到的,每个对象都必须扩展Napi::ObjectWrap才能被视为 js 对象。然后可以在js中调用构造函数。但是,如果我希望这个特定对象仅由另一个对象提供并将 js 构造函数设为私有怎么办?考虑到这种情况

如何能够Napi::CallbackInfo在提供的构造函数中没有

0 投票
1 回答
73 浏览

c++ - require 语句中的 N-API 传递参数

我正在创建一个 n-api 模块,是否可以在调用 require 时传递参数?

js包装器

cpp 包装器

cpp类

0 投票
0 回答
120 浏览

node.js - 调用本机插件时电子崩溃,该插件使用窗口的 uiautomation 库来检测另一个窗口中的按钮

我有一个本地插件,可以检测缩放会议窗口并在其中找到一些按钮。
该本机插件是使用 NAPI(node-addon-api) 制作的,当我运行它时,它工作正常......(给我那个按钮名称)。

但是,当我尝试在电子中运行该本地插件时,它会使电子应用程序崩溃。

这是检测元素的本机插件 C++ 代码:

0 投票
1 回答
62 浏览

c++ - 具有集群获取进程 id 的节点插件为所有分叉进程返回相同的 id

编辑

GetCurrentProcessId() 和 getpid() 返回不同的值......但 boost 没有。

原始问题

我正在编写一个节点插件来添加一个本地本机缓存,以便在作为集群运行时与快速服务器一起使用,以拥有一个公共缓存。我message_queue在进程之间使用 boost 的 IPC,并且需要唯一标识发送请求的进程。Boost 提供boost::interprocess::ipcdetail::get_current_process_id了获取当前进程 id,但在主进程和子进程中返回相同的进程 id。我认为我说子进程也有自己的唯一 ID 是正确的。那么这里到底发生了什么:

回购(这是一个最小的可重复性):https ://github.com/t348575/cluster-mem-shared

输出

示例js测试文件

我在 c++ 返回给 js 的类的构造函数中打印这个

0 投票
1 回答
456 浏览

node.js - 从 Webpack ReactJS/ReactTS 项目导入/需要 NAPI 插件

我有一个自定义 API(目前是封闭源代码),用纯 C 构建。这个 API 是通信协议的客户端(想想基于网络的数据库查询)。我已经成功地用于node-gyp编译 C 代码包装器,以便 NAPI 插件addon.node可以通过调用 C 在 JavaScript 中运行。我还编写了一个.d.ts文件,以便该插件可以在 TypeScript 中工作。我对这两个用例都没有问题;即,执行 atsc index.ts && nodejs index.js将顺利编译和运行导入/所需的插件,并且我的 C API 的客户端操作顺利进行。我已经把这个插件变成了一个私有的 npm 包,并且一直在小型 TypeScript 项目中使用它,将它安装为node_modules依赖项,没有任何问题。

当我尝试运行需要使用此插件的 React Web 应用程序时,我的问题就出现了。我需要 React,因为我的数据查询将用于 GUI 类型的 Web 小程序(查询它们的数据,并实时更新 GUI 视图)。我使用 启动我的 React 应用程序react-scripts start,就像通​​过 webpack/create-react-app 创建的任何 React 项目一样。我不知道除了使用react-scripts-family 命令之外,是否还有其他方法可以启动 ReactJS/ReactTS 项目。如果你知道另一种选择,我会试试的。

我的错误正是:

  • 在 TypeScript 方面:Module not found: Can't resolve '@my-company/my_package/addon' in '/path/to/typescript/srcdirectory'当我尝试为正确的路径导入/需要插件时出现错误。是的,我绝对确定我的路径是正确的(在package.json“路径”和调用源中);在同一依赖目录中的其他(正常.ts)文件可以从相同的.tsx.ts源中找到并使用相同的路径(和它们自己的文件名)导入。addonaddon.node请注意,.ts使用tsc. 在处理 TypeScript 转换时,它是addon.node由 that 生成的node-gyp,根本无法识别。react-scripts start

  • 在 JavaScript 方面:我还尝试首先使用 为我的 TS 源生成相应的 JS 文件tsc,并“要求”我的插件;然后启动react-scripts。对于生成的 JS 中的路径var api = require("@my-company/my_package/addon");,我得到相同的“未找到模块”错误。因为var api = require("@my-company/my_package/addon.node");,插件被识别,但是,当我到达api.MyFunction()任何函数的任何行时,JS 失败,带有TypeError: api.MyFunction is not a function.

我在 SO 上找到了以下问题,这似乎与我的有关:如何在 React 中使用本机 node.js 插件;但它没有得到答复,并且可能不会出于与我完全相同的原因而发生。

我的问题是:用 编译 NAPI 插件node-gyp、使用特定结构为 npm 打包并从 React JS/TS 项目导入它以便导入工作的适当方法是什么?是否应该验证插件或 React 项目中的某些特定约束,package.json以便能够顺利工作?我不确定很多人是否有过这种用例的经验(从原始 C 到 ReactTS);但是肯定会有一些 NAPI 插件很有名,可以在一些 React 项目中使用:即使是指向它的链接也可能对我有用。

您提供的任何链接、想法或建议将不胜感激。感谢您的时间。

编辑:经过大量的实验和文档阅读,我现在确信问题源于 webpack,并且需要使用externalsinwebpack.config.js来解决我如何以某种方式导入插件。两者的语法是什么webpack.config.js,应该如何在我的文件中导入这个“外部”库.tsx?使用特定的 Webpack 配置时,我的 package.json 有什么特别之处吗?