zoukankan      html  css  js  c++  java
  • C/C++实现nodejs扩展接口 node-addon-api

    软件准备

    实例

    新建一个文件夹

    1. 新建package.json
    {
      "name": "test-cpp-module",
      "version": "0.1.0",
      "private": true,
      "gypfile": true,
      "dependencies": {
        "node-addon-api": "^2.0.0"
      }
    }
    
    1. 新建binding.gyp
    {
      "targets": [
        {
          "target_name": "democpp",
          "sources": [
            "democpp.cc"
          ],
          "include_dirs": [
            "<!@(node -p "require('node-addon-api').include")"
          ],
          "libraries": [ 
            
          ],
          "dependencies": [
            "<!(node -p "require('node-addon-api').gyp")"
          ],
          "cflags!": ["-fno-exceptions"],
          "cflags_cc!": ["-fno-exceptions"],
          "defines": ["NAPI_CPP_EXCEPTIONS"],
          "xcode_settings": {
            "GCC_ENABLE_CPP_EXCEPTIONS": "YES"
          }
        }
      ]
    }
    

    文件中首先使用target_name指定了编译之后模块的名称。

    sources指明c++的源文件,如果有多个文件,需要用逗号隔开,放到同一个数组中。

    include_dirs是编译时使用的头文件引入路径,这里使用node -p执行node-addon-api模块中的预置变量。

    dependencies是必须的,不要改变。

    后面部分,cflags!/cflags_cc!/defines三行指定如果c++程序碰到意外错误的时候,由NAPI接口来处理,而不是通常的由c++程序自己处理。这防止因为c++部分程序碰到意外直接就退出了程序,而是由nodejs程序来捕获处理。如果是在Linux中编译使用,有这三行就够了。

    但如果是在macOS上编译使用,则还要需要最后一项xcode-settings设置,意思相同,就是关闭macOS编译器的意外处理功能。

    1. democpp.cc
    #include <napi.h>
    
    using namespace Napi;
    
    String Hello(const CallbackInfo& info) {
    	return String::New(info.Env(), "world");
    }
    
    Napi::Object  Init(Env env, Object exports) {
    	exports.Set("hello", Function::New(env, Hello));
    	return exports;
    }
    NODE_API_MODULE(addon, Init)
    

    程序中引入napi.h头文件,使用Napi的namespace还有最后的NODE_API_MODULE(addon,Init)都是模板化的,照抄过来不用动。
    Init函数中,使用exports.Set()引出要暴露给nodejs调用的函数。如果有多个需要引出的函数,就写多行。
    Hello函数是我们主要完成工作的部分,本例中很简单,只是用字符串的方式返回一个“world”。

    democpp.cc/binding.gyp/package.json三个文件都创建好,在当前文件夹开启命令行,保持网络畅通,运行npm install,顺利编译,此时在得到输出文件.uildReleasedemocpp.node,下一步,在node中调用hello()

    E:WorkSpaceCode
    ode-addon-cplus>node
    Welcome to Node.js v12.16.1.
    Type ".help" for more information.
    > testapp=require('./build/Release/democpp.node')
    { hello: [Function] }
    > testapp.hello()
    'world'
    >
    

    提供上述实例源文件链接

    注意事项

    • 使用nodejs12、python3和Visual Studio 15可以编译上述接口,但是生成出来democpp.node的文件大小有500+KB,作为一个接口模块而言有些体积损耗。如果使用nodejs10.xx环境,仅仅安装npm install -g windows-build-tools(其中windows-build-tools会自动安装python2.7以及vs2017编译工具),使用npm install进行编译,可以大大减少democpp.node的文件大小。

    • 编译时nodejs的32位(64位)决定了democpp.node32位(64位)

    参考文章

    [1] 简单上手nodejs调用c++(c++和js的混合编程)

    [2] node-addon-examples

  • 相关阅读:
    线性表的顺序存储结构详解
    Java就业急训营-感悟与分享
    在Ubuntu系统下用C语言编写程序
    NTIRE介绍和近年来超分SR结果展示
    《王道操作系统》学习笔记:计算机系统概述
    JavaScript 语言通识 — 重学 JavaScript
    python利用numpy存取文件
    Batch Normalization(批标准化,BN)
    全零填充(padding)
    感受野(Receptive Field)理解为什么采用多层小卷积核来替换一层大卷积核
  • 原文地址:https://www.cnblogs.com/macrored/p/12543462.html
Copyright © 2011-2022 走看看