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

2020-01-15 10:22:32 +08:00
 hua123s

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

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

1901 次点击
所在节点    问与答
4 条回复
sc3263
2020-01-15 10:52:10 +08:00
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
2020-01-15 11:27:24 +08:00
@sc3263 谢谢大佬,
hua123s
2020-01-17 17:33:30 +08:00
@sc3263 大佬 可以询问下 您一般一个 C++对象怎么转换成 javascript object 的?
每个属性一对应写映射?
sc3263
2020-01-17 18:20:56 +08:00
@hua123s 可以按照
https://github.com/nodejs/node-addon-api/blob/master/doc/object_wrap.md
里提到的,定义一个继承自 Napi::ObjectWrap 的包装类,在里面实现 C++的代码。
我是直接在包装类对象里存 C++对象的指针。构造时新建 C++对象,析构时删除,再添加需要暴露给 JS 的成员函数,在里面调用 C++的对象对应的方法。
hmmmmmmmm
基本上就是你说的,属性一一对应写映射。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/638021

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX