标签: webassembly

将JavaScript字符串传递给编译为WebAssembly的Rust函数

我有这个简单的Rust函数:

#[no_mangle]
pub fn compute(operator: &str, n1: i32, n2: i32) -> i32 {
    match operator {
        "SUM" => n1 + n2,
        "DIFF" => n1 - n2,
        "MULT" => n1 * n2,
        "DIV" => n1 / n2,
        _ => 0
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在成功地将其编译为WebAssembly,但是没有设法将operator参数从JS 传递给Rust.

调用Rust函数的JS行如下所示:

instance.exports.compute(operator, n1, n2);
Run Code Online (Sandbox Code Playgroud)

operator是JS Stringn1,n2是JS Number秒.

n1并且n2正确传递并且可以在编译函数内部读取,所以我猜问题是我如何传递字符串.我想它是作为从JS到WebAssembly的指针传递,但无法找到有关其工作原理的证据或材料.

我没有使用Emscripten并希望将其保持独立(编译目标wasm32-unknown-unknown),但我看到它们将其编译的函数包装起来Module.cwrap,也许这可能会有所帮助?

javascript string rust webassembly

7
推荐指数
1
解决办法
1541
查看次数

如何使用HACL*wasm库?

项目珠穆朗玛峰上的好人们编写了一个正式验证的加密库,称为HACL*,用于Web组装.遗憾的是,没有使用此处定义的代码的示例.

我用Version 71.0.3578.98 (Official Build) (64-bit)Chrome 测试了代码.

这实际上是我在客户端上尝试的,以获得一个有效的例子.

      var module = HaclLoader().then(function(m) {
        var state_buffer = new ArrayBuffer(32);
        var state = new Uint32Array(state_buffer);
        var message_buffer = new ArrayBuffer(32);
        var message = new Uint8Array(message_buffer);
        for (var i = 0; i < message.length; i++) {
          message[i] = i;
        }             
        var hash_buffer = new ArrayBuffer(32);
        var hash = new Uint8Array(hash_buffer);
        m._Hacl_SHA2_256_init(state);
        m._Hacl_SHA2_256_update(state, message);
        m._Hacl_SHA2_256_finish(state, hash);
        console.log(hash);
      });
Run Code Online (Sandbox Code Playgroud)

引用的代码尝试使用此处定义的函数.不幸的是,这个示例代码不起作用,哈希最终成为零数组.

emscripten webassembly

7
推荐指数
1
解决办法
61
查看次数

使用Skia库编译cpp wasm模块遇到错误

我正在尝试在WASM解决方案中使用SKIA lib。首先,我使用波纹管配置将Skia编译为wasm位代码:

/bin/gn gen ./out/Build-wasm-Release/Release --args="cc=\"emcc\" extra_cflags_cc=[\"-frtti\",\"-s\",\"USE_FREETYPE=1\"] cxx=\"em++\" extra_cflags=[\"-Wno-unknown-warning-option\",\"-s\",\"USE_FREETYPE=1\",\"-s\",\"USE_LIBPNG=1\"] \
is_debug=false \
is_official_build=true \
is_component_build=false \
target_cpu=\"wasm\" \
\
skia_use_egl=false \
skia_use_vulkan=false \
skia_use_libwebp=false \
skia_use_libpng=true \
skia_use_lua=false \
skia_use_dng_sdk=false \
skia_use_fontconfig=false \
skia_use_libjpeg_turbo=false \
skia_use_libheif=false \
skia_use_expat=false \
skia_use_vulkan=false \
skia_use_freetype=false \
skia_use_icu=false \
skia_use_expat=false \
skia_use_piex=false \
skia_use_zlib=true \
skia_enable_gpu=true \
skia_enable_pdf=false"
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下命令编译自己的代码时,它已成功编译:

em++ multiply.cpp -o multiply.js -s EXPORTED_FUNCTIONS="['_float_multiply','_float_multiply_array','_sample_array_rtn','_sample_array_float_rtn','_msd_main']"-s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'  -s ALLOW_MEMORY_GROWTH=1 -s USE_WEBGL2=1 -s NO_EXIT_RUNTIME=1 -s USE_LIBPNG=1 -s WASM=1 -s MODULARIZE=1 -s FORCE_FILESYSTEM=0 -I$SKIAPATH/include/ -I$SKIAPATH/include/gpu -I$SKIAPATH/include/core …
Run Code Online (Sandbox Code Playgroud)

c++ skia webassembly

7
推荐指数
0
解决办法
92
查看次数

可以从编译为wasm的C#中调用C ++吗?

有谁知道当前是否可以从编译成wasm的C#中调用C ++(或者更精确地说是Uno Platform应用程序)?

我对WebAssembly相当陌生,但是我设法将C ++函数编译为wasm并从JavaScript调用它。我还从Uno获得了一个快速入门项目(该项目可让您将用C#/ XAML编写的UWP应用编译为wasm并在浏览器中运行)。

我每天都用C#和C ++编写程序,但是我不知道是“两种语言之间的互操作” + WebAssembly组合。我假设我需要将两种语言的代码编译为2个单独的wasm文件,然后以某种方式将它们链接在一起或在运行时加载C ++。今天我什至想做些什么吗?

编辑:要明确:的想法是所有代码最终都将编译为wasm。

c# c++ webassembly uno-platform

7
推荐指数
1
解决办法
252
查看次数

如何从 web-sys 访问 HTMLDocument?

使用web-sys crate,我想HTMLDocument.

我想做这样的事情。确实这行不通。

let window = web_sys::window().unwrap();
let document = window.document().unwrap();
let cookie = document.cookie().unwrap();
//no method named `cookie` found for type `web_sys::features::gen_Document::Document` in the current scope
Run Code Online (Sandbox Code Playgroud)

我需要访问HTMLDocument结构而不是Document结构。

Cargo.toml 已启用功能。

~snip~
[dependencies.web-sys]
version = "0.3.4"
features = [
  "WebSocket",
  'Window',
  'Document',
  'HtmlDocument',
]
Run Code Online (Sandbox Code Playgroud)

根据API,它应该可以在以下位置访问Window,例如Document.

它似乎不适用于以下内容:

let html_document = window.html_document().unwrap();
Run Code Online (Sandbox Code Playgroud)

文档来看,HTMLDocument应该扩展Document

我知道 Rust 中没有继承,但我无法将其转换Document为这样:

let html_document = web_sys::HtmlDocument::from(document); …
Run Code Online (Sandbox Code Playgroud)

rust webassembly

7
推荐指数
1
解决办法
2371
查看次数

实例化 WASM 模块时出错:“模块不是对象或函数”

我试图在 node.js 中本地实例化一个 .wasm 文件。目标是在本地运行二进制文件并重现网页的功能。这是我的最小可重现示例:

const fetch = require("node-fetch");

const importObject = {
  imports: {
    imported_func: function(arg) {
      console.log(arg);
    }
  }
};

fetch('https://www.supremenewyork.com/ticket.wasm').then(response =>
  response.arrayBuffer()
).then(bytes => {
  let mod = new WebAssembly.Module(bytes);
  let instance = new WebAssembly.Instance(mod, importObject);
  instance.exports.exported_func();
})
Run Code Online (Sandbox Code Playgroud)

我得到的错误是: TypeError: WebAssembly.Instance(): Import #0 module="wasi_unstable" error: module is not an object or function

我看到了一些类似问题的问题,但没有提供真正的解决方案。这是我第一次与 wasm 合作,所以我很迷茫。

谢谢你的帮助。

javascript node.js webassembly

7
推荐指数
1
解决办法
1711
查看次数

编译为 wasm 时替代 ctor/inventory 的方法?

ctor板条箱目前不支持 Web 程序集,尽管有关于如何解决此问题的积极讨论

尽管我很清楚与来自 C++ 的静态初始化相关的问题,但能够在启动时向工厂注册事物是一项非常方便的功能,并且在很多情况下是避免违反 DRY 原则所必需的。如果没有它,每次您想为工厂添加新的可能性时,您都必须向 中添加单独的代码main()行,如果您需要导入新函数,则可能会添加更多行。这很快就会变得乏味。

我想知道是否有可能使用过程属性宏和build.rs. 该宏将用于标记我想要注册的函数,它的实现会将"crate::your::registered_function"这些函数的模块路径 ( )保存到文件中某处的一侧,否则只是一个传递。然后build.rs将生成一个调用文件中列出的所有函数的函数,我将main()手动调用该函数。

  • 有没有不同的技巧可以代替?
  • 在我可以用作参考的地方是否已经存在这个实现?
  • 过程宏实际上如何为要调用的函数生成模块路径?有module_path!,但如果从程序宏的定义中调用它会给模块路径为宏,而不是与什么的TokenStream将会扩展到相关的模块路径。宏可以生成对 的调用,module_path!但要等到最终程序运行时才会进行评估。

rust webassembly rust-macros

7
推荐指数
0
解决办法
209
查看次数

如何在 Wasm 中制作协程?

我试图允许用户在 C 中调用“main”并让“main”等待 requestAnimationFrame 继续执行。即 main 可以有一个 while(1) 循环,而在 main 中,会有一个“waitForAnimationFrame”...或者允许实现像 sleep(...) 这样的函数。

我一直在挖掘 emscripten 如何实际执行此操作的内部工作原理,但它看起来不太适合我的目的。这个页面涉及了许多与我想做的事情非常接近的事情,但是当以这种方式实现时,它们似乎都没有实际工作。https://kripken.github.io/blog/wasm/2019/07/16/asyncify.html

更具体地说,似乎最好的方法是保存堆栈,然后通过 Wasm 中的虚拟函数“返回”,然后当事件在 javascript 中发生时,我可以调用一个虚拟函数但返回到正确的位置。但是,这将需要调用堆栈,它似乎不是实际的一部分STACKTOP,或者通过stackSave和可用stackRestore。最值得注意的是,无论我似乎做什么似乎都setThrew不起作用。即它只是立即返回。

我还尝试使用一些启动/停止展开功能,但由于从 Javascript 返回到 Wasm 时出现错误,因此无法在那里取得进展。

这里有什么想法吗?我真的不能像某些人想要的那样使 main 异步并期望它仍然以相同的方式工作。

编辑:好的,这是我正在测试的一些示例。

示例 1:保存/恢复堆栈

在 C 中有这两个函数:

void waittask()
{
    volatile int sentinel = 85755555;
    consolelog("waittask1");
    waitout();
    consolelog("waittask2");
}

void waitret()
{
    volatile int sentinel = 12994423;
    consolelog("waitret1");
    stacksetup(sentinel);
    stacksetup(sentinel);
    consolelog("waitret2");
}
Run Code Online (Sandbox Code Playgroud)

使用 JavaScript 函数:


            stacksetup : function() {
                console.log( "STACK SETUP" ); …
Run Code Online (Sandbox Code Playgroud)

javascript c webassembly

7
推荐指数
0
解决办法
386
查看次数

Blazor EventCallback with Multiple Params - how to respond to event in parent host control

I have a blazor component with an EventCallBack parameter that utilized the new struct format allowing multiple arguments

[Parameter] public EventCallback<(EmployeeShiftDay, DateTime, DateTime)> NewDayScrolledIntoView { get; set; }
Run Code Online (Sandbox Code Playgroud)

eventcallback is invoked in child normally as such

await NewDayScrolledIntoView.InvokeAsync(p1, p2, p3);
Run Code Online (Sandbox Code Playgroud)

In my host page I have the corresponding method to handle the invoke

private void NewDayInView(EmployeeShiftDay dayInView, DateTime weekStart, DateTime weekEnd)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

How do I add the markup for this EventCallBack in the host component - I need …

webassembly blazor .net-5

7
推荐指数
3
解决办法
3208
查看次数

go channel 和 goroutines 如何转换为 webassembly?

很长一段时间以来一直在用 Go 编程,最近开始研究 WebAssembly。虽然大多数事情都很简单,但在将一些 Go 特定的结构(如通道和 goroutines)转换为 wasm 时有一个问题。在 JS 中使用时,它们的行为是否与在 Go 中使用时的行为方式相同(例如,goroutines 作为异步函数公开给 JS 等)?

llvm go emscripten webassembly

7
推荐指数
1
解决办法
120
查看次数

标签 统计

webassembly ×10

javascript ×3

rust ×3

c++ ×2

emscripten ×2

.net-5 ×1

blazor ×1

c ×1

c# ×1

go ×1

llvm ×1

node.js ×1

rust-macros ×1

skia ×1

string ×1

uno-platform ×1