SenRi FFI:统一跨语言外部函数接口 SenRi FFI统一跨语言外部函数接口为什么会有这个项目写一个需要调用原生 C 库的工具时JavaScript 和 Python 的 FFI 方案各自为政。Node.js 有 node-ffi-napiDeno 有 Deno.dlopenBun 有内置的 ffapiPython 有 ctypes 和 cffi。同样一个 C 函数在 Node 里用一种写法到 Deno 里换一种到 Python 里再换一种。每个平台都在重复造轮子每个开发者都在重复学一套新的 API。SenRi FFI 要解决的就是这个问题。它是什么一个统一的外部函数接口库。不管你在 KossJS、Node.js、Bun、Deno 还是在 Python 里调用 C 函数的方式是一样的。// JSconstlibnewLibrary(libtest.so)constaddlib.bind(add,int32,[int32,int32])add(1,2)// 3# PythonlibLibrary(libtest.so)addlib.bind(add,int32,[int32,int32])add(1,2)# 3同样的 API同样的类型名称同样的调用方式。能做什么类型系统int8 到 int64、float32 到 float64、pointer、cstring、void跨语言名称一致不需要记各平台的映射表。结构体自动处理布局和对齐支持紧凑排列、嵌套、位域。定义一次JS 和 Python 都能用。指针从原生内存读写基本类型和 C 字符串支持偏移量操作。回调把 JS 或 Python 函数包装成 C 函数指针传给原生库调用。内存管理alloc、free、addressOf以及 errno 和 strerror 获取错误信息。异步KossJS 原生异步Deno 和 Node 走 Worker 线程Bun 有 Promise 包装带警告。架构适配器模式。每个运行时有一个对应的适配器自动检测当前环境选择合适的那个。如果你想换底层 FFI 引擎实现 LibraryLike 接口就能注入自定义后端也支持部分实现配合内置适配器回退。核心逻辑跟适配器解耦加新运行时不难。技术栈JS 包用 TypeScript 6.x、Vitest 4.x底层 FFI 引擎是 koffi。Python 包支持 3.13用 Hatchling 构建、Ruff 做检查后端支持 ctypes内置和 cffi可选。测试库用 Rust 写 cdylib统一提供给两个语言包调用。项目结构senri_ffi/ ├── packages/ │ ├── senri_ffi_js/ # JS/TS 包 │ │ ├── src/adapters/ # 运行时适配器 │ │ ├── src/types/ # 类型定义 │ │ ├── src/async/ # 异步支持 │ │ └── ... (library, pointer, struct, callback, memory) │ └── senri_ffi_py/ # Python 包 │ ├── src/senri_ffi/adapters/ # ctypes / cffi │ └── ... └──test-lib/ # Rust 测试库谁适合用需要在 Node、Deno、Bun、KossJS 之间共享 FFI 代码的项目同一个原生库要同时给 JS 和 Python 项目调用想做跨语言 SDK不想给每个语言单独写绑定对类型安全和统一 API 有要求的团队现状项目持续开发中。测试覆盖包括单元测试JS 用 VitestPython 用 Pytest和集成测试通过 Rust 测试库验证跨语言一致性CI 自动跑。相关链接项目地址github.com/TT23XR-Studio/senri_ffiKossJS 文档docss.sxxyrry.qzz.io/SenRi FFI/TT23XR Studio 官网tt23xr.sxxyrry.qzz.io/Apache-2.0 许可证欢迎使用和贡献。