fzy*_*cjy 10
有几种方法可以做到这一点。
我在生产环境使用了一年的第一种方式是,可以使用 JSON 或 Protobuf 在 Rust 和 Dart/Flutter 之间传递所有数据。通过这样做,您不需要编写大量的样板代码来分配/释放字符串、字节列表、结构/类等。您所需要做的就是编写一个接受字节的函数数组有效负载并输出字节数组结果。通过说“一个”函数,我的意思是,您可以action在 JSON/Protobuf 中拥有一个字段,因此对不同 Rust 函数的调用可以交错到这个单一的接口中。
尽管它很方便(只有一点不安全的样板),但缺点也很明显。序列化和反序列化并不是免费的。您必须为此付出 CPU 时间和内存的费用,有时这些费用可能会相当大。而且,你不能轻易传递大物体。例如,如果您有一个图像(您知道,至少有兆字节大小),将其序列化到 Protobuf,然后从 Protobuf 反序列化它可能会浪费 CPU 和内存 - 无用的副本!更糟糕的是,由于 Flutter/Dart FFI 不支持异步 FFI 的便捷方式,您必须使其在单独的工作隔离中运行 - 多一个内存副本。您可以在这里查看更多信息: https: //github.com/dart-lang/language/issues/1862(这是我打开的一个问题)。
我最近使用的第二种方法是编写代码生成器。事实上,代码遵循几种常见的模式,例如“分配 - 填充数据 - 调用 FFI - 释放”等。因此编写一个生成器来自动执行此类操作并不难。这个想法是模仿人类手动编写样板代码时会做什么。
我确实希望已经存在一些可以直接使用的代码生成器,但似乎不存在......所以,你自己写吧。
当我写下代码生成器后,我猜人们可能会遇到和我一样的问题,所以我将其开源:https://github.com/fzyzcjy/flutter_rust_bridge
事实上,我的代码生成器不仅解决了上述问题,而且还具有丰富的类型支持,允许零复制,允许异步编程和主隔离直接调用等,这些可以通过代码生成器实现,但需要大量样板代码如果你用手做的话。
免责声明:这是一个问答式的答案,旨在展示我的想法以及我在这个问题上所做的工作,这对我自己的应用程序在生产环境中至关重要。事实上,我从去年就开始使用 JSON 方法,后来重构为代码生成器方法。希望也能帮助到其他面临同样情况的人!
| 归档时间: |
|
| 查看次数: |
3355 次 |
| 最近记录: |