WebAssembly01-- 暴露接口 避免编译时优化

简介: WebAssembly01-- 暴露接口 避免编译时优化

将接口暴露出来

在test.c 中直接写出如下所示的代码

vim test.c

#include<stdio.h>
int add(int a,int b)
{
return a+b;
}
int main(int argc,char** argv)
{
return add(1,2);
}

使用

emcc test.c -O2 -o test.js 编译之后

手动写个test.html

<html>
<head>
<title>test page</title>
</head>
<body>
<script src="test.js"></script>
</body>
</html>

emrun --no_browser --port 8000 test.html

在浏览器中访问这个

可以在下图中看不到add函数 并且调用add函数的main中return 直接是3

现在使用

vim test.c

#include<stdio.h>
#include<emscripten.h>
EMSCRIPTEN_KEEPALIVE int add(int a,int b)
{
return a+b;
}
int main(int argc,char** argv)
{
return add(1,2);
}

修改之后重新编译并运行emcc emrun

如下所示 add接口被暴露出来

不导出main函数

增加 --no-entry 即可避免main接口的暴露

emcc test.c --no-entry -O2 -o test.js

emrun --no_browser --port 8000 test.html

下图中可以看到add接口但是没有main

暴露接口的调用

Module调用方式

在test.html 中修改为如下

<html>
<head>
<title>test page</title>
</head>
<body>
<script >
Module={}
Module.onRuntimeInitialized=function(){
console.log("add:"+Module._add(3,5))
          }   
</script>
<script src="test.js"></script>
</body>
</html>

emrun --no_browser --port 8000 test.html

接口的调用过程

首先定义一个空的Module对象 给Module对象的onRuntimeInitialized设置了回调函数,然后 使用script标签引入test.js胶水文件 完善Module对象的其他属性,在Module对象初始化完成之后执行回调onRuntimeInitialize()方法 该方法调用Module对象的_add方法,并打印出来结果。

ccall调用方式

var result = Module.ccall(func_name,return_type,arg_types,args);
  • func_name 是要调用的c/c++函数名这里不需要加下划线
  • return_type函数返回类型字符串 比如返回类型是string 这里就应该填入string
  • arg_type调用函数的参数类型列表 比如需要传入两个字符串 则应该写成['string','string']
  • args 真实的参数 比如传入是的 “hello” "world" 则写成 ["hello","world"]
目录
相关文章
|
3月前
|
前端开发 JavaScript Java
hyengine 编译问题之复用脚本引擎如何解决
hyengine 编译问题之复用脚本引擎如何解决
|
3月前
|
开发框架 自然语言处理 Java
跨平台服务开发的利器——深入解析Thrift Compiler的工作机制与内部实现细节!
【8月更文挑战第18天】在现代软件开发中,代码生成器日益重要,能根据特定输入自动生成源代码,提高效率与可维护性。Thrift作为跨平台多语言框架,通过IDL文件定义数据和服务接口,并据此生成多语言代码,涵盖序列化、方法调用等。以示例IDL定义为例,Thrift Compiler生成服务端骨架与客户端代码框架,便于开发者添加业务逻辑。深入源码,“compiler/cpp/src/thriftl”目录下的组件负责词法、语法分析及代码生成,映射IDL至特定语言,体现编译原理与跨语言设计精髓。
61 0
|
3月前
|
前端开发 开发者
在前端开发中,webpack 作为模块打包工具,其 DefinePlugin 插件可在编译时动态定义全局变量,支持环境变量定义、配置参数动态化及条件编译等功能。
在前端开发中,webpack 作为模块打包工具,其 DefinePlugin 插件可在编译时动态定义全局变量,支持环境变量定义、配置参数动态化及条件编译等功能。本文阐述 DefinePlugin 的原理、用法及案例,包括安装配置、具体示例(如动态加载资源、配置接口地址)和注意事项,帮助开发者更好地利用此插件优化项目。
88 0
|
3月前
Electron——常见动态链错误
Electron——常见动态链错误
43 0
|
6月前
|
中间件
NetCore通过中间件判断接口是否存在 AllowAnonymousAttribute 特性
特性来判断一个接口是否被标记为允许匿名访问。以下是一个简单的中间件示例,用于在请求管道中检查接口是否被。.NET Core中,可以通过检查接口上的。在应用程序中使用此中间件,将其添加到。
83 0
|
6月前
|
编译器 Linux C语言
Valgrind兼容性解析:从核心依赖到错误诊断
Valgrind兼容性解析:从核心依赖到错误诊断
246 0
|
编译器 Shell C++
如何在项目中引入googtest(上)——通过编译器引入库
如何在项目中引入googtest(上)——通过编译器引入库
143 0
|
开发工具 Android开发 git
JitPack让第三方依赖更简单(第一种方法)
JitPack让第三方依赖更简单(第一种方法)
JitPack让第三方依赖更简单(第二种方法)
JitPack让第三方依赖更简单(第二种方法)
|
API C# Android开发
原生实现C#和Lua相互调用-Unity3D可用【上】
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
317 0
下一篇
无影云桌面