如何将指针从 Rust 传递到外部 WASM 模块函数,以便它可以修改该值?

问题描述 投票:0回答:0

我试图让用户在 HTML 页面中选择一个文件 .wasm,然后将该模块中的一个函数传递到已经加载的 Rust wasm 模块中。之后我想调用那个函数并传递指针,这样它就可以修改我的 Rust 模块内部的值。

然而,我尝试过的通常在动态加载库时有效的方法在这里不起作用。

我希望它能修改

val
变量。但什么都没有改变。

用户加载的外部模块

#[wasm_bindgen]
pub fn modify(val: *mut u8) {
    let val = unsafe { &mut *val };
    *val = 5;
}

Rust 模块从外部模块调用函数

#[wasm_bindgen]
pub fn call_modify(modify: Function) {
    let mut val = 7u8;
    let val_ptr = &mut val as *mut u8;

    console_log!("before {val}");

    modify.call1(&JsValue::NULL, &JsValue::from(val_ptr)).unwrap();

    console_log!("after {val}");
}

Index.html 允许用户选择外部模块,然后将函数传递给我的 Rust 模块

button id="load-wasm-file-btn">Load Wasm File</button>
    <input type="file" id="wasm-file-input" accept=".js" style="display: none;" />
    <button id="load-wasm-data-btn">Load Wasm Data</button>
    <input type="file" id="wasm-data-input" accept=".wasm" style="display: none;" />
    <script type="module">
        import init, {call_modify} from "./pkg/dynamic_wasm_loading.js";
        await init();

        var wasm_url;

        document.getElementById("load-wasm-data-btn").addEventListener("click", () => {
            document.getElementById("wasm-data-input").click();
        });

        document.getElementById("wasm-data-input").addEventListener("change", async (e) => {
            const file = e.target.files[0];

            wasm_url = URL.createObjectURL(file);
        });

        document.getElementById("load-wasm-file-btn").addEventListener("click", () => {
            document.getElementById("wasm-file-input").click();
        });

        document.getElementById("wasm-file-input").addEventListener("change", async (e) => {
            // load javascript file and execute function inside it called 'execute'

            const file = e.target.files[0];

            // Create a URL from the file object
            const fileURL = URL.createObjectURL(file);

            // Dynamically import the module
            import(fileURL).then(async (module) => {
            // Set the computer_func to the module's 'execute' function
                console.log(wasm_url);
                console.log("initializing...");
                console.log(module);

                await module.default(wasm_url);
                console.log("initialized");
                console.log(module.modify);
                call_modify(module.modify);
            }).catch((error) => {
                console.error('Error importing module:', error);
            });
        });
    </script>
html rust memory module webassembly
© www.soinside.com 2019 - 2024. All rights reserved.