Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用EXPLATEN如何将C++ UIT88T数组获取到JS BLUB或UIT8阵列 在EnScript C++中,我有< /P> class MyClass { public: MyClass() {} std::shared_ptr<std::vector<uint8_t>> buffer; int getPtr() { return (int)(buffer->data()); } int getLength() { return buffer->size(); } }; EMSCRIPTEN_BINDINGS() { class_<MyClass>("MyClass").constructor() .function("getLength",&MyClass::getLength) .function("getPtr",&MyClass::getPtr, allow_raw_pointers()); }_C++_Emscripten_Arraybuffer - Fatal编程技术网

使用EXPLATEN如何将C++ UIT88T数组获取到JS BLUB或UIT8阵列 在EnScript C++中,我有< /P> class MyClass { public: MyClass() {} std::shared_ptr<std::vector<uint8_t>> buffer; int getPtr() { return (int)(buffer->data()); } int getLength() { return buffer->size(); } }; EMSCRIPTEN_BINDINGS() { class_<MyClass>("MyClass").constructor() .function("getLength",&MyClass::getLength) .function("getPtr",&MyClass::getPtr, allow_raw_pointers()); }

使用EXPLATEN如何将C++ UIT88T数组获取到JS BLUB或UIT8阵列 在EnScript C++中,我有< /P> class MyClass { public: MyClass() {} std::shared_ptr<std::vector<uint8_t>> buffer; int getPtr() { return (int)(buffer->data()); } int getLength() { return buffer->size(); } }; EMSCRIPTEN_BINDINGS() { class_<MyClass>("MyClass").constructor() .function("getLength",&MyClass::getLength) .function("getPtr",&MyClass::getPtr, allow_raw_pointers()); },c++,emscripten,arraybuffer,C++,Emscripten,Arraybuffer,我可以从JS中调用getLength和getPtr,但我不知道如何让JS将其视为ArrayBuffer,以便下载为Blob 如何将缓冲区数据以类似的代码下载到JS中。目前WebAssembly仅定义JS和WASM之间通信的基本数字类型。没有对象类型或数组类型。EnScript已经做了一些黑客来制作C++类JS绑定,但它们不是WASM标准。 WebAssembly.Memory 但是有一种方法可以获得阵列。即使没有API,JS也可以直接访问WASM模块的内部内存。WASM有一个线性内存模型,线性内

我可以从JS中调用getLength和getPtr,但我不知道如何让JS将其视为ArrayBuffer,以便下载为Blob


如何将缓冲区数据以类似的代码下载到JS中。

目前WebAssembly仅定义JS和WASM之间通信的基本数字类型。没有对象类型或数组类型。EnScript已经做了一些黑客来制作C++类JS绑定,但它们不是WASM标准。 WebAssembly.Memory 但是有一种方法可以获得阵列。即使没有API,JS也可以直接访问WASM模块的内部内存。WASM有一个线性内存模型,线性内存通过接口连接。内存是一个单阵列缓冲区,WASM模块将其用作堆内存区域,并在其中进行内存分配,例如malloc

1.作为UInt8Array访问它 这是什么意思?这意味着从getPtr得到的JS端的指针整数实际上是WebAssembly.Memory.buffer的偏移量

Emscripten自动生成JS这是从一个名为code的模板生成的,该模板创建WebAssembly.Memory。您可以自己搜索Emscripten生成的代码,并且应该能够找到类似的行:

因此,您可以通过模块['WASMEMORY']访问WASM模块使用的ArrayBuffer。缓冲区:

2.Emscripten HEAPU8 或者,Emscripten提供:定义的HEAPU8、HEAPU16、HEAPU32等。所以你可以这样做:

let instance = new Module.MyClass();

// ... Do something

let ptr = instance.getPtr();
let size = instance.getLength();
let my_uint8_buffer = new Uint8Array(Module.HEAPU8.buffer, ptr, size);
使用HEAPU8会更安全,因为HEAPU8是有文档记录的,而模块['wasmemory']的属性名有点没有文档记录,可能会发生更改;但是他们做同样的事情

3.使用EnScript::仅ValC++

ESPROSTEN还提供了一个类,要求C++开发人员在JS和C++之间进行交互。为了方便起见,本文对任何JS/C++类型进行了抽象。您可以使用此命令获取阵列

这是来自和格伦评论的示例:

#include <emscripten/bind.h>
#include <emscripten/val.h>

emscripten::val getInt8Array() {
    return emscripten::val(
       emscripten::typed_memory_view(buffer->size(),
                                     buffer->data()));
}

EMSCRIPTEN_BINDINGS() {
    function("getInt8Array", &getInt8Array);
}
然后可以在JS端调用getInt8Array来获取类型化数组

结论
这里建议使用3个选项从WASM获取数组。无论如何,我认为您应该理解WebAssembly.Memory和选项1背后的概念,因为这是从WASM获取数组的最低级别,而且最重要的是,这是非托管和不安全的内存访问,因此在C/C++端释放或修改对象时,很容易损坏数据。对于这种特殊情况,需要了解底层含义。

那么你的意思是想在JS端将std::vector buffer转换为ArrayBuffer?这些都是很好的建议,有助于我理解链接。通过查看,我发现我还可以使用val getInt8Array{return valtyped_memory_viewbuffer->size,buffer->data;}并从JS调用getInt8Array。格伦,我以前不知道这件事,因为我只为C代码做了C,但是它看起来像EnScript::Valv值得研究C++的DEVS。我也会添加这个东西。很好的添加来完成答案。谢谢
let instance = new Module.MyClass();

// ... Do something

let ptr = instance.getPtr();
let size = instance.getLength();
let my_uint8_buffer = new Uint8Array(Module.HEAPU8.buffer, ptr, size);
#include <emscripten/bind.h>
#include <emscripten/val.h>

emscripten::val getInt8Array() {
    return emscripten::val(
       emscripten::typed_memory_view(buffer->size(),
                                     buffer->data()));
}

EMSCRIPTEN_BINDINGS() {
    function("getInt8Array", &getInt8Array);
}