node-addon-api + CMake + 调用动态库
node-addon-api + CMake
概述
node-addon-api 独立于V8,上手简单了。作为官方API的存在,质量有保证。同时版本适配问题比较友好。
本文参考了Node.js Addon Examples中的以下2个例子
- build_with_cmake
- 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 + 调用动态库相关推荐
- CMake从0到1:Linux编译动态库,调用动态库,VSCode单步执行
工欲善其事必先利其器,如果要想在Linux系统上编写C++代码,常常我们会有如下几个需求: 1.编译可执行文件 2.可执行文件调用动态库,这里通常包括两种情况:(1)自己的动态库,那就得先生成再链接: ...
- Node.js使用ffi-napi,ref-array-napi,ref-struct-napi调用动态库
0x01 概述 使用electron开进行桌面程序的开发,似乎成了WEB前端开发人员转桌面程序开发的首选.近期有一些使用在electron中使用加密锁的需求,学习了一下在Node.js中通过ffi-n ...
- 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )
文章目录 I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 ...
- 【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )
文章目录 I . Android Studio 中使用 Android.mk 配置动态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...
- 动态调用动态库方法 .so
2019独角兽企业重金招聘Python工程师标准>>> 关于动态调用动态库方法说明 一. 动态库概述 1. 动态库的概念 日常编程中,常有一些函数不需要进行编译或者可以 ...
- linux 调用动态库so文件
关于动态调用动态库方法说明 一. 动态库概述 1. 动态库的概念 日常编程中,常有一些函数不需要进行编译或者可以在多个文件中使用(如数据库输入/输出操作或屏幕控制等标准任务函数).可以 ...
- 006 - CMake 安装动态库并生成 XxxConfig.cmake 文件
CMake 安装动态库并生成 XxxConfig.cmake 文件 文章目录 CMake 安装动态库并生成 XxxConfig.cmake 文件 引言 展示 简单解释CMakeLists.txt se ...
- 主程序调用动态库的两种方式,动态库调用主程序的函数
主程序调用动态库有两种方式,即隐式调用和显式调用. 隐式调用就是共享方式,程序一开始运行就调进去.在链接时候用如下的方式链接动态库:gcc -o main main.o -L./lib -ltest( ...
- 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )
文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...
最新文章
- Debian 新维护人员手册
- android json解析及简单例子
- Kira同学:斩获百度校招提前批offer备战细节全揭秘
- php读取西门子plc_PLC对模拟量信号,是怎么进行处理的?
- 深入浅出MongoDB(二)概述
- websocket学习总结记录
- 阿里云的技术创新,不是简单的路线之争
- Fizz Buzz @leetcode Math
- 常用的电气制图软件有哪些?以及各自的优缺点
- 安卓计步器是如何实现计步的
- Dart 语言入门基础(一)
- word文档如何插入目录
- PIKA trouble02 -- (error) ERR Syntax error, try CLIENT (LIST [order by [addr|idle]| KILL ip:port)
- PHP执行底层机制-zend详解
- 一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(二)进一步优化,公差分析
- 离别是为了下一次更好的重逢
- Arduino基础篇(二)-- 常用的基本函数
- python tushare获取股票数据_python调用tushare获取沪股通、深股通成份股数据
- AT8637S(PHS/EN输入接口单通道0.8A低压H桥IC)
- 贝叶斯分类器算法及案例详解