首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将一个数组从JavaScript传递给使用Emscripten编译的Rust?

如何将一个数组从JavaScript传递给使用Emscripten编译的Rust?
EN

Stack Overflow用户
提问于 2017-05-18 12:03:05
回答 1查看 940关注 0票数 2

下面是我基于使用数组从JavaScript调用C代码的示例一个不带参数的从JavaScript调用Rust函数的示例编写的Rust和一个不带参数的从JavaScript调用Rust函数的示例代码。

display-array.rs

代码语言:javascript
运行
复制
#![feature(link_args)]

#[link_args = "-s EXPORTED_FUNCTIONS=['_display_array']"]
extern {}

#[no_mangle]
pub fn display_array(array: &[f32]) {
    println!("Rust - array size: {}", array.len());
    println!("Rust - array: {:?}", array);
}

fn main() {
    /* Intentionally left blank */
}

callDisplayArray.js

代码语言:javascript
运行
复制
var Module = require("./display-array.js");

// Import function from Emscripten generated file
display_array = Module.cwrap('display_array', 'number', ['number']);

var data = new Float32Array([1, 2, 3, 4, 5]);

// Get data byte size, allocate memory on Emscripten heap, and get pointer
var nDataBytes = data.length * data.BYTES_PER_ELEMENT;
var dataPtr = Module._malloc(nDataBytes);

// Copy data to Emscripten heap (directly accessed from Module.HEAPU8)
var dataHeap = new Uint8Array(Module.HEAPU8.buffer, dataPtr, nDataBytes);
dataHeap.set(new Uint8Array(data.buffer));

console.log("Javascript - nDataBytes: " + nDataBytes + " , dataHeap.byteOffset: " + dataHeap.byteOffset + " , dataHeap: " + dataHeap);

display_array(dataHeap.byteOffset);

通过运行以下命令,我成功地将display-array.rs代码编译成display-array.js:

代码语言:javascript
运行
复制
rustc --target asmjs-unknown-emscripten display-array.rs

我使用命令运行Javascript代码:

代码语言:javascript
运行
复制
node callDisplayArray.js

以下是调试消息:

代码语言:javascript
运行
复制
Javascript - nDataBytes: 20 , dataHeap.byteOffset: 5260840 , dataHeap: 0,0,128,63,0,0,0,64,0,0,64,64,0,0,128,64,0,0,160,64

Rust - array size: 0

Rust - array: []

Rust中的数组是空的。我对铁锈和应征信都很陌生,所以我真的迷失在这里了。也许我不应该像在使用C与Emscripten一起使用C时那样调用Module._malloc,而应该使用其他的东西?

EN

回答 1

Stack Overflow用户

发布于 2017-05-23 01:51:09

谢谢你的帮助。我编辑了代码以使用*const f32,现在我能够打印数组的内容:

代码语言:javascript
运行
复制
pub fn display_array(array_ptr: *const f32, array_length: isize) {
    for offset in 0..array_length {
        unsafe { println!("Rust - value in array: {:?}", *array_ptr.offset(offset)); }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44047230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档