如何访问ffi返回的指针所指向的结构体数组(ffi-napi场景)
问题原因
你的结构体类型定义本身没有语法错误,无法读取后续元素的核心原因是:你定义的els字段为structEl的单指针类型,ffi默认只会将该指针解析为单个结构体实例的地址,直接读取自然只能拿到第一个元素。
C语言中结构体数组本质是连续内存空间存储的同类型结构体,首元素指针和数组指针的类型完全一致,你需要手动按单个结构体的内存大小偏移指针,才能读取到后续的所有元素。
解决方案
如果你使用的是ref-napi+ref-struct-napi组合,可以按如下方式读取完整数组:
// 调用DLL函数拿到返回的structResult实例 const result = yourDllExportFunction() const elCount = result.number_of_els const elsBasePtr = result.els const elSize = structEl.size // 提前获取单个structEl的内存字节大小 const elArray = [] for (let i = 0; i < elCount; i++) { // 计算当前索引对应的结构体指针 const currentPtr = elsBasePtr + i * elSize // 将指针转为structEl实例 const currentEl = structEl.prototype.get(currentPtr) elArray.push(currentEl) } // elArray即为完整的结构体数组
如果你使用的是旧版ref库,将实例读取逻辑替换为ref.get(currentPtr, 0, structEl)即可。
注意事项
- 需保证JS侧定义的
structEl内存对齐规则和C侧的结构体对齐规则一致,否则structEl.size计算错误会导致指针偏移异常,读取内容乱码。 - C侧分配的
els数组内存不会被JS的GC自动回收,如果你使用完后需要释放内存,必须调用DLL配套提供的内存释放接口手动释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Pierre Arlaud
相关产品推荐
相关产品推荐

