V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hua123s
V2EX  ›  问与答

C++ 动态调用库问题, node.js 调用

  •  
  •   hua123s · 2020-01-15 10:22:32 +08:00 · 1945 次点击
    这是一个创建于 1808 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在有一个 dll 加头文件,好像是函数没有 export 我有什么办法去在不熟悉 C++语法的情况下,让 node.js 可以调用这个 dll ?

    方法 1.稍微学习 C++ 方法 2. 请教各位大佬,有什么 tips ?

    4 条回复    2020-01-17 18:20:56 +08:00
    sc3263
        1
    sc3263  
       2020-01-15 10:52:10 +08:00   ❤️ 1
    0. 找个写过 C/C++的同事 /朋友协助你
    1. 确定动态库是 x86 还是 x64 的。后续调用的 node.js 运行时需要和它一样
    2. 对着 node-addon-api 的例子改一下。
    https://github.com/nodejs/node-addon-examples/tree/master/1_hello_world/node-addon-api
    binding.gyp 里加要链接的动态库。
    hello.cc 里加对应的调用。基本上就是增加 Napi::Value MethodName(const Napi::CallbackInfo& info)的函数,把 info 中的入参解析出来,调用对应的 C++函数,拿到返回值,再包成 Napi::Value 返回。最后在 Napi::Object Init(Napi::Env env, Napi::Object exports)里把写好的函数 set 到 exports。
    js 中的用法参照 hello.js
    3. 无尽的查 node addon api 文档+debug
    4. 祈祷你的动态库调用里没有啥需要注册回调的。不然又是另外一场噩梦。
    这样应该可以出个凑合能用的版本。所有对动态库方法的调用都是在主线程中完成的。要是动态库方法会执行很长时间的话,会阻塞主线程。
    hua123s
        2
    hua123s  
    OP
       2020-01-15 11:27:24 +08:00
    @sc3263 谢谢大佬,
    hua123s
        3
    hua123s  
    OP
       2020-01-17 17:33:30 +08:00
    @sc3263 大佬 可以询问下 您一般一个 C++对象怎么转换成 javascript object 的?
    每个属性一对应写映射?
    sc3263
        4
    sc3263  
       2020-01-17 18:20:56 +08:00   ❤️ 1
    @hua123s 可以按照
    https://github.com/nodejs/node-addon-api/blob/master/doc/object_wrap.md
    里提到的,定义一个继承自 Napi::ObjectWrap 的包装类,在里面实现 C++的代码。
    我是直接在包装类对象里存 C++对象的指针。构造时新建 C++对象,析构时删除,再添加需要暴露给 JS 的成员函数,在里面调用 C++的对象对应的方法。
    hmmmmmmmm
    基本上就是你说的,属性一一对应写映射。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5379 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:17 · PVG 15:17 · LAX 23:17 · JFK 02:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.