Wasmer's logo

wasmer-c-api


Visit the repository License Join the Wasmer Community
Wasmer Runtime C API

Wasmer is a standalone WebAssembly runtime for running WebAssembly outside of the browser, supporting WASI and Emscripten.

The Wasmer Runtime C API exposes a C and a C++ API to interact with the Wasmer Runtime, so you can use WebAssembly anywhere.

Usage

The shared object files and the headers will be automatically available inside the Wasmer installed path.

Please check the following docs to see how to install Wasmer in your system.

The C (wasmer.h) and C++ (wasmer.hh) header files can be found in the Wasmer include directory:

wasmer config --includedir

The runtime shared libraries (.so, .dylib, .dll) can be found in the Wasmer lib directory:

wasmer config --libdir

Note: You can also download the libraries or header files directly

from Wasmer release page.

The full C API documentation can be found here: https://wasmerio.github.io/wasmer/c-api/

Here is a simple example to use the 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);
return 0;
}

Examples

You can check more examples of how to use the Wasmer C API here:

https://docs.wasmer.io/integrations/examples

pkg-config

The Wasmer binary ships with an utility tool that outputs config in the pkg-config format.

You can use it like:

wasmer config --pkg-config > $PKG_CONFIG_PATH/wasmer.pc

License

Wasmer is primarily distributed under the terms of the MIT license (LICENSE).

WASMER_OK
@ WASMER_OK
Definition: wasmer.h:131
wasmer_value_t
Definition: wasmer.h:260
wasmer_instantiate
enum wasmer_result_t wasmer_instantiate(struct wasmer_instance_t **instance, uint8_t *wasm_bytes, uint32_t wasm_bytes_len, struct wasmer_import_t *imports, int imports_len)
wasmer_import_t
Definition: wasmer.h:336
wasmer_result_t
wasmer_result_t
Definition: wasmer.h:127
wasmer_value_t::tag
wasmer_value_tag tag
Definition: wasmer.h:264
WASM_I32
@ WASM_I32
Definition: wasmer.h:151
wasmer_instance_destroy
void wasmer_instance_destroy(struct wasmer_instance_t *instance)
wasmer_instance_t
Definition: wasmer.h:180
wasmer_instance_call
enum wasmer_result_t wasmer_instance_call(struct wasmer_instance_t *instance, const char *name, const struct wasmer_value_t *params, uint32_t params_len, struct wasmer_value_t *results, uint32_t results_len)
wasmer_value::I32
int32_t I32
Definition: wasmer.h:232
wasmer.h
wasmer_value_t::value
union wasmer_value value
Definition: wasmer.h:268