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日

#1451WebAssembly

每月42次下载

MIT 许可证

2MB
30K SLoC

Wasmer logo

Build Status License Join the Wasmer Community Number of downloads from crates.io Wasmer C API Documentation

Wasmer运行时C API

Wasmer是一个独立的JIT WebAssembly运行时,旨在完全兼容WASI、Emscripten、Rust和Go。了解更多

这个crate公开了Wasmer运行时的C和C++ API。

用法

可以在该crate的源代码树中找到C和C++头文件,分别是wasmer.hwasmer.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

许可证

Wasmer主要在MIT许可证 (LICENSE) 下分发。

依赖项

~7–16MB
~224K SLoC