我试图让用户在 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>