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"]
目录
相关文章
|
8月前
|
安全 C# 开发工具
模拟.NET应用场景,综合应用反编译、第三方库调试、拦截、一库多版本兼容方案
模拟.NET实际应用场景,综合应用三个主要知识点:一是使用dnSpy反编译第三库及调试,二是使用Lib.Harmony库实现第三库拦截、伪造,三是实现同一个库支持多版本同时引用。
模拟.NET应用场景,综合应用反编译、第三方库调试、拦截、一库多版本兼容方案
|
2月前
|
编译器 Linux C语言
Valgrind兼容性解析:从核心依赖到错误诊断
Valgrind兼容性解析:从核心依赖到错误诊断
107 0
|
11月前
|
开发工具 Android开发 git
JitPack让第三方依赖更简单(第一种方法)
JitPack让第三方依赖更简单(第一种方法)
|
11月前
JitPack让第三方依赖更简单(第二种方法)
JitPack让第三方依赖更简单(第二种方法)
|
存储 JSON NoSQL
|
C# 图形学 C++
原生实现C#和Lua相互调用-Unity3D可用【下】
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
327 0
|
C# 图形学 Windows
原生实现C#和Lua相互调用-Unity3D可用【中】
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
166 0
|
API C# Android开发
原生实现C#和Lua相互调用-Unity3D可用【上】
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
279 0
|
JavaScript 前端开发
JavaScript ES6对Proxy的原生支持的一个例子:开发人员学习额外的编程语言
JavaScript ES6对Proxy的原生支持的一个例子:开发人员学习额外的编程语言
90 0
JavaScript ES6对Proxy的原生支持的一个例子:开发人员学习额外的编程语言
|
Serverless
Fun 3.0 发布——资源部署、依赖下载、代码编译等功能又又又增强啦!
Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个模板文件(template.yml),协助您进行开发、构建、部署操作。
3056 0