使用wasm包构建时在Rust和JavaScript之间传递字符串
我正在构建一个Chrome扩展,我选择使用一些WebAssembly功能。我使用wasm包来构建源代码,因为它提供了一个使用wasm包构建时在Rust和JavaScript之间传递字符串,rust,webassembly,rust-cargo,wasm-bindgen,wasm-pack,Rust,Webassembly,Rust Cargo,Wasm Bindgen,Wasm Pack,我正在构建一个Chrome扩展,我选择使用一些WebAssembly功能。我使用wasm包来构建源代码,因为它提供了一个--目标web,降低了插入wasm函数的复杂性。在Rust和JS之间传递整数值可以无缝地工作,但我似乎无法将字符串传递给Rust,反之亦然 以下是我的工作内容: #[wasm#u bindgen] 外部“C”{ fn警报(s:&str); #[wasm_bindgen(js_namespace=console)] fn日志(x:&str); } #[瓦斯穆宾根] 发布外部“C
--目标web
,降低了插入wasm函数的复杂性。在Rust和JS之间传递整数值可以无缝地工作,但我似乎无法将字符串传递给Rust,反之亦然
以下是我的工作内容:
#[wasm#u bindgen]
外部“C”{
fn警报(s:&str);
#[wasm_bindgen(js_namespace=console)]
fn日志(x:&str);
}
#[瓦斯穆宾根]
发布外部“C”fn添加两个(x:i32)->i32{
x+2
}
#[瓦斯穆宾根]
发布fn hello(名称:&str){
log(“Hello”)/问题在于如何加载代码:
(异步函数(){
//获取JS文件
const src=wait import(“/pkg/rusty.js”);
//获取wasm文件。
const wasm_src=chrome.extension.getURL(“/pkg/rusty_bg.wasm”);
//src有一个导出函数“default”,用于初始化WebAssembly模块。
设wasm=wait src.default(wasm_src);
你好(“堆栈溢出”);
})();
wasm
从返回。默认(…)
是具有原始WebAssembly导出的对象,该导出只能对原始编号进行操作
在本例中发生的情况是,wasm.hello
需要两个整数-指针和WebAssembly内存中字符串的长度-JavaScript愉快地转换“堆栈溢出”
到0
,并提供另一个0
作为默认值,这就是为什么最后会出现一个空字符串
相反,您需要的是负责正确转换的函数的包装版本。这些直接在导入.js
文件时生效:
(异步函数(){
//获取JS文件
const rusty=wait import(“/pkg/rusty.js”);
//获取wasm文件。
const wasm_src=chrome.extension.getURL(“/pkg/rusty_bg.wasm”);
//rusty有一个导出函数“default”,用于初始化WebAssembly模块。
等待生锈。默认值(wasm_src);
rusty.hello(“堆栈溢出”);//它可以工作!
})();
您的问题可能由的答案来回答。如果不是,请您的问题解释差异。否则,我们可以将此问题标记为已回答。最小的区别在于,发布的问题不使用wasm bindgen。这意味着我应该能够传递一个字符串,因为它会对我的行为造成所有繁重的工作lf.您显示的所有选项都应该确实有效;上面代码中似乎没有显示的问题是如何获取调用函数的wasm
对象。请确保您正在导入生成的主要JavaScript模块,而不仅仅是直接导入WebAssembly文件。@r相反。我正在chrome中运行此操作扩展。这意味着我必须使用wasm pack来获得可用的JS输出,这些输出可以轻松地导入到我的扩展文件中。wasm pack build--target web--features wee_alloc
。它输出一个带有JS的pkg目录,可以在chrome中加载而无需任何导入errors@mar-蒂娜,这仍然不能说明你是如何得到wasm的de>object。你能更新代码片段以显示你是如何导入生成的包的吗?很好!非常感谢。我花了一天的时间才找到这个。
(async function() {
// Get the JS File
const src = await import("/pkg/rusty.js");
// Fetch the wasm file.
const wasm_src = chrome.extension.getURL("/pkg/rusty_bg.wasm");
//src has an exported function 'default' that initializes the WebAssembly module.
let wasm = await src.default(wasm_src);
wasm.hello("stack-overflow");
})();