nodejs 如何使用 通过ffi调用返回来的内存指针
发布于 10 年前 作者 peterfuture 10986 次浏览 最后一次编辑是 8 年前

nodejs封装了一个c库 通过c库返回来一个内存指针,但数据不知道如何读出来,请高手帮解答下 代码片如下: uint8_t = ref.types.uint8; var uint8_ptr = ref.refType(uint8_t); var Struct = require(‘ref-struct’); var pic_t = Struct( { data:uint8_ptr, linesize:‘int’, pts:int64_t, dts:int64_t, duration:‘int’ } ); var picptr = ref.refType(pic_t); 通过调用c库的回调会返回一个picptr的对象,通过 var picture = pic.deref(); var data = picture.data0; console.log(‘canvas render one frame, pts’+ picture.pts); 可以正确的获取picture中的pts成员的值, 但要如何获取data呢,data是一个uint8* 指针 现在的问题是如何将data中的值读出来 将data作为数组,data[1]就是undefined 谢谢!

12 回复

据我所知,你只能在C里面把值取出来给NodeJS

多谢回复! 我实验过返回的picptr对象,通过deref()我可以得到pts 成员的值, 说明是可以返回指针的,只要deref后是nodejs中可识别的数据结构 只是由于deref(picptr)后得到的是一个 pic_t对象因此可以直接 使用pic_t.pts来访问 但若我直接对 var data = picture.data0; data.deref()之后,仅仅是一个uint8_t,不知到如何能转化成类似数组的对象

答案参考 github上 @TooTallNate 大牛的回复: @peterfuture So in that case you can just do a “uint8*” type. This will return a buffer with only length 1 though, so at that point you call reinterpret(rawDataByteLength) to get a new Buffer at the same address space but with the amount of bytes you requested.

遇到类似问题的同学可参考

撸住,你的ref-struct库在哪里下的?

写好 package.json npm install 就可以下到

@peterfuture 就是安装dtplayer就行了么? 这个是在NodeJS里面直接访问内存数据的库么?

装好了,3ks

ref、ref-struct、ffi在git的地址是多少?我没搜索到啊

你到npm页面,搜索到addon的介绍,有链接的 比如: https://www.npmjs.org/package/ffi 其他查找方式相同

@hainee dtplayer是多媒体播放器, node-dtplayer只是个扩展 。实际的播放器源代码: https://github.com/peterfuture/dtplayer_c

回到顶部