现在有一个 dll 加头文件,好像是函数没有 export 我有什么办法去在不熟悉 C++语法的情况下,让 node.js 可以调用这个 dll ?
方法 1.稍微学习 C++ 方法 2. 请教各位大佬,有什么 tips ?
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. 祈祷你的动态库调用里没有啥需要注册回调的。不然又是另外一场噩梦。 这样应该可以出个凑合能用的版本。所有对动态库方法的调用都是在主线程中完成的。要是动态库方法会执行很长时间的话,会阻塞主线程。 |
3
hua123s OP @sc3263 大佬 可以询问下 您一般一个 C++对象怎么转换成 javascript object 的?
每个属性一对应写映射? |
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 基本上就是你说的,属性一一对应写映射。 |