问题标签 [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.
c++ - 存储稍后在 Node C++ 插件中调用的 JS 回调
我正在为 macOS 创建一个 Node C++ 插件,因此我将 Objective-C 与 C++ 和 Node Addon API 混合使用。
我想为 Node JS 提供一个函数,该函数接收一个回调,以便稍后在调用 Obj-C 观察者时调用。这就是我试图实现这一目标的方式:
我创建了一个JSCallback
类来保存触发 JS 回调函数所需的变量。然后将其作为inClientData
for传递AudioObjectAddPropertyListener
。
然后当audioOutputDeviceChanged
被调用时,我尝试使用我存储的变量来触发 JS 回调。但是,当我这样做时,JS 脚本崩溃,并且只打印以下内容(无堆栈跟踪):
我认为这可能会发生,因为当setOnAudioOutputDeviceChange
返回时,它会释放(或类似的东西)变量(上下文、cb 和隔离)。因此它们在函数之外无法使用。我怎样才能解决这个问题?
如果需要,这是我使用插件的 JS 代码:
这是我的binding.gyp
文件,尽管我怀疑它是相关的:
npm - 安装的包有过期的头文件
安装了 node-addon-api 包,我一直在使用这些头文件进行编译。但是我去利用一个功能,我的插件无法编译;标题中缺少该符号。在与他们的 github 存储库中的头文件进行比较之后,很明显安装的不是当前的。
一切的文件日期(在 Windows 安装上)显示为 1985 年 10 月 26 日,但我不知道这是否是 npm 只是在它写出文件时没有得到正确的日期,或者什么。
我需要做什么才能获得当前版本?npm 报告 v.3.0.2 已安装,但即使在删除目录并让 npm 再次获取它之后,文件也已过期。
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 构建是如此易于使用。我有一种强烈的感觉,我错过了别的东西。
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
抛出异常时运行。
例如:
我试过的
El
并且passedEl
具有相同的内存地址,所以我相信IUIAutomationElement
当非主线程停止时它会失效。callback.NonBlockingCall
与其他变量(int
,string
, 自定义类)完美配合
我的问题是IUIAutomationElement
在线程之间传递的正确方法是什么?
根据我的阅读,我需要阻止微软在非主线程停止时回收对象。我相信要做到这一点,我需要获取并存储对该对象的引用,但没有找到任何有关如何操作的文档。
javascript - 如何使用 node-addon-api 从 char 向量创建新缓冲区?
我正在尝试使用node-addon-apiBuffer
创建一个新的vector
,但生成的内容总是与. 这是我的cpp代码:char
Buffer
vector
这是我的js代码:
结果缓冲区的内容总是不同的,为什么?如何使它正确?
c++ - 是否可以使用私有 js 构造函数在 node-addon-api 中创建一个 ObjectWrap 并且只能在 c++ 中实例化?
我目前正在使用 C++ 编写一个 node.js 插件node-addon-api (Napi)
。从我在不同的文档和教程中看到的,每个对象都必须扩展Napi::ObjectWrap
才能被视为 js 对象。然后可以在js中调用构造函数。但是,如果我希望这个特定对象仅由另一个对象提供并将 js 构造函数设为私有怎么办?考虑到这种情况
如何能够Napi::CallbackInfo
在提供的构造函数中没有
c++ - require 语句中的 N-API 传递参数
我正在创建一个 n-api 模块,是否可以在调用 require 时传递参数?
js包装器
cpp 包装器
cpp类
node.js - 调用本机插件时电子崩溃,该插件使用窗口的 uiautomation 库来检测另一个窗口中的按钮
我有一个本地插件,可以检测缩放会议窗口并在其中找到一些按钮。
该本机插件是使用 NAPI(node-addon-api) 制作的,当我运行它时,它工作正常......(给我那个按钮名称)。
但是,当我尝试在电子中运行该本地插件时,它会使电子应用程序崩溃。
这是检测元素的本机插件 C++ 代码:
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 的类的构造函数中打印这个
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
源中找到并使用相同的路径(和它们自己的文件名)导入。addon
另addon.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,并且需要使用externals
inwebpack.config.js
来解决我如何以某种方式导入插件。两者的语法是什么webpack.config.js
,应该如何在我的文件中导入这个“外部”库.tsx
?使用特定的 Webpack 配置时,我的 package.json 有什么特别之处吗?