标签: emscripten

使用 Emscripten 将指向 std::vector 的指针传递给 Javascript,并使用它

我想在 C++ 中创建一个std::vector(特别是 a std::vector<string>),然后将它(或者更确切地说,指向它的指针)传递给 Javascript,以便能够从直接编写的 Javascript 访问其数据/函数。

到目前为止我可以获得整数指针:

vector<string> myVector;
myVector.push_back("First item");
myVector.push_back("Second item");

EM_ASM_ARGS({
  // Prints out an integer value of the pointer,
  // but I would like to access the object members/data 
  // of myVector
  console.log($0);
}, &myVector);
Run Code Online (Sandbox Code Playgroud)

我在http://kripken.github.io/emscripten-site/docs/api_reference/bind.h.html#register_vector__cCPhttp://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript找到了信息/embind.html#built-in-type-conversions关于该register_vector函数

#include <emscripten/bind.h>
EMSCRIPTEN_BINDINGS(Wrappers) {
  register_vector<std::string>("VectorString");
};
Run Code Online (Sandbox Code Playgroud)

它可以用来从 Javascript 世界创建一个新的向量:

var myVector = new Module.VectorString();
Run Code Online (Sandbox Code Playgroud)

但我不知道如何使用它来访问 C++ 世界中已经存在的向量。

Module.Runtime.dynCall('v', $0, []);如果我尝试在指针上使用,如/sf/answers/2052360831/中传递函数指针时,则会出现错误:

Invalid function pointer '380' called …

javascript c++ emscripten

2
推荐指数
1
解决办法
5340
查看次数

在 asm.js 中的函数之间传递双数组

我有一个 C 函数编译到 asm.js 中,参数如下:

void myfunc(double v1[], double v2[], int v_size, double c)
Run Code Online (Sandbox Code Playgroud)

它接受一个数组 ( v1),应用一个转换,然后v2用输出填充另一个相同大小的数组 ( )。

我编译它,然后运行以下JS代码:

v1 = new Array(1.0, 1.5, 2.0);
v2 = Module._malloc(8 * v1.length);

Module.ccall("myfunc", null, ["array", "number", "number", "number"], [v1, v2, v1.length, 2]);
Run Code Online (Sandbox Code Playgroud)

但是,当我运行时,getValue(v2, "double")我得到 1.297703e-318(这是错误的),而当我运行getValue(v2 + 8, "double")getValue(v2 + 16, "double")它返回 0(这也是错误的)。

我已将 C 函数简化为仅控制台注销其内容v1并打印出垃圾数据,因此至少在读取传入的双数组时存在问题。更具体的问题是:

  1. 如何正确地将双数组传入 asm.js 函数?
  2. 如何从 asm.js 函数正确返回双精度数组?

javascript c emscripten asm.js

2
推荐指数
1
解决办法
733
查看次数

如何在Googletest框架的多个测试中将全局变量用于“配置”

我正在使用C ++的Google测试框架。每个文件都包含一个config.hpp,它定义了一个全局配置变量。我想在变量而不是编译时const或中定义我的配置constexpr。如何定义依赖项,以便在链接在一起的不同文件中具有相同的变量?我必须使用单身人士吗?我可以避免吗?有没有更好的推荐方法来使用多个测试文件的xUnit样式?

我的配置文件 config.hpp

#pragma once
struct {
    const float tolerance = 0.001;
    // ...
} CONFIG_VAR;
Run Code Online (Sandbox Code Playgroud)

每个测试* .cpp源文件都类似于:

#include "gtest/gtest.h"
#include "core/config.hpp"
TEST(a, b) { ... }
Run Code Online (Sandbox Code Playgroud)

我的主文件:

#include "gtest/gtest.h"
int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
Run Code Online (Sandbox Code Playgroud)

我使用以下命令进行编译和链接:

em++  -I $GTEST_ROOT/googletest/include main_all_tests.cpp test_*.cpp
Run Code Online (Sandbox Code Playgroud)

PS。我的问题是变量CONFIG_VAR的多个定义。

我的解决方案基于一个相关的问题

c++ googletest emscripten

2
推荐指数
1
解决办法
2011
查看次数

最新的 emscripten 使用什么版本的 LLVM?

最新的emscripten使用什么版本的 LLVM ?我用谷歌搜索了一段时间,但找不到任何信息。背景是我有一些需要 clang-5.0 的 C++ 代码——它用 emscripten 编译的可能性有多大?或者至少需要 clang-4.0 的代码?

llvm emscripten webassembly

2
推荐指数
1
解决办法
1060
查看次数

使用指定的 HTML 输出从 CMake 项目生成 Web 程序集

我有一个要编译为 Web 程序集的 CMake 项目。为此,我使用了项目基本文件夹中的以下命令:

mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/emsdk/emscripten/1.38.6/cmake/Modules/Platform/Emscripten.cmake -G "Unix Makefiles"
Run Code Online (Sandbox Code Playgroud)

这成功地(或至少我认为)生成了一个.wasm文件和一个.js文件以及各种 cmake 和 make 文件。

我还希望它生成一个 html 文件,就像你可以使用emcc(即emcc example.c -s WASM=1 -o output.html)。

是否有可能做到这一点?

cmake emscripten webassembly

2
推荐指数
1
解决办法
2762
查看次数

如何从 C 代码生成带有 i64 而不是 i32 的 Webassembly (WAT)

我正在尝试使用 i64 生成一个 .wat 文件,但它只是编译为 i32。

在我使用 int 和 int64_t 测试的 C 代码中,但我没有成功。

这是C代码:

#include <stdio.h>
#include <stdint.h>

#define MAX 64

int main(void) {
    int64_t v1[MAX], v2[MAX], v3[MAX];
    int64_t i;

    for(i = 0; i < MAX; i++)
       v3[i] = v1[i] + v2[i];

    for(i = 0; i < MAX; i++)
        printf("%llu\n", v3[i]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后我使用 CLI 编译为 .wasm 和 .wat 格式:

$ emcc -Oz ex1.c -s WASM=1 -s SIDE_MODULE=1 -s ONLY_MY_CODE=1 -o ex1.wasm
$ wasm2wat ex1.wasm -o ex1.wat
Run Code Online (Sandbox Code Playgroud)

这是编译的 .wat …

firefox x86-64 emscripten webassembly

2
推荐指数
1
解决办法
975
查看次数

使用 emscripten 如何获取 C++ uint8_t 数组到 JS Blob 或 UInt8Array

在 emscripten C++ 中,我有

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());
}
Run Code Online (Sandbox Code Playgroud)

我可以从 JS 调用 getLength() 和 getPtr() 但我不知道如何让 JS 将其视为 ArrayBuffer 以作为 Blob 下载。

如何将缓冲区数据以某种形式导入 JS,然后我可以使用类似于https://github.com/kennethjiang/js-file-download/blob/master/file-download.js 的代码下载它。

c++ arraybuffer emscripten

2
推荐指数
1
解决办法
4427
查看次数

未捕获的类型错误:Module.cwrap 不是函数

我需要在浏览器端解码 h264 数据,因为我使用 emscripten 在 web 程序集中使用 openh264 库构建。我已经成功构建它并尝试在 java 脚本中使用它来解码 h264 数据。但是我在以下行中遇到一个错误,

var open_decoder = Module.cwrap('open_decoder', 'number', null);
Run Code Online (Sandbox Code Playgroud)

错误是:未捕获的类型错误:Module.cwrap 不是函数

如果有人使用 emscripten 构建了 openh264,请帮我找出问题。

按照我使用 emscripten 构建 openh264 的步骤。

  1. $ 源 emsdk_env.sh
  2. $./emsdk 激活最新
  3. cd openh264-js-master
  4. 制作

注意:openh264的代码已经从github(ttyridal)下载,已经有emscripten的make文件。

javascript c emscripten openh264 webassembly

2
推荐指数
1
解决办法
2309
查看次数

Webpack 使用 Emscripten 引发错误:无法解析“fs”

我在将 javascript 文件导入 vue.js 组件时遇到错误:

这是 /components 子文件夹的内容:

/startingV/src/components$ ls -lah
total 132K
drwxr-xr-x 2 marco marco 4,0K dic 26 11:22 .
drwxr-xr-x 5 marco marco 4,0K dic 26 09:32 ..
-rw-r--r-- 1 marco marco  441 nov  2  2016 Counter.vue
-rw-r--r-- 1 marco marco  441 dic 21 15:13 FormValidation.vue
-rw-r--r-- 1 marco marco 100K dic 26 10:38 js_plumbing.js
-rw-r--r-- 1 marco marco 9,3K dic 26 10:38 js_plumbing.wasm
-rw-r--r-- 1 marco marco  473 dic 26 11:14 Result.vue
Run Code Online (Sandbox Code Playgroud)

编译时:

Failed to compile. …
Run Code Online (Sandbox Code Playgroud)

javascript module emscripten vue.js webassembly

2
推荐指数
1
解决办法
1419
查看次数

Emscripten 和 Clang 在 WebAssembly 编译方面有什么区别

我知道 clang(通过使用 target=wasm32)和 emscripten 都可以将 C 代码编译成 webassembly,但它们有什么不同?

看起来他们都使用 LLVM 作为后端。其实,我什至不太明白 llvm 和 clang 之间的关系......

我已经阅读了一段时间的 WebAssembly,但我对它缺乏低级理解。非常感谢您的参与!!

llvm clang emscripten webassembly wasi

2
推荐指数
1
解决办法
500
查看次数