首页 > 其他分享 >emscripten 中c 代码引用外部js 函数

emscripten 中c 代码引用外部js 函数

时间:2023-11-28 18:55:06浏览次数:35  
标签:emscripten -- 代码 library js int jssub

主要是一个简单的学习,webassebly 支持通过import 调用环境的函数(比如调用浏览器或者nodejs 中的一些方法)

简单说明

方法很多,包含了emscripten 提供的调用js 的宏,但是以下使用了一个emscripten 提供的--js-library 功能

  • --js-library 简单说明
    --js-library 主要是实现emcc 在编译的时候使用外部js 提供的方法,同时--js-library 对于外部库的定义也有一些要求
    参考格式
 
addToLibrary({
  my_js: function() {
    alert('hi');
  },
});
  • 项目使用
    jsapp.c
 
#include <emscripten.h>
// 通过extern 定义引用外部的js 方法,编译的时候通过--js-library 指定外部方法的实现
extern int sub(int a, int b);
EMSCRIPTEN_KEEPALIVE
int subapp(int a, int b){
    return sub(a,b);
}

cmake 构建target(为了简单我使用了一个绝对路径的地址)

add_executable(jssub src/jsapp.c)
target_link_libraries(jssub "-s MODULARIZE=1 --js-library /src/${CMAKE_CURRENT_SOURCE_DIR}/sub_library.js -s EXPORTED_RUNTIME_METHODS=ccall")

构建

基于容器构建

  • 构建命令
docker run -it -v $PWD:/src  emscripten/emsdk:3.1.47 sh
mkdir build
cd build 
emcmake cmake ..
make 
  • 效果

 

  • 代码调用
const jssub = require("./build/jssub")
jssub().then((instance) => {
  console.log(instance._subapp(33,1))
})

说明

代码已经push 到gihtub了,可以参考, 核心是参考emscripten提供的格式要求,但是此方法是有一些限制的(不能使用闭包,解决方法是使用
--pre-js 或者--post-js )

参考资料

https://github.com/rongfengliang/emscripten_basic_learning
https://web.dev/articles/emscripten-embedding-js-snippets?hl=zh-cn
https://emscripten.org/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#implement-c-in-javascript

标签:emscripten,--,代码,library,js,int,jssub
From: https://www.cnblogs.com/rongfengliang/p/17862711.html

相关文章

  • 一行代码——计算PI后15,000位
    先上代码a[52514],b,c=52514,d,e,f=1e4,g,h;main(){for(;b=c-=14;h=printf("%04d",e+d/f))for(e=d%=f;g=--b*2;d/=g)d=d*b+f*(h?a[b]:f/5),a[b]=d%--g;}运行的时候可能会有警告,像这样。但是不用管,直接运行就行了注意,一定要用\(C\)语言,不能用\(C++\)语言然后是优化版#inc......
  • 程序员如何做点属于自己的东西?做一个自己认为有价值的小项目?分享我的一个个人项目:代
     工作中经常会遇到很多小的知识点,或者突然有点想法,想记下来方面以后查找。网上搜索问题遇到好的回答希望保存下来,或做下修改成为自己知识。突然想写一点代码验证一点想法,这时不想开启电脑上的软件新建文本,就希望直接可以写代码,然后运行看效果。以上这些需求就是我想自己开发......
  • Python-JSON文件操作简化的工具库,支持读取和修改
    这是一个关于python操控json的工具类可以利用get方法以路径的形式查看内容,输出的格式为列表或字典change方法用于修改指定路径下的内容,支持修改内容为字典和列表的形式修改后使用save方法进行保存以下是代码:importjsonimporttimeimportrandomclassError_message:......
  • TruFor笔记和代码复现
    title:TruFor笔记和代码复现banner_img:https://cdn.studyinglover.com/pic/2023/11/35a3ffa0a81b1791e692c591a92b9256.pngdate:2023-11-2817:38:00tags:-图像伪造检测和定位TruFor笔记和代码复现最近有个新闻很火,说谷歌AI技术曾判定美国登月任务的照片存在虚假内......
  • Vite4+Typescript+Vue3+Pinia 从零搭建(4) - 代码规范
    项目代码同步至码云weiz-vue3-template要求代码规范,主要是为了提高多人协同和代码维护效率,结合到此项目,具体工作就是为项目配置eslint和prettier。editorconfig安装EditorConfigforVSCode插件,根目录下新建.editorconfig文件,增加以下配置[*.{js,jsx,ts,tsx,vue}]......
  • 仅需三行代码! C# 快速实现PDF转PPT
    一般在会议、教学或培训活动中,我们都会选择PPT文档来进行内容展示。与PDF文档相比,PPT文档具有较强的可编辑性,可以随时增删元素,并且还可以设置丰富多样的动画效果来吸引观众注意。那么如何通过C#将PDF文档转为PPT文档呢?本文将教大家仅使用3行代码就实现这一功能。PDF转PPT所需工具......
  • 常用three.js
    添加背景图varurls=['1.png','1.png','1.png','1.png','1.png','1.png',];scene.background=newTHREE.CubeTextureLoader().setPath('/').load(urls)添加雾scene.fog=newTHREE.Fog(0xcccccc,......
  • json-server的增删改查与基本使用
    1.查看是否安装node2.查看是否安装npm3.安装json-server4.查看json-server的版本5.json-server--watchdb.json6.配置db.json文件下载 apifoxjson-server的增删改查在apifox中创建一个快捷调试直接点击发送,当body中返回下面内容,表示添加成功注意:不需要添加id,他会自......
  • arthas 热更新docker容器中的代码
    1、将修改并编译好的class文件复制到docker容器中dockercpBasicController.classarthas-demo:/将文件BaseiController.class复制到arthas-demo容器根目录下BaseiController.class:编译后的代码arthas-demo:容器名 2、进入容器,运行arthas参见:地址 3、替换文件ret......
  • 直播系统代码,Android自定义View实现呼吸灯效果
    直播系统代码,Android自定义View实现呼吸灯效果自定义View的属性定义attrs.xml如下: <resources>  <declare-styleablename="BreathView">    <attrname="centerCircleRadius"format="dimension"/>    <attrname="circleCol......