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

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

时间:2023-12-04 10:06:19浏览次数:36  
标签: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")
my_js: function() {

构建

基于容器构建

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

emscripten 中c 代码引用外部js 函数_参考资料

 

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

说明

代码已经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://blog.51cto.com/rongfengliang/8673407

相关文章

  • emscripten cmake 简单尝试
    emscripten提供了比较完整的工具链,包含了对于make以及cmake等工具的支持,以下是一个简单的c代码转换为wasm的demo同时基于cmake进行项目管理参考项目项目结构├──CMakeLists.txt├──README.md├──app.js└──src├──add.c├──add.h└─......
  • 新建模块&新建用户表&修改代码生成器文件&新建菜单
    1.新建模块打开IDEA在项目结构中新建rome-hotel的一个springboot项目,什么依赖都不需要 在pom.xml文件中修改坐标,引用父坐标 在父级pom文件中将模块加入 在rome-admin中的pom文件中加入admin-hotel,这样就能带动这个模块启动 将包名修改成和rome-admin一样 再创建其......
  • 代码随想录算法训练营第5天 | lc242、lc349、lc202、lc1
    (本合集全部为Go语言实现)相关文章链接:242题解349202题解1题解相关视频链接:Leetcode242状态:秒了实现过程中的难点:对于元素固定是小写字母或类似的情况,可以使用数组,因为元素最大数量是固定的个人写法funcisAnagram(sstring,tstring)bool{iflen(s)!=len(t)......
  • C++分解质因数代码实现
    一、问题描述:什么叫做分解质因数?就是我们给定一个数字,把这个数字的是质数的因子按照从小到大的顺序排列出来,并输出每个质因子的个数。二、实现思路:就是我们从1~n/i这个范围内(i*i=n),如果找到了一个因子,使得n%i==0,那么我们就进一步除下去,直到无法满足n%i==0为止。这个时候,i一定......
  • R语言中的偏最小二乘回归PLS-DA|附代码数据
    原文链接:http://tecdat.cn/?p=8890原文出处:拓端数据部落公众号最近我们被要求撰写关于偏最小二乘回归PLS-DA的研究报告,包括一些图形和统计输出。主成分回归(PCR)的方法本质上是使用第一个方法的普通最小二乘(OLS)拟合来自预测变量的主成分(PC)。这带来许多优点:预测变量的数量实际......
  • R语言Outliers异常值检测方法比较|附代码数据
    原文链接:http://tecdat.cn/?p=8502原文出处:拓端数据部落公众号最近我们被客户要求撰写关于异常值检测的研究报告,包括一些图形和统计输出。识别异常值的方法有很多种,R中有很多不同的方法。 关于异常值方法的文章结合了理论和实践。理论一切都很好,但异常值是异常值,因为它们不遵......
  • ARIMA模型,ARIMAX模型预测冰淇淋消费时间序列数据|附代码数据
    全文下载链接:http://tecdat.cn/?p=22511最近我们被客户要求撰写关于ARIMAX的研究报告,包括一些图形和统计输出。标准的ARIMA(移动平均自回归模型)模型允许只根据预测变量的过去值进行预测。该模型假定一个变量的未来的值线性地取决于其过去的值,以及过去(随机)影响的值。ARIMAX模型......
  • 代码随想录算法训练营第4天 | lc24、lc19、lc面试题02.07、lc142
    (本合集全部为Go语言实现)相关文章链接:24题解19题解02.07题解142题解相关视频链接:Leetcode24状态:秒了实现过程中的难点:对组内两个节点的指针指向流转需要倒腾明白。临时头结点真的很有用个人写法funcswapPairs(head*ListNode)*ListNode{tmpHead:=&ListNode{-......
  • JSON
    JSON.stringify和JSON.parseJSON.stringify():作用:用于将JavaScript对象或值转换为JSON字符串语法:JSON.stringify(value[,replacer[,space]])value:要转换为JSON字符串的值replacer(可选):用于控制转换过程的函数或数组space(可选):控制结果字......
  • 后端 Java 对象转 json(不用第三方依赖的拼接方式)
    需求:编写工具类要尽可能不用任意一个jar包依赖,或者尽可能精简原有数据:ArpsParams{actualProduction=[{mouth=2022-07,oilProdDaily=366088.33},{mouth=2022-08,oilProdDaily=380806.78}],predictionSegment=[{mouth=2022-07,oilProdDaily=367832.31},{mouth=2022-0......