This repository has been archived on 2023-11-05. You can view files and clone it, but cannot push or open issues or pull requests.
wasm-micro-runtime/samples/native-lib
YAMAMOTO Takashi 825544ddab
samples/native-lib: use the same shared lib name as product-mini (#1669)
Use the shared lib name `libiwasm` instead of static lib name `vmlib`
2022-11-01 21:55:43 +08:00
..
wasm-app samples/native-lib: Add an example to use wamr API from native lib (#1649) 2022-10-28 19:31:21 +08:00
CMakeLists.txt samples/native-lib: use the same shared lib name as product-mini (#1669) 2022-11-01 21:55:43 +08:00
README.md samples/native-lib: Add an example to use wamr API from native lib (#1649) 2022-10-28 19:31:21 +08:00
test_add.c samples/native-lib: Fix exec_env type (#1557) 2022-10-06 20:21:21 +08:00
test_hello2.c samples/native-lib: Add an example to use wamr API from native lib (#1649) 2022-10-28 19:31:21 +08:00
test_hello.c samples/native-lib: Add a bit more complicated example (#1643) 2022-10-27 15:06:14 +08:00
test_sqrt.c samples/native-lib: Fix exec_env type (#1557) 2022-10-06 20:21:21 +08:00

"native-lib" sample introduction

This sample demonstrates how to write required interfaces in native library, build it into a shared library and register the shared library to iwasm.

The native library should provide get_native_lib API for iwasm to return the native library info, including the module name, the native symbol list and the native symbol count, so that iwasm can use them to regiter the native library, for example:

static int
foo_wrapper(wasm_exec_env_t exec_env, int x, int y)
{
    return x + y;
}

#define REG_NATIVE_FUNC(func_name, signature) \
    { #func_name, func_name##_wrapper, signature, NULL }

static NativeSymbol native_symbols[] = {
    REG_NATIVE_FUNC(foo, "(ii)i")
};

uint32_t
get_native_lib(char **p_module_name, NativeSymbol **p_native_symbols)
{
    *p_module_name = "env";
    *p_native_symbols = native_symbols;
    return sizeof(native_symbols) / sizeof(NativeSymbol);
}

Preparation

Please install WASI SDK, download the wasi-sdk release and extract the archive to default path /opt/wasi-sdk.

Build the sample

mkdir build
cd build
cmake ..
make

iwasm, one wasm module test.wasm and two shared libraries libtest_add.so, libtest_sqrt.so will be generated.

Run workload

Linux

cd build
./iwasm --native-lib=./libtest_add.so --native-lib=./libtest_sqrt.so --native-lib=./libtest_hello.so --native-lib=./libtest_hello2.so wasm-app/test.wasm

macOS

cd build
./iwasm --native-lib=libtest_add.dylib --native-lib=libtest_sqrt.dylib --native-lib=libtest_hello.dylib --native-lib=libtest_hello2.dylib wasm-app/test.wasm

The output is:

Hello World!
10 + 20 = 30
sqrt(10, 20) = 500
test_hello("main", 0x0, 0) = 41
malloc(42) = 0x24e8
test_hello("main", 0x24e8, 42) = 41
Message from test_hello: Hello, main. This is test_hello_wrapper!
test_hello2("main", 0x0, 0) = 85
malloc(86) = 0x24e8
test_hello2("main", 0x24e8, 86) = 85
Message from test_hello2: Hello, main. This is test_hello2_wrapper! Your wasm_module_inst_t is 0x7fd443704990.