问题标签 [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 投票
0 回答
152 浏览

javascript - C++ Lambda 函数中的 NAPI 调用 Emit

我正在开发一个 N-API 插件,以使用windows 图形捕获API 捕获视频帧,提取帧字节并将其发送回 JavaScript。我已经尝试了事件发射器,但我无法获取数据。

这是我的 C++ 代码:

这里我的 JavaScript 代码调用了开始捕获函数

通常我的输出应该是数据消息的无限循环,直到我停止它

开始记录……数据数据。. . 数据

在查看了 lambda 函数framePool.FrameArrived之后,如果我正确理解 lambda 函数概念,它似乎在与startCapture函数不同的线程上运行,我只想找到一种方法来了解如何使用事件发射器将这些消息流式传输到 JavaScript 或任何其他建议都非常受欢迎。

0 投票
0 回答
277 浏览

linker - 如何使用 node-gyp 链接和打包外部库用于电子

我使用 N-API ( node-addon-api ) 创建了一个本机 OCR 模块,并绑定到 tesseract OCR。

我的目的是让原生 OCR 在电子下工作。我基本上检查了所有与 OCR 相关的 npm 包,它们都不适用于电子。这是我自己的基于电子的测试项目,它使用了我的 node-native-ocr 模块: https ://github.com/stoefln/electron-ocr

我的问题:捆绑电子时,我无法打包所有依赖项。或者我这样做的方式似乎有问题,因为我目前在生产中运行电子项目时遇到此错误:

dyld:找不到符号:_fmemopen 引用自:/Volumes/Shared Folders/Downloads/Electron OCR.app/Contents/Resources/app/node_modules/node-native-ocr/build/Release/dependencies/liblept.5.dylib 预期在:/usr/lib/libSystem.B.dylib

我目前尝试打包的方式:生成的 .node 文件取决于 tesseract(用 brew 构建),它取决于系统上安装的许多其他库。我想出的是一个脚本,它递归地读取依赖项 ( otool -l),将它们复制到 .node 文件夹并更改链接 ( install_name_tool -change ...) 以指向复制的 dylib 文件。

我什至不确定这是否是正确的做法。node-gyp 链接器不应该负责链接和打包所有内容吗?这是有人问基本相同的问题:https ://github.com/nodejs/node-gyp/issues/2258


如果您想重现我的问题,请提供更多信息

  1. npm run export-mac
  2. 将 .app 文件复制到其他机器,以确保它不使用系统中的库,而仅使用打包的库。
  3. 通过命令行启动应用程序(否则您将看不到错误):./your_path_to_the_app_file/Electron\ OCR.app/Contents/MacOS/Electron\ OCR
  4. 单击 UI 中的单个按钮并检查终端输出
0 投票
1 回答
91 浏览

c++ - 来自本机 C++ 代码的节点 js 回调抛出错误

我正在尝试实现事件侦听器。Node js 将订阅事件(使用 C++ 函数)。当事件发生时,C++ 应该通知节点 js。

JS代码:

C++ 代码:

C++ 代码在编译时抛出错误

任何人都可以帮我解决如何解决将节点函数 env 存储到 C++ 映射中的问题。我需要保存环境,以便在调用节点回调时发送响应。

0 投票
1 回答
123 浏览

node.js - 当从异步 N-API 插件的 `napi_async_complete_callback` 调用时,`napi_throw_error` 会做什么?

我最近完成了为纯 C API 中的所有函数制作异步版本,用 N-API 包装以与 JS/TS 作为 nodejs 插件一起使用。

我必须解决的最后一个问题是确保在 worker 执行结束时将 C POSIX 样式的错误(即返回的整数代码)正确传输到 JS(使用相应的字符串,我们都有一个枚举异常和错误消息列表)。

当被抛出时napi_throw_error(就像我对所有调用的同步版本所做的那样),在 中napi_async_complete_callback,这些异常从未在 JS 级别被捕获(我想这是因为它在不同的异步上下文中;我看到网上的人有类似的ajax 的问题)。相反,我选择将我的错误构造为napi_value类型,并通过 napi_reject_deferred. 这似乎具有预期的效果,即在执行try { await My_NapiWrapper_XYZ() } catch (ex) { ... }.

所以我真的没有要解决的问题,但我很感兴趣。这些napi_throw_error抛出的错误可能会去某个地方。虽然我不知道在哪里。napi_throw_error应该在哪里寻找从 a引发的错误napi_async_complete_callback?你能给出一个代码示例吗?

0 投票
0 回答
239 浏览

node.js - 未定义的对“napi_create_function”的引用,使用 cmake 编译

我正在尝试编译用 c++ 编写的机器学习代码并使用 n-api 将其连接到 NodeJS,我在其中一个文件中编写了 NAPI 函数,并在 CMake 中定义了其他依赖项。

安装
'node-addon-api': '^3.0.0'
'cmake-js':'^6.1.0'

错误

CMakeLists.txt

主文件(program.cpp) 我注释了一些函数,同样的问题也出现在其他函数上。

0 投票
1 回答
48 浏览

c++ - 从具有参数 const int16_t *bar 但得到错误未绑定类型的 NodeJS 调用 cpp 函数

我正在尝试从 NodeJS 调用 CPP 函数

我在 NodeJS 中尝试过 nbind 库。但得到未绑定的类型错误。

我也尝试过 ffi-napi npm 模块。但从那我得到分段错误错误。任何人都可以帮助我如何从 NodeJS 代码传递正确的参数。我不确定如何在 NodeJS 中创建类似的结构-

0 投票
1 回答
150 浏览

c++ - NodeJS插件构建错误C3861:'_alloca':找不到标识符

尝试使用 boost 构建简单的节点插件时,编译器失败并出现此错误

我已经使用 Yeoman Generator 设置了项目:https ://www.npmjs.com/package/generator-napi-module#installation 。该构建适用于生成的代码。我用我的函数替换了生成的代码。

源代码:

nativesimple.cc

binding.gyp

搭建环境:

  • 操作系统:Windows 10
  • 视觉工作室:2019

我尝试在 Visual Studio 2019 上构建与 c++ 项目相同的代码,并且构建成功。我应该如何去解决这个问题?我认为这应该是node-gyp.

0 投票
1 回答
126 浏览

node.js - 如何从 napi 本机代码调用 nodejs 异步函数并等待异步承诺解决

我正在尝试从 c++ 调用 nodejs 异步函数,该函数返回一个承诺,稍后将使用 napi 实现

我想等到诺言完成,然后用已解决的值而不是诺言的句柄来填写 napiStatus。有没有办法做到这一点?当函数不是异步的并且只是返回一个值但我目前的要求不允许我这样做时,我已经让它工作了。

这是我要调用的 JS 中的示例函数

我希望 napiStatus 是 1 的解析值(在 napi 转换之后)。

0 投票
1 回答
25 浏览

node.js - 使用 N-API 进行资源共享?

我想知道是否可以使用 N-API 让工作线程访问另一个工作线程创建的对象。虽然我不需要并发访问,但我目前通过序列化和反序列化来传输数据。但是,我的数据很大(JSON.stringify().length() 返回大约 50000000),所以我浪费了很多时间。我知道存在共享字节数组,但是将我的对象序列化成这些需要相同的时间。N-API 是否让我有可能让 thread2 访问 thread1 以低开销创建的对象?

0 投票
1 回答
41 浏览

node.js - 节点插件在电子中不起作用,但在 nodejs 中起作用

我写了一个 nodejs 插件,用 node-gyp 编译。它不适用于电子,但 nodejs 工作。nodejs 和 electron 节点版本相同。

插件做这些事情:

  1. 加载 ffmpeg 静态库并打开一个 rtsp 或本地文件。
  2. 将帧转换为 rgba 颜色到 arraybuffer 并调用电子的主进程。
  3. 渲染器进程处理数据事件并将数据渲染到画布元素。

在电子中,以下代码总是返回Protol not found

节点gyp配置: