- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要更多关于如何在 javascript 中实现 emscripten 生成的类的信息。我在 c++ 中有以下接口(interface),但需要在 javascript 端实现它。
class OsHttp {
public:
virtual ~OsHttp() {}
virtual void request(const std::string & verb, const std::string & url, const std::string & body, const std::unordered_map<std::string, std::string> & headers, const std::shared_ptr<HttpCallback> & callback) = 0;
};
我知道下面的内容会让我开始,但我该如何实现构造函数等。
var osHttp = {
constructor: function(){}
request: function(verb, url, body, headers, callback) {
console.log('OsHttp with: ' + verb);
}
};
var OsHttpObject = Module.OsHttp.implement(osHttp);
最佳答案
如果我理解您的需求,那么您需要有某种方式在 Javascript 和 C++ 世界之间进行通信。另外,我认为如果你想使用一个在C++中实现这个接口(interface)的对象,那么要让它编译运行,就必须有一个C++中接口(interface)的具体实现。该接口(interface)的实现随后将调用 Javascript。
为此,您可以使用 EM_ASM_* macros在实现接口(interface)的类中:
class OsHttpImplementation : public OsHttp {
public:
~OsHttp()
{
EM_ASM({
// Cleanup anything in Javascript context
});
}
void request(const std::string & verb, const std::string & url, const std::string & body, const std::unordered_map<std::string, std::string> & headers, const std::shared_ptr<HttpCallback> & callback)
{
// Probably a good idea to save any shared pointers as members in C++
// so the objects they point to survive as long as you need them
int returnValue = EM_ASM_INT_V({
// Example ways of accessing data from C++
var verb = Pointer_stringify($0);
var url = Pointer_stringify($1);
var body = Pointer_stringify($2);
var callbackFunctionPointer = $3;
// Something here that makes an HTTP request, creates any objects, etc.
return 0;
}, verb.c_str(), url.c_str(), body.c_str(), callback.get());
}
};
如果您希望在 Javascript 中实际有一个对应于 C++ 对象的对象,您可能需要在 Javascript 中进行一些手动管理,以在某种工厂中创建/存储/删除对象。具体来说,它需要将它们存储在某个地方,以便 C++ 可以通过某种 key 访问正确的。指向“this”的指针可能很方便:
class OsHttpImplementation : public OsHttp {
public:
OsHttp()
{
EM_ASM_V({
var thisPointer = $0;
OsHttpFactory.construct(thisPointer);
}, this);
}
~OsHttp()
{
EM_ASM({
var thisPointer = $0;
OsHttpFactory.destruct(thisPointer);
}, this);
}
void request(const std::string & verb, const std::string & url, const std::string & body, const std::unordered_map<std::string, std::string> & headers, const std::shared_ptr<HttpCallback> & callback)
{
int returnValue = EM_ASM_INT_V({
var thisPointer = $0;
OsHttpFactory.get(thisPointer).request($1, $2, $3, $4);
}, this, verb.c_str(), url.c_str(), body.c_str(), callback.get());
}
};
在 Javascript 中实现 OsHttpFactory 有很大的自由度。你没有提到你是否想在浏览器中使用它,但如果你这样做了,并且正在使用 XMLHttpRequests,你可能会有类似的东西
(function(context) {
var store = {}
function OsHttp() {
this.request = null;
}
OsHttp.prototype.request = function(verb, url, body, callbackPointer) {
var request = this.request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (request.readyState == 4) {
// Might need other arguments if you want to pass something back to C++
Module.Runtime.dynCall('v', callbackPointer, []);
}
});
this.request.open(verb, url, true);
this.request.send();
};
OsHttp.prototype.cleanup = function() {
// Do something to cleanup in-progress requests etc.
}
context.OsHttpFactory = {
construct: function(thisPointer) {
store[thisPointer] = new OsHttp();
},
destruct: function(thisPointer) {
store[thisPointer].cleanup();
delete store[thisPointer];
},
get: function(thisPointer) {
return store[thisPointer];
}
};
})(window);
然后在 C++ 中,您可以将它用作标准类:
// Run constructors
auto osHttp = new OsHttpImplementation();
// Make request
osHttp->request(....);
// Run destructors, and remove object from the Javascript store
delete osHttp;
我不得不说,这有点胡闹!
关于javascript - Emscripten Javascript接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33032317/
我需要将什么添加到我的 CMakeLists.txt 文件中,以便下面的示例来自 here还能建吗? 我可以毫无问题地生成 WASM,但不知道要在我的 CMakeLists.txt 中添加什么以停止出
我很好奇 emscripten 是否可以在没有 libc 的情况下构建二进制文件。 如果我有 simple.c: int add1(int x) { return x + 1; } 而且我不想
我已经研究了一段时间,我似乎无法找到如何实现这一点。 有一个非常明确的标题 emscripten_get_canvas_size,它没有做我期望它做的事情。实际的 Emscripten Canvas
Emscripten 教程很好地解释了如何与 C 函数交互:https://github.com/kripken/emscripten/wiki/Interacting-with-code 但是你如何
我对 WebAssembly 非常感兴趣,但我感到沮丧的是,即使是用 C++ 编码并使用 Emscripten 编译的“Hello World”示例,也会在浏览器中加载总共 396KB。是什么赋予了?
game engine我用来运行我的 game在浏览器中运行 lua 并在我的游戏中使用正常的 fopen/write/fclose 保存文件。引擎C/C++代码通过emscripten编译为JS。让
当使用不带任何参数的 emscripten 编译 C++ 时,除了 webgl Canvas 之外,它还会生成一个带有控制台和 emscripten Logo 的 html 文件。 是否可以禁用 Lo
我在 emscripten 中有一个 hello world 代码。如果可能的话,我想用 visual studio code 调试它并设置断点和调试更容易。我尝试这样做,但我无法在断点处停止。我使用
我正在阅读这里的 emscripten 教程 - https://github.com/kripken/emscripten/wiki/Tutorial 到目前为止,我已经下载了源代码并安装了依赖项并
是否可以使用 Emscripten 优化构建/编译 Opus/libopus?我不确定这是否是 Emscripten 和 WebAssembly 的一般当前限制,或者是否存在确保解码器在 WebAss
在 Emscripten wiki ( Interacting with code ) 中,只有两种类型被列为要传递给 ccall 的可能返回类型。或 cwrap (“数字”和“字符串”)。如何包装/
如何使用 emcmake cmake 并传递 emscripten 命令行选项? C++/CMake 的新手,但在谷歌上找不到任何有用的东西。所以也许这个问题只是愚蠢的,在那种情况下我道歉。 我可以使
我是 opencv.js 的新手。我在构建 opencv.js 时遇到了一些问题我正在使用 Windows 10。我按照以下步骤设置 opencv.js https://docs.opencv.org
我无法在另一个 JavaScript 文件中调用 C 函数,它给出了错误“在运行时初始化之前调用”please refer to this link 我按照给定链接中的描述在 emscripten 中
我正在尝试使用 Emscripten 构建一个使用 ffmpeg 库到 WebAssembly 的小项目。在此之前,我通过将一些简单的程序从 C 转换为 Wasm 来进行尝试,它运行良好,但那时我没有
我正在尝试将线程与 Emscripten 一起使用,但我不明白它是如何工作的。我已经阅读了一些关于网络 worker 的文字,但我不确定是否理解。 当我查看“tests”文件夹时,I can see
我正在运行一个使用 emscripten 编译为 wasm 的 C 工具。该工具适用于非常大的文件。在 CLI 上正常运行此工具时,操作通常会流式传输结果并在返回足够的数据后提前终止程序。例如,您可能
Mono 有一个 LLVM编译器。无论如何可以将它与 Emscripten 一起使用吗? (将 C# 代码编译为 JavaScript)? 最佳答案 目前没有现成的方法可以做到这一点。这也许是可能的,
我通过以下步骤安装了 Emscripten: 1.) Download the emsdk-portable version for Linux/MacOSX http://kripken.githu
我是 Emscripten/javascript 的新手,如果我的情况已经得到解决,我提前道歉。我在 ionic3 中有一个应用程序,我想读取 c 中有 3 个位置的数组,这个位置有其他数组,在结构上
我是一名优秀的程序员,十分优秀!