26个版本 (15个重大更改)
0.17.1 | 2020年6月24日 |
---|---|
0.16.2 | 2020年3月12日 |
0.12.0 | 2019年12月19日 |
0.11.0 | 2019年11月24日 |
0.2.1 | 2019年2月28日 |
#1451 在 WebAssembly
每月42次下载
2MB
30K SLoC
Wasmer运行时C API
Wasmer是一个独立的JIT WebAssembly运行时,旨在完全兼容WASI、Emscripten、Rust和Go。了解更多。
这个crate公开了Wasmer运行时的C和C++ API。
用法
可以在该crate的源代码树中找到C和C++头文件,分别是wasmer.h
和wasmer.hh
。它们是自动生成的,并且在这个仓库中总是最新的。运行时共享库(so,dll,dylib)也可以在Wasmer发布页面下载。
完整的C API文档在这里可以找到: https://wasmerio.github.io/wasmer/c/runtime-c-api/
以下是一个使用C API的简单示例
#include <stdio.h>
#include "../wasmer.h"
#include <assert.h>
#include <stdint.h>
int main()
{
// Read the Wasm file bytes.
FILE *file = fopen("sum.wasm", "r");
fseek(file, 0, SEEK_END);
long len = ftell(file);
uint8_t *bytes = malloc(len);
fseek(file, 0, SEEK_SET);
fread(bytes, 1, len, file);
fclose(file);
// Prepare the imports.
wasmer_import_t imports[] = {};
// Instantiate!
wasmer_instance_t *instance = NULL;
wasmer_result_t instantiation_result = wasmer_instantiate(&instance, bytes, len, imports, 0);
assert(instantiation_result == WASMER_OK);
// Let's call a function.
// Start by preparing the arguments.
// Value of argument #1 is `7i32`.
wasmer_value_t argument_one;
argument_one.tag = WASM_I32;
argument_one.value.I32 = 7;
// Value of argument #2 is `8i32`.
wasmer_value_t argument_two;
argument_two.tag = WASM_I32;
argument_two.value.I32 = 8;
// Prepare the arguments.
wasmer_value_t arguments[] = {argument_one, argument_two};
// Prepare the return value.
wasmer_value_t result_one;
wasmer_value_t results[] = {result_one};
// Call the `sum` function with the prepared arguments and the return value.
wasmer_result_t call_result = wasmer_instance_call(instance, "sum", arguments, 2, results, 1);
// Let's display the result.
printf("Call result: %d\n", call_result);
printf("Result: %d\n", results[0].value.I32);
// `sum(7, 8) == 15`.
assert(results[0].value.I32 == 15);
assert(call_result == WASMER_OK);
wasmer_instance_destroy(instance);
return 0;
}
测试
使用库的发布构建运行测试。如果您进行了更改或使用非默认功能进行编译,请确保在发布模式下重新构建,以便测试可以看到更改。
可以通过cargo test
运行测试,例如
$ cargo test --release -- --nocapture
要手动运行测试,请进入lib/runtime-c-api/tests
目录并运行以下命令
$ cmake .
$ make
$ make test
许可证
依赖项
~7–16MB
~224K SLoC