node-addon-api + CMake

概述

node-addon-api 独立于V8,上手简单了。作为官方API的存在,质量有保证。同时版本适配问题比较友好。


本文参考了Node.js Addon Examples中的以下2个例子

  1. build_with_cmake
  2. 6_object_wrap

环境

Window 10
nodejs 16.14.2 (Currently using 64-bit executable)

依赖

node-addon-api 4.3.0
cmake-js 6.3.0

栗子

修改 package.json ,在script中添加以下内容

"scripts": {"install": "cmake-js compile"
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.9)
cmake_policy(SET CMP0042 NEW)
set (CMAKE_CXX_STANDARD 11)project (test_project)
set(VERSION 1.0.0.0)
SET(CMAKE_CXX_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=0")if (MSVC)set(CMAKE_DEBUG_POSTFIX _d)
endif ()find_package(JThread REQUIRED)
find_package(JRTPLIB REQUIRED)set(NODE_LINK_LIBS "")
set(NODE_EXTERNAL_INCLUDES "")include_directories(${CMAKE_JS_INC})
include_directories(${JTHREAD_INCLUDE_DIRS} ${JRTPLIB_INCLUDE_DIRS})file(GLOB HEADER_FILES
"src/index.h")file(GLOB SOURCE_FILES
"src/index.cc"
"src/export.cc")add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES} ${CMAKE_JS_SRC})
set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB} ${JTHREAD_LIBRARIES} ${JRTPLIB_LIBRARIES})# Include Node-API wrappers
execute_process(COMMAND node -p "require('node-addon-api').include"WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}OUTPUT_VARIABLE NODE_ADDON_API_DIR)
string(REGEX REPLACE "[\r\n\"]" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR})target_include_directories(${PROJECT_NAME} PRIVATE ${NODE_ADDON_API_DIR})# define NPI_VERSION
add_definitions(-DNAPI_VERSION=8)
add_definitions(-DNAPI_DISABLE_CPP_EXCEPTIONS)

index.h

#ifndef INDEX_H
#define INDEX_H#include <napi.h>class IndexM : public Napi::ObjectWrap<IndexM>{public://导出函数static Napi::Object Init(Napi::Env env, Napi::Object exports);static Napi::FunctionReference constructor;IndexM(const Napi::CallbackInfo& info);Napi::Value getValue(const Napi::CallbackInfo& info);void setValue(const Napi::CallbackInfo& info);private:int m_value = 0;
};#endif

index.cc

#include "index.h"Napi::FunctionReference IndexM::constructor;Napi::Object IndexM::Init(Napi::Env env, Napi::Object exports)
{Napi::HandleScope scope(env);Napi::Function func =DefineClass(env,"IndexM",{InstanceMethod("getValue", &IndexM::getValue),InstanceMethod("setValue", &IndexM::setValue),});constructor = Napi::Persistent(func);constructor.SuppressDestruct();exports.Set("IndexM", func);return exports;
}IndexM::IndexM(const Napi::CallbackInfo& info) : Napi::ObjectWrap<IndexM>(info)
{}Napi::Value IndexM::getValue(const Napi::CallbackInfo& info)
{return Napi::Number::New(info.Env(),m_value);
}void IndexM::setValue(const Napi::CallbackInfo& info)
{int len = info.Length();Napi::Env env = info.Env();if (len <= 0 || !info[0].IsNumber()) {Napi::TypeError::New(env, "Number expected").ThrowAsJavaScriptException();}Napi::Number value = info[0].As<Napi::Number>();m_value = value.Int32Value();
}

export.cc

#include "index.h"//导出接口
Napi::Object InitAll(Napi::Env env, Napi::Object exports) {return IndexM::Init(env, exports);
}NODE_API_MODULE(IndexM, InitAll)

温馨提示:

对了有个例子是线程中,调用JS回调的 typed_threadsafe_function

参考

node-addon-api GitHub

Node.js API中文网

node-addon-api 简单案例和介绍

全是案例:Node.js Addon Examples

node-addon-api + CMake + 调用动态库相关推荐

  1. CMake从0到1:Linux编译动态库,调用动态库,VSCode单步执行

    工欲善其事必先利其器,如果要想在Linux系统上编写C++代码,常常我们会有如下几个需求: 1.编译可执行文件 2.可执行文件调用动态库,这里通常包括两种情况:(1)自己的动态库,那就得先生成再链接: ...

  2. Node.js使用ffi-napi,ref-array-napi,ref-struct-napi调用动态库

    0x01 概述 使用electron开进行桌面程序的开发,似乎成了WEB前端开发人员转桌面程序开发的首选.近期有一些使用在electron中使用加密锁的需求,学习了一下在Node.js中通过ffi-n ...

  3. 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )

    文章目录 I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 ...

  4. 【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )

    文章目录 I . Android Studio 中使用 Android.mk 配置动态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  5. 动态调用动态库方法 .so

    2019独角兽企业重金招聘Python工程师标准>>> 关于动态调用动态库方法说明 一.       动态库概述 1.  动态库的概念 日常编程中,常有一些函数不需要进行编译或者可以 ...

  6. linux 调用动态库so文件

    关于动态调用动态库方法说明 一.        动态库概述 1.  动态库的概念 日常编程中,常有一些函数不需要进行编译或者可以在多个文件中使用(如数据库输入/输出操作或屏幕控制等标准任务函数).可以 ...

  7. 006 - CMake 安装动态库并生成 XxxConfig.cmake 文件

    CMake 安装动态库并生成 XxxConfig.cmake 文件 文章目录 CMake 安装动态库并生成 XxxConfig.cmake 文件 引言 展示 简单解释CMakeLists.txt se ...

  8. 主程序调用动态库的两种方式,动态库调用主程序的函数

    主程序调用动态库有两种方式,即隐式调用和显式调用. 隐式调用就是共享方式,程序一开始运行就调进去.在链接时候用如下的方式链接动态库:gcc -o main main.o -L./lib -ltest( ...

  9. 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

    文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...

最新文章

  1. Debian 新维护人员手册
  2. android json解析及简单例子
  3. Kira同学:斩获百度校招提前批offer备战细节全揭秘
  4. php读取西门子plc_PLC对模拟量信号,是怎么进行处理的?
  5. 深入浅出MongoDB(二)概述
  6. websocket学习总结记录
  7. 阿里云的技术创新,不是简单的路线之争
  8. Fizz Buzz @leetcode Math
  9. 常用的电气制图软件有哪些?以及各自的优缺点
  10. 安卓计步器是如何实现计步的
  11. Dart 语言入门基础(一)
  12. word文档如何插入目录
  13. PIKA trouble02 -- (error) ERR Syntax error, try CLIENT (LIST [order by [addr|idle]| KILL ip:port)
  14. PHP执行底层机制-zend详解
  15. 一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(二)进一步优化,公差分析
  16. 离别是为了下一次更好的重逢
  17. Arduino基础篇(二)-- 常用的基本函数
  18. python tushare获取股票数据_python调用tushare获取沪股通、深股通成份股数据
  19. AT8637S(PHS/EN输入接口单通道0.8A低压H桥IC)
  20. 贝叶斯分类器算法及案例详解

热门文章

  1. uni-app蓝牙操作
  2. mongoDB 去重统计, group实现版
  3. Suse获取磁盘利用率最大值
  4. 软考高级信息系统项目管理师如何准备论文?
  5. 开局就要做电视的未来 荣耀智慧屏究竟能否重构电视生态?
  6. html 像素 视频教程,canvas像素点操作之视频绿幕抠图
  7. 华为怎样分屏_全球首款!华为5G+折叠屏手机刷屏!3秒下载1G!售价是.....
  8. 惩罚项的意义-为什么有惩罚项?
  9. 浅谈JDBC,JDBC实现的几大步骤
  10. 科目性质与恒等式对应关系