Articles of node ffi

尝试从cpp dll获取多于500kb的text / json数据时,节点崩溃

// cpp代码 ifstream myfile; myfile.open("D:\Spot\data\simpledata.txt"); string content((std::istreambuf_iterator(myfile)), (istreambuf_iterator())); myfile.close(); char* chr = &content[0]; return char; //节点代码 var libSpotcolor = ffi.Library(fileName, { 'test': ["char *", []] }); var testdata =libSpotcolor.test(); // Here node is crashing console.log(testdata); var save_json = testdata.readCString(); 我可以得到更多的1 MB的数据,如果不是有任何替代方式来得到这个?

在REST API中处理本机对象

我有一个使用expressjs实现的web服务器api,它提供REST api来logging连接到Web服务器机器的networking摄像机。 networking摄像机和编码是使用C ++编写的dll处理的,互操作是使用node-ffi库完成的。 我遇到的问题是我在我的响应中混合使用JSONstring的原生ffi句柄。 例如我有一个Stream类与原型: Stream.prototype.id = ''; Stream.prototype.url = '': Stream.prototype.parent = null; Stream.prototype.filePtr = null; Stream.filePtr将包含一个ffi句柄,例如ref.refType(ref.types.void) 然后在我的expressjs POST start呼叫我做类似的事情: impl.start = function(req, res){ var camera = cameras.find(function(camera) { return camera.id === req.params.camera; }); res.send(camera.startStream()); // startStream returns a new 'Stream' object. }; 正如你所看到的,我只是简单地将Stream对象发送给响应。 我通常如何实现REST API。 问题是,本地filePtr句柄不应该真的被包括在内,我不确定什么是最好的做法,或者如果我做了根本性的错误? 注:我是一个新手,当谈到networking,nodejs,expressjs和一般的JavaScript。 所以如果我正在做的事情没有意义,或者可以做得更好,请指出。 一个更完整的例子: // dll bindings […]

如何将原始内存复制到nodejs中的Buffer?

我使用node和node-ffi 。 我从native / C得到一个callback(void *,size_t)来表示一个有趣的数据的内存区域。 我想采取这一点,并创build相同的内容的Buffer 。 基本上: function callback_on_write(ptr, size) { var buffer = new Buffer(size); buffer.somehow_copy_from_memory(ptr, size); } 如何将原始内存复制到Buffer ?

如何从nodejs读取数据,由长度为0的node-ffi创build

我试图包装一个现有的C库使用node-ffi,但我似乎无法读取返回的结果。 情况有点尴尬,因为函数返回C结构 typedef struct { int size; void *ptr; } datum; 并且代表datum.ptr的节点缓冲区的长度字段是0。 这是显示问题的整个C代码。 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { void *ptr; int size; } datum; datum get() { int r = 23; datum *p = malloc(sizeof(*p)); if(!p) { printf("malloc failed\n"); exit(1); } p->ptr = malloc(sizeof(r)); if(!p->ptr) { printf("malloc failed\n"); exit(1); } p->size […]

我怎样才能解决`错误:无法find绑定文件.`使用`node-ffi`时?

一些细节: Mac OSX 10.11.6 节点v6.5.0 npm v3.10.3 nvm v0.29.0 我最近build立了一个使用ffi与共享C库交互的npm包。 这个软件包完全可以自己完成(使用babel构build)。 我试图将其整合到一个概念validation应用程序中,并遇到了很多 bindings问题。 我正在使用webpack捆绑我的POC应用程序,这就是我遇到这个问题的地方。 这是我的webpack.config.js : /* eslint-disable */ var webpack = require('webpack'); var path = require('path'); var HtmlWebpackPlugin = require('html-webpack-plugin'); var buildPath = path.resolve(__dirname, 'wp-build/'); module.exports = [ { name: 'frontend', entry: './src/frontend/index.js', output: { path: buildPath, filename: 'frontend.bundle.js', }, module: { loaders: [{ […]

SDL2 – RenderPresent随机抽取20-30 + ms(在Node.JS FFI调用中)

我一直在更新Node.JS FFI到SDL来使用SDL2。 ( https://github.com/Freezerburn/node-sdl/tree/sdl2 )到目前为止,这一切进展顺利,我可以成功渲染1600多种彩色纹理,而不会有太多问题。 然而,我刚开始遇到一个我似乎无法弄清楚的问题,似乎与FFI,GC,Javascript的速度等没有任何关系。 问题是,当我打电话给SDL_RenderPresent VSYNC启用,偶尔,每隔几秒,这个电话将需要20-30或更多的毫秒来完成。 看起来这是连续发生的2-3次。 无论在屏幕上移动什么,这都会引起一个非常简短但明显的视觉障碍。 剩下的时间,这个调用将花费正常的时间来显示什么在正确的时间被画到屏幕上,以便与屏幕同步,并且一切看起来都很平滑。 如果你克隆上面提到的仓库,你可以看到这一点。 用node-gyp构build它,然后运行test.js. (我可以将testing代码embedded到StackOverflow中,但是我认为只需在GitHub上提供完整的示例会更容易)需要SDL2,SDL2_ttf和SDL2_image位于/ Library / Frameworks中。 (这还在开发中,所以没有什么特别的东西可以自动查找SDL2,或者在存储库中具有所需的代码,或从某个地方取出等) 编辑:这应该可能会根据gamedev StackExchange网站。 不知道是否可以移动/链接或不。

库在节点ffi中处理

我正在把gssapi集成到node.js中 我不知道如何表示这一点: gss_init_sec_context函数包含许多基于结构的参数,其中一些嵌套很深。 比如这个结构体: typedef struct gss_ctx_id_struct { gss_OID mech; #ifdef USE_KERBEROS5 struct _gss_krb5_ctx_struct *krb5; #endif } gss_ctx_id_desc; 所以基于这个我猜我需要实现某种结构(与ref-struct)来表示krb5指针(因为正在使用kerberos5)。 所以我看着这个_gss_krb_ctx_struct ,看到了这个… typedef struct _gss_krb5_ctx_struct { Shishi *sh; Shishi_ap *ap; Shishi_tkt *tkt; Shishi_key *key; gss_name_t peerptr; int acceptor; uint32_t acceptseqnr; uint32_t initseqnr; OM_uint32 flags; int reqdone; int repdone; } _gss_krb5_ctx_desc, *_gss_krb5_ctx_t; Shishi是一个指向库的指针,而shishi_ap似乎是一个指向函数的指针。 我不知道如何在node-ffi中实现这些东西。 有人能给我一些指导吗?

NodeJS / node-ffi:内存泄漏/variables范围

我正在调查我的nodejs脚本中的内存泄漏。 请考虑下面的代码块(整个源代码将在底部)。 GetImage调用一个C函数来分配一个缓冲区,并且调用者有责任释放它。 在res.send(data)行后, var dataPtr会在GC期间被释放? app.get('/test', function(req, res) { res.contentType('image/jpeg'); var lengthPtr = ref.alloc('uint'); var dataPtr = ref.alloc('uchar*'); lib.GetImage(dataPtr, lengthPtr); var length = lengthPtr.deref(); var data = ref.reinterpret(ref.deref(dataPtr), length); res.send(data); }); 处理大约20000个请求后出现错误消息: Error: reinterpret: Cannot reinterpret from NULL pointer at Object.reinterpret (/home/ltse/LinuxPort/Experiments/NodeAddon/node_modules/ref/lib/ref.js:773:21) at Object.handle (/home/ltse/LinuxPort/Experiments/NodeAddon/ffi.js:20:17) at next_layer (/home/ltse/LinuxPort/Experiments/NodeAddon/node_modules/express/lib/router/route.js:103:13) at Route.dispatch (/home/ltse/LinuxPort/Experiments/NodeAddon/node_modules/express/lib/router/route.js:107:5) at /home/ltse/LinuxPort/Experiments/NodeAddon/node_modules/express/lib/router/index.js:213:24 at […]

我如何处理Node.js中的SlowBuffer?

现在我正在用Node.js开发一个usb-serial应用程序。 这个DLL返回INVALID_HANDLE_VALUE,如果无法打开COM端口。 所以我想在Node.js中处理ret值。 在这种情况下,我如何处理? 我不知道如何比较ret值和SlowBuffer。 DLL #define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1 typedef HANDLE (*OPEN)(int); __declspec(dllexport) HANDLE opencom(int ncom) node.js与node-ffi var ffi = require('ffi'); var lib = ffi.Library('serialmw.dll', { 'opencom' : ['pointer', ['int']] }); var hcom = null; hcom = lib.opencom(1); console.log(hcom); // <SlowBuffer@0xFFFFFFFFFFFFFFFF >

如何使用节点ffi调用C ++代码

我正在写一个数据采集应用程序,但是我没有一个传统的无聊的前端,我已经负责把Web 2.0的前端,我听说Node.js擅长调用C ++代码,但是因为我得到我应该考虑把我的DLL链接到我的前端的阶段,我碰到了一堵砖墙。 我知道我可以在本地编写代码而不使用诸如node-ffi之类的附加内容,但坦率地说,使用Google的V8语法执行这些绑定的语法看起来相当复杂,因此我猜ffi是最简单的方法处理这个(事情。 我知道之前有一个预先的问题,并且在这里有一个答案,但是我仍然对如何编写填充程序以允许我从节点调用C ++ dll有点不安。 我有以下C ++头文件: #include "NIDAQmx.h" #include <string> using std::string; namespace DAQReaderDll { class DAQReader { private: int32 m_read; int32 m_error; TaskHandle m_handle; bool m_isRunning; char m_errBuff[2048]; public: __declspec(dllexport) DAQReader(); __declspec(dllexport) ~DAQReader(); __declspec(dllexport) void startDevice(); __declspec(dllexport) void stopDevice(); __declspec(dllexport) float32 getSample(); __declspec(dllexport) bool isRunning(); __declspec(dllexport) string getError(); }; // Used […]