在JavaScript中调用C/C++导出的方法

提示:导出前需要先定义导出宏EM_PORT_API,用来更方便的导出和使用:


一、定义EM_PORT_API导出宏

导出前需要先定义导出宏EM_PORT_API,用来更方便的导出和使用

1.创建EM_PORT_API

定义EM_PORT_API宏如下:

#ifndef EM_PORT_API
#	if defined(__EMSCRIPTEN__)
#		include <emscripten.h>
#		if defined(__cplusplus)
#			define EM_PORT_API(rettype) extern "C" rettype EMSCRIPTEN_KEEPALIVE
#		else
#			define EM_PORT_API(rettype) rettype EMSCRIPTEN_KEEPALIVE
#		endif
#	else
#		if defined(__cplusplus)
#			define EM_PORT_API(rettype) extern "C" rettype
#		else
#			define EM_PORT_API(rettype) rettype
#		endif
#	endif
#endif

其中:

__EMSCRIPTEN__宏用于探测是否是Emscripten环境

__cplusplus用于探测是否C++环境

EMSCRIPTEN_KEEPALIVE是Emscripten特有的宏,用于告知编译器后续函数在优化时必须保留,并且该函数将被导出至JavaScript

二、创建export.cc文件

代码如下:

//export1.cc
#ifndef EM_PORT_API
#	if defined(__EMSCRIPTEN__)
#		include <emscripten.h>
#		if defined(__cplusplus)
#			define EM_PORT_API(rettype) extern "C" rettype EMSCRIPTEN_KEEPALIVE
#		else
#			define EM_PORT_API(rettype) rettype EMSCRIPTEN_KEEPALIVE
#		endif
#	else
#		if defined(__cplusplus)
#			define EM_PORT_API(rettype) extern "C" rettype
#		else
#			define EM_PORT_API(rettype) rettype
#		endif
#	endif
#endif

#include <stdio.h>

EM_PORT_API(int) show_me_the_answer() {
	return 42;
}

EM_PORT_API(float) add(float a, float b) {
	return a + b;
}

三、编译文件

使用emcc编译export.cc文件:

emcc code/export.cc -o code/export.js

 编译完成后的文件为:

四、创建export.html

在同路径下创建名为export.html的文件,用于显示及引用对应文件。

<!doctype html>

<html>
  <head>
    <meta charset="utf-8">
    <title>Emscripten:Export</title>
  </head>
  <body>
    <script>
    Module = {};
    Module.onRuntimeInitialized = function() {
      console.log(Module._show_me_the_answer());
      console.log(Module._add(12, 1.0));
    }
    </script>
    <script src="export.js"></script>
  </body>
</html>

Module 作为全局对象,不用自行定义,且由Emscripten生成的JavaScript胶水代码基本都围绕全局对象Module展开。

onRuntimeInitialized 是一个注入方法,Emscripten的Runtime就绪后,将会回调该方法,以实现类似Module._main()的操作。

 浏览器运行export.html文件后在F12中得到输出结果:

 JavaScript调用C函数一般使用全局对象Module,格式为Module._[export fnc name]。例如:Module._show_me_answer();

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在macchina.io,您可以通过C++提供的bundle来实现自定义的服务接口,并通过JavaScript代码来调用这些服务。具体来说,您可以使用以下步骤来让JavaScript调用C++提供的服务接口: 1. 在C++代码加载JavaScript bundle,并导出服务对象及其方法。 ``` #include "Poco/JS/Bridge.h" #include "Poco/JS/Core/PooledIsolate.h" #include "Poco/JS/Core/JSExporter.h" class MyService { public: int add(int a, int b) { return a + b; } }; POCO_BEGIN_MANIFEST(Poco::JS::Core::JSExporter) POCO_EXPORT_CLASS(MyService) POCO_END_MANIFEST Poco::JS::Core::PooledIsolate isolate; Poco::JS::Bridge bridge(isolate); bridge.evalFile("path/to/bundle.js"); ``` 在这个例子,我们首先定义了一个名为MyService的服务类,并实现了一个add()方法。然后,通过使用POCO_BEGIN_MANIFEST和POCO_EXPORT_CLASS宏,我们将MyService类导出为一个服务对象,以便在JavaScript使用。最后,我们使用Poco::JS::Bridge类来加载JavaScript bundle,并执行其的代码。 2. 在JavaScript代码获取C++的服务对象,并调用方法。 ``` var myService = Bridge.getGlobal().getService("MyService"); var result = myService.add(1, 2); ``` 在这个例子,我们首先使用Bridge.getGlobal()方法获取全局对象,然后使用getService()方法获取名为"MyService"的服务对象。最后,我们可以通过服务对象的add()方法调用方法,并传递参数和接收返回值。 需要注意的是,您需要在C++代码导出服务对象及其方法,并将其注册到Bridge类,以便在JavaScript使用。您可以使用Poco::JS::Core::JSExporter类来导出服务对象及其方法,如上所示。 总之,通过使用Poco::JS::Bridge和Poco::JS::Core::JSExporter类,macchina.io可以让JavaScript调用C++提供的服务接口,从而实现更加灵活和可扩展的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值