1 个不稳定版本
0.1.0 | 2021年6月20日 |
---|
#5 in #citizen-fx
在 3 个crate中使用
33KB
765 行
FiveM WASM绑定库
API
此API可以用任何编译成WASM的其他语言实现。
宿主
模块名称: host
导出
日志(指针: u32,长度: u32)
调用(散列: u64,指针: *const u8,长度: usize,返回值: *const返回值类型)
ptr, len
- 指向参数指针数组的指针
// All structures are C
// See also bindings/src/types.rs
#[repr(C)]
pub struct ReturnValue {
return_type: u32, // expected return type of the native function
buffer: u32, // pointer to the guest buffer
capacity: u32, // capacity of the guest buffer
}
WASM脚本
导出
_start
__cfx_alloc(大小: u32,对齐: u32) -> u32
__cfx_free(指针: *const c_void,大小: u32,对齐: u32)
__cfx_on_tick()
__cfx_on_event(事件名称: *const u8,参数: *const u8,参数长度: u32,源: *const u8)
event_name
- C字符串args
- msgpack字节数组src
- 事件源的C字符串
分配
所有仅存在于函数执行上下文中的参数都由宿主管理。
例如 __cfx_on_event
// allocate memory
let ptr0 = __cfx_alloc(event_name.len(), ...);
let ptr1 = __cfx_alloc(args.len(), ...);
// the host copies event name and args in the allocated memory
// call the expoted function
__cfx_on_event(ptr0, ptr1, ...)
// cleanup the memory after the call
__cfx_free(ptr0)`
__cfx_free(ptr1)
当你调用 host::invoke
时,所有参数都由客户端管理,这意味着调用invoke函数时应该有可用的内存。你可以使用静态数组或每次调用本地函数时都进行分配。
此外,您还可以调整用于获取返回值的缓冲区大小。您应该导出一个函数 __cfx_extend_retval_buffer(new_size: usize) -> *const u8
。此函数将在 host::invoke
执行过程中调用(因此,请确保正确管理指针)。当传递的缓冲区小于本地返回值时,将调用此函数。扩展函数应返回一个指向可以存储 new_size
字节的新缓冲区的指针。如果您无法提供,请返回 0。如果 host::invoke
返回 -1
。
依赖项
~1.5–2.4MB
~48K SLoC