electron node-api addon开发
解决方案入口
拷贝日志以及json等第三方源码
增加包含目录
编写接口
默认模板已经有一个回调函数了
照葫芦画瓢就行
其中几个重要的点要注意
1.参数传入
比如如下的例子:
头文件定义:
public:下增加
Napi::Value StartAnswer (const Napi::CallbackInfo&);
在VcansNodeApi::GetClass 中定义注册函数。
VNodeApi::InstanceMethod("StartAnswer" , &VNodeApi::StartAnswer ),
编写NAPI函数, 这里面的VNodeApi::DeviceCallBackNotify是定义的静态回调函数指针。一开始不用关注这个。
info[0].AsNapi::Number();这个就是指针取值的方式。
Napi::Value VNodeApi::StartAnswer(const Napi::CallbackInfo& info)
{spdlog::info("{} :: Function Enter.", __FUNCTION__);Napi::Env env = info.Env();bool bret = true;int p1 = info[0].As<Napi::Number>();string p2 = info[1].As<Napi::String>().Utf8Value();HRET ret = m_ans_question->StartAnswer(p1, p2, VNodeApi::DeviceCallBackNotify);if (HR_OK != ret) {spdlog::error("{} :: StartAnswer ret 0x{:08x}.", __FUNCTION__, ret);bret = false;}isAnsing = true;spdlog::info("{} :: Function Leave.", __FUNCTION__);return Napi::Boolean::New(env, bret);
}
2.参数传出
直接return 一个Napi的对象就行。
return Napi::Boolean::New(env, bret);
return Napi::String::New(env, str_res);
3.函数指针传入作为回调
这是一个函数指针回调的方式,外部通过这个注册函数将函数指针传入。将函数指针创建为一个线程安全的napi线程回调函数对象。赋值给一个全局的或者类静态变量,以供后续静态函数回调访问。
Napi::ThreadSafeFunction threadSafeCallback;
Napi::Value VNodeApi::SetCallBack(const Napi::CallbackInfo& info)
{Napi::Env env = info.Env();if (info.Length() < 1) {throw Napi::Error::New(env, "Missing argument");}if (!info[0].IsFunction()) {throw Napi::TypeError::New(env, "Wrong argument type");}Napi::Function napiFunction = info[0].As<Napi::Function>();threadSafeCallback =Napi::ThreadSafeFunction::New(env, napiFunction, "Callback", 0, 1);return Napi::String::New(env, "Done");
}
4.调用js函数
函数指针创建为全局线程安全后就可以直接使用了。这时候不分线程内线程外等逻辑。都可以直接调用。调用方式如下:
其中注意如下的内容: 回调传入的参数是在匿名函数中定义的,所以要与外部SetCallback传入的函数参数格式以及类型一致。
std::string msg = "hello node-api";
// callback param
auto callback = [msg](Napi::Env env, Napi::Function jsCallback) {
Napi::String napiMessageString = Napi::String::New(env, msg);
jsCallback.Call({ napiMessageString });
}
threadSafeCallback.NonBlockingCall(callback);
编译
可以直接使用npm install 进行触发重新编译,会解析binding.gyp之后进行重新生成makefile
npm install
相关文章:
electron node-api addon开发
解决方案入口 拷贝日志以及json等第三方源码 增加包含目录 编写接口 默认模板已经有一个回调函数了 照葫芦画瓢就行 其中几个重要的点要注意 1.参数传入 比如如下的例子: 头文件定义: public:下增加 Napi::Value StartAnswer (const Napi::Callb…...
如何在嵌入式系统或计算机系统中验证boot程序
在嵌入式系统或计算机系统中,验证boot程序(引导程序)的正确性至关重要,因为它负责初始化系统硬件、加载操作系统内核,并设置系统环境。以下是一些常用的验证boot程序的方法: 一、硬件验证 示波器与逻辑分…...
scala基础学习_运算符
文章目录 scala运算符算术运算符关系运算符逻辑运算符位运算符其他运算符赋值运算符 scala运算符 在 Scala 中,运算符通常被定义为方法。这意味着你可以将运算符视为对象上的方法调用。以下是一些常用的运算符及其对应的操作: 算术运算符 :…...
【ANGULAR网站开发】初始环境搭建
1. 初始化angular项目 1.1 创建angular项目 需要安装npm和nodejs,这边不在重新安装 直接安装最新版本的angular npm install -g angular/cli安装指定大版本的angular npm install -g angular/cli181.2 启动angular 使用idea启动 控制台启动 ng serve启动成功…...
【Java】面试题 并发安全 (2)
文章目录 可重入锁(ReentrantLock)知识总结1. 可重入锁概念与特点2. 基本语法与使用注意事项3. 底层实现原理4. 面试回答要点 synchronized与lock的区别死锁相关面试题讲解死锁产生的四个条件ConcurrentHashMap2. JDK1.7的ConcurrentHashMap结构添加数据…...
springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失
这个包丢失了 启动不了 起因是pom中加入了 <tomcat.version></tomcat.version>版本指定,然后idea自动编译后,包丢了,删除这个配置后再也找不回来, 这个包正常在 <dependency><groupId>org.springframe…...
React 组件的通信方式
在 React 应用开发中,组件之间的通信是构建复杂用户界面和交互逻辑的关键。正确地实现组件通信能够让我们的应用更加灵活和易于维护。以下是几种常见的 React组件通信方式。 一、父子组件通信 1. 通过 props 传递数据(父组件向子组件传递数据࿰…...
WAV文件双轨PCM格式详细说明及C语言解析示例
WAV文件双轨PCM格式详细说明及C语言解析示例 一、WAV文件双轨PCM格式详细说明1. WAV文件基本结构2. PCM编码方式3. 双轨PCM格式详细说明二、C语言解析WAV文件的代码示例代码说明一、WAV文件双轨PCM格式详细说明 WAV文件是一种用于存储未压缩音频数据的文件格式,广泛应用于音频…...
【ES6复习笔记】数值扩展(16)
介绍 在 JavaScript 中,数值扩展提供了一些额外的功能,使得处理数值变得更加方便。本教程将介绍一些常用的数值扩展方法和属性。 1. Number.EPSILON Number.EPSILON 是 JavaScript 表示的最小精度。它的值接近于 2.2204460492503130808472633361816E-…...
百度热力图数据日期如何选择
目录 1、看日历2、看天气 根据研究内容定,一般如果研究城市活力的话,通常会写“非重大节假日,非重大活动,非极端天气等”。南方晴天不多,有小雨或者中雨都可认为没有影响,要不然在南方很难找到完全一周没有…...
Vue.js 高级组件开发:设计模式与实践
Vue.js 高级组件开发:设计模式与实践 引言一、组合式 API 与动态依赖注入1. 基于 provide/inject 的动态依赖2. 动态依赖注入与懒加载 二、动态渲染与自定义渲染函数1. 使用 Render 函数动态生成内容2. 自定义 vnode 操作 三、复杂场景下的动态表单生成与验证四、高…...
《一文读懂卷积网络CNN:原理、模型与应用全解析》
《一文读懂卷积网络CNN:原理、模型与应用全解析》 一、CNN 基本原理大揭秘(一)从人类视觉到 CNN 灵感(二)核心组件详解 二、经典 CNN 模型巡礼(一)LeNet-5:开山鼻祖(二&a…...
MONI后台管理系统-数据敏感字段存储加密
前言: 在我们数据库中,存在很多的敏感数据,如用户表中,存在用户电话、身份证号、邮箱等属于用户的敏感信息,我们通常在存入数据库后,将其进行加密存储,以此来保证数据安全性。 …...
熟悉各类游戏设计模式的用途与限制,如 factory、strategy、mvc、object pool 等
良好的系统分析与设计能力要求开发者熟悉并正确运用各种设计模式来解决特定问题。设计模式是一种针对特定问题的通用解决方案,可提高代码的可复用性、可维护性和可扩展性。以下是对一些常见游戏设计模式的详细分析,包括其用途、限制和代码示例。 一、工厂…...
【RabbitMQ高级篇】消息可靠性问题(1)
目录 1.消息可靠性 1.1.生产者消息确认 1.1.1.修改配置 1.1.2.定义Return回调 1.1.3.定义ConfirmCallback 1.2.消息持久化 1.2.1.交换机持久化 1.2.2.队列持久化 1.2.3.消息持久化 1.3.消费者消息确认 1.3.1.演示none模式 1.3.2.演示auto模式 1.4.消费失败重试机制…...
ASP.NET |日常开发中常见问题归纳讲解
ASP.NET |日常开发中常见问题归纳讲解 前言一、性能问题1.1 数据库访问性能1.2 视图状态(在ASP.NET Web Forms 中) 二、安全问题2.1 SQL 注入2.2 跨站脚本攻击(XSS) 三、状态管理问题3.1 会话状态(Session …...
【【深入浅出TinyRisc-v】】
深入浅出TinyRisc-v 本代码参考于 https://gitee.com/liangkangnan/tinyriscv 自己理解之后又重新写了一遍 tinyriscv.v // 涓嬮潰鏄鏁翠釜top妯″潡鐨勪功鍐? module tinyriscv(input clk ,input rst_n …...
常见的限流算法
常见的限流算法 限流的定义固定窗口算法滑动窗口算法漏桶算法(推荐)令牌桶算法(推荐)限流粒度本地限流(单机限流)分布式限流(多机限流)分布式限流的实现 限流的定义 限流,也称流量控制。是指系统…...
【Leetcode 每日一题】3159. 查询数组中元素的出现位置
问题背景 给你一个整数数组 n u m s nums nums,一个整数数组 q u e r i e s queries queries 和一个整数 x x x。 对于每个查询 q u e r i e s [ i ] queries[i] queries[i],你需要找到 n u m s nums nums 中第 q u e r i e s [ i ] queries[i] q…...
xadmin后台首页增加一个导入数据按钮
xadmin后台首页增加一个导入数据按钮 效果 流程 1、在添加小组件中添加一个html页面 2、写入html代码 3、在urls.py添加导入数据路由 4、在views.py中添加响应函数html代码 <!DOCTYPE html> <html lang...
UniHacker技术探索:Unity引擎全功能体验与开源研究指南
UniHacker技术探索:Unity引擎全功能体验与开源研究指南 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker 一、核心价值解析:技术研究视…...
通达信缠论画线主图实战:手把手教你5分钟搞定中枢识别与趋势线绘制
通达信缠论画线实战指南:5分钟掌握中枢识别与趋势线绘制技巧 在股票技术分析领域,缠论因其独特的结构思维和实战价值备受投资者青睐。而通达信作为国内主流证券分析软件,其内置的画线工具与缠论理论结合,能够帮助投资者快速识别关…...
中国象棋AlphaZero:零基础构建超越人类棋力的AI对战系统
中国象棋AlphaZero:零基础构建超越人类棋力的AI对战系统 【免费下载链接】ChineseChess-AlphaZero Implement AlphaZero/AlphaGo Zero methods on Chinese chess. 项目地址: https://gitcode.com/gh_mirrors/ch/ChineseChess-AlphaZero 中国象棋AlphaZero是一…...
Switch大气层系统高级配置实战:5个专业技巧打造安全高效的自定义环境
Switch大气层系统高级配置实战:5个专业技巧打造安全高效的自定义环境 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 大气层(Atmosphere)作为任天堂Swit…...
5分钟搞定AI超清画质增强:镜像部署与使用全攻略
5分钟搞定AI超清画质增强:镜像部署与使用全攻略 1. 引言:为什么需要AI画质增强 1.1 低清图像的普遍困扰 我们每天都会遇到各种低质量图片:模糊的老照片、压缩过度的网络图片、分辨率不足的截图。传统放大方法就像简单拉伸橡皮筋࿰…...
手把手教你用Gemini 3和MediaPipe,为你的网页添加“隔空操控”魔法(附完整代码)
从零构建手势操控3D粒子系统:MediaPipe与Three.js深度整合指南 当我们在科幻电影中看到主角挥挥手就能操控全息界面时,总会心生向往。如今,借助MediaPipe的手势识别能力和Three.js的3D渲染技术,开发者完全可以在网页中实现这种&qu…...
LFM2.5-1.2B-Thinking多模态扩展展示:结合视觉模型的图文理解能力
LFM2.5-1.2B-Thinking多模态扩展展示:结合视觉模型的图文理解能力 1. 多模态能力惊艳亮相 LFM2.5-1.2B-Thinking最近在多模态领域展现出了令人惊喜的表现。这个原本专注于文本推理的模型,通过与视觉模型的结合,实现了从纯文本到图文理解的跨…...
深度解析OpenCode插件架构:构建企业级AI助手扩展平台
深度解析OpenCode插件架构:构建企业级AI助手扩展平台 【免费下载链接】opencode 一个专为终端打造的开源AI编程助手,模型灵活可选,可远程驱动。 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode 在当今AI驱动的开发环境…...
零基础玩转RetinaFace:一键部署人脸检测,合影/监控都能精准识别
零基础玩转RetinaFace:一键部署人脸检测,合影/监控都能精准识别 1. 为什么选择RetinaFace人脸检测 在当今数字时代,人脸检测技术已经成为众多应用的基础功能。无论是社交媒体上的自动标记、安防监控系统的人脸识别,还是手机相册…...
Micro Debug:Arduino极简嵌入式调试库
1. 项目概述Micro Debug 是一个专为 Arduino 平台设计的极简式嵌入式调试库,其核心设计哲学是“零依赖、零开销、零侵入”——不引入任何额外的硬件资源占用(如额外串口、定时器或DMA通道),不增加运行时调度负担(无任务…...
