美文网首页
nodejs调用C++动态链接库

nodejs调用C++动态链接库

作者: 六月太阳花 | 来源:发表于2022-03-07 18:09 被阅读0次

    1.使用node-ffi模块帮助我们调用动态链接库。

    ffi的全称是Foreign Function Interface,该项目生来就是解决nodejs本地调用问题的。在我们使用nodejs调用东来链接库时候,最繁琐容易出问题的就是配置环境阶段。下边我们就先分别看一下windows和linux下是如何安装的。

    2.安装

    Windows下的安装:

    1 安装node 我node版本使用的8.9.0(高版本的测试使用过,但是没有成功)
    如果你有其他项目必须使用高版本的node,可以使用nvm来管理node的版本。
    2 安装

    npm install --global --production windows-build-tools(在管理员权限打开的命令行中执行)
    npm install -g node-gyp //依赖python2.7,包含在windows-build-tools中
    

    如果这两个都安装成功了,再去安装node-ffi就没有什么问题了。

    npm install ffi
    npm install ref
    
    linux下的安装:

    1.和windows一样同样使用的8.9.0的版本。测试过高版本,没有成功过。
    2.安装npm install -g node-gyp ,需要依赖python2.7
    3.在linux下安装时需要注意权限问题
    安装项目下的所有模块

    sudo npm install --unsafe-perm 
    

    npm 出于安全考虑不支持以 root 用户运行,即使你用 root 用户身份运行了,npm 会自动转成一个叫 nobody 的用户来运行,而这个用户几乎没有任何权限。这样的话如果你脚本里有一些需要权限的操作,比如写文件(尤其是写 /root/.node-gyp),就会崩掉了。

    为了避免这种情况,要么按照 npm 的规矩来,专门建一个用于运行 npm 的高权限用户;要么加 --unsafe-perm 参数,这样就不会切换到 nobody 上,运行时是哪个用户就是哪个用户,即使是 root。
    4 安装完成后,项目放到了/home 目录下,编写项目保存时候总是提示,用户权限不足,就做了如下设置

    sudo chmod 777 -R [项目目录]
    

    3 在项目中的使用

    1.引入ffi等模块

    const ref = require('ref')
    const MyArrayType = require("ref-array");
    const ffi = require('ffi');
    
    1. 加载.dll或者.so文件
    let pacherDyPath = path.resolve('dll/packerDy');//dll的地址,记得使用绝对路径
    /*加载动态链接库 
    Library方法的第一个参数是dll文件路径,第二个参数是dll提供的接口
    */
    let libm = ffi.Library(pacherDyPath, {
            'loadResourceContractPacker': ['pointer', ['string'] ],
            'createResourceWithContract':['pointer',['pointer','string','string','int']],
        });
    /*调用接口*/
    let resourceContractPacker = libm.loadResourceContractPacker(testResourcePath);
    /*当接口返回为二进制数据*/
    
    let charPtrArray = MyArrayType(ref.types.uint8, size);
    let charPtrArrayPtr = ref.refType(charPtrArray);
    let libm2 = ffi.Library(pacherDyPath, {
            'getResourceDataWithContract':[charPtrArrayPtr,['pointer']],
    });
    let outContractData = libm2.getResourceDataWithContract(contractInfo)
    

    详细的使用方法,可查看https://github.com/node-ffi/node-ffi/wiki/Node-FFI-Tutorial

    相关文章

      网友评论

          本文标题:nodejs调用C++动态链接库

          本文链接:https://www.haomeiwen.com/subject/kspyrrtx.html