js怎么调用wasm_Webassembly从wasm调用JavaScript方法,即在c代码中调用

我正在使用webassembly,到目前为止,我能够管理emscripten将我的测试c项目编译为wasm文件

em提供了2个文件,即

mainTest.js mainTest.wasm

当我在我的html页面加载mainTest.js然后我得到一个名为的Java脚本对象

“模块”.

我确实找到了如何从javascript调用c / wasm方法,例如:

var myTestInteger = Module._callMyTestMethod();

并从中读取字符串

Module.wasmMemory.buffer

,但我不明白如何从C代码调用javascript.

即我希望能够像这样做:

#ifdef __cplusplus

extern "C" {

#endif

extern void testExternJSMethod();

int main()

{

cout << " Hello From my Test1 !" << endl;

testExternJSMethod();

return 0;

}

int EMSCRIPTEN_KEEPALIVE callMyTestMethod(){

return 26;

}

#ifdef __cplusplus

}

#endif

我正在加载另一个名为utils.js的js文件中的my js方法testExternMethod

function testExternMethod() {

console.log("Hello from testExternMethod!" + )

}

在这里我想从c调用JavaScript testExternJSMethod.

当我在Firefox中运行页面时,在调试器控制台中获得“-1”.

那么我在这种情况下缺少什么?不幸的是,Mozilla文档只给出了那些S表达式而不是C表示的例子.

我在例子中缺少什么?即在c中我用extern关键字定义了方法,即

extern void testExternJSMethod();

但我觉得这不是我必须做的全部.

我相信我应该以某种方式将该java脚本方法以某种方式链接到模块,但我不知道如何.

Module.asm给了我出口.哪种方法调用应该给我进口?因为我相信这个_testExternJSMethod()应​​该在某些导入方法中,我无法弄清楚如何实现它.

解决方法:

我不完全确定您的用例,但是您缺少能够使用函数testExternalJSMethod的重要步骤.你有两个选择:

选项1 – 图书馆

1 – 用c / c定义你的功能.

extern void testExternalJSMethod();

2 – 创建一个名为myLibrary.js的文件

3 – 需要使用以下代码将JS函数添加到库文件中的LibraryManager:

function makeAlert(text) {

alert(text);

}

if (typeof mergeInto !== 'undefined') mergeInto(LibraryManager.library, {

testExternalJSMethod: function() {

makeAlert("Hello world");

}

});

4 – 如果testExternalJSMethod依赖于其自身范围之外的任何内容(例如,上面的makeAlert),请确保在html页面中包含该脚本

5 – 在emcc命令中添加选项–js-library,并在myLibrary.js的相对路径后立即添加

emcc ... --js-library myLibrary.js

选项2 – 传递指针

1 – 在c / c中定义你的javascript函数类型

typedef void testExternalJSMethod()

2 – 无论你想在哪里使用这个函数,接受一个int参数,它将是函数指针,并将指针强制转换为你的函数

void passFnPointer(int ptr) {

((testExternalJSMethod*)ptr)();

}

3 – 使用emscripten的addFunction()并存储其返回值(指针在c / c中)

var fnPtr = Module.addFunction(function () {

alert("You called testExternalJSMethod");

});

4 – 使用步骤3中存储的指针值传递给我们的函数passFnPointer

var passFnPointer = Module.cwrap('passFnPointer', 'undefined', ['number']);

passFnPointer(fnPtr);

5 – 向emcc命令添加选项-s RESERVED_FUNCTION_POINTERS

emcc ... -s RESERVED_FUNCTION_POINTERS=10

结论

在完成其中一个选项中的所有步骤之后,您将能够通过c / c调用testExternalJSMethod()而无需使用emscripten_run_script()或EM_ASM()

标签:javascript,c11,emscripten,webassembly

来源: https://codeday.me/bug/20190715/1464914.html

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:1024 设计师:白松林 返回首页

打赏作者

weixin_39897505

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值