WebAssembly002 emcc Emscripten js端传入数组给c++

Emscripten下载

  • 安装Emscripten:可以在Emscripten的官方网站(https://emscripten.org/)上找到安装说明。
  • 我的踩坑记录在:WebAssembly002 emcc install + 解决 Error: Downloading URL ‘https://storage.googleapis.com/…‘ error

简单Demo

#include <stdio.h>
#include <emscripten/emscripten.h>int main(int argc, char ** argv) {printf("Hello World\n");
}#ifdef __cplusplus
extern "C" {
#endifEMSCRIPTEN_KEEPALIVE void myFunction(int argc, char ** argv) {printf("MyFunction Called\n");
}#ifdef __cplusplus
}
#endif
  • CMakeLists.txt

cmake_minimum_required(VERSION 3.17)
project(WASM)set(CMAKE_CXX_STANDARD 14)add_executable(WASM main.cpp)
  • 以上Demo来自https://stackoverflow.com/questions/65466537/how-to-include-emscripten-emscripten-h,下面简单介绍一些重要的API

EMSCRIPTEN_KEEPALIVE(重要)

  • EMSCRIPTEN_KEEPALIVE:此宏用于声明在JavaScript中可访问的函数。通过在函数定义前使用此宏,您可以确保函数不会被优化和删除。
EMSCRIPTEN_KEEPALIVE
void myFunction() {// Function body
}

emscripten_run_script*

  • emscripten_run_script:此函数用于在JavaScript环境中执行一段脚本。
emscripten_run_script("console.log('Hello, Emscripten!')");

emscripten_async_wget*

  • emscripten_async_wget:此函数用于异步下载文件。
void downloadFile() {emscripten_async_wget("https://example.com/file.txt", "file.txt", onComplete, onError);
}void onComplete() {printf("File downloaded successfully.\n");
}void onError() {printf("Error downloading file.\n");
}

emscripten_set_main_loop*

  • emscripten_set_main_loop:此函数用于设置一个主循环,它将在每个帧上运行。
void mainLoop() {// Main loop body
}int main() {emscripten_set_main_loop(mainLoop, 0, 1);return 0;
}

使用emscripten.h 处理js输入的数组并返回处理的数组

  • 下面是一个完整的例子,演示了如何使用emscripten.h处理JavaScript输入的数组,并返回处理的数组:
#include <emscripten.h>// 定义一个处理数组的函数
int squareNumber(int num) {return num * num;
}// 定义一个可以在JavaScript中调用的函数
EMSCRIPTEN_KEEPALIVE
int* processArray(int* inputArray, int length) {// 为输出数组分配内存int* outputArray = (int*) malloc(length * sizeof(int));// 处理输入数组,并将结果存储在输出数组中for (int i = 0; i < length; i++) {outputArray[i] = squareNumber(inputArray[i]);}// 返回处理后的数组return outputArray;
}int main() {return 0;
}
  • 使用Emscripten编译器将该代码编译为WebAssembly模块:
emcc main.cpp -o example.html -s EXPORTED_FUNCTIONS='["_processArray","_malloc"]' -s EXPORTED_RUNTIME_METHODS='["ccall"]'

在这里插入图片描述

  • 在JavaScript中使用编译好的WebAssembly模块:
// 加载WebAssembly模块
const wasmModule = require('./example.js');// 定义一个输入数组
let inputArray = [1, 2, 3, 4, 5];// 将输入数组转换为C中的格式(使用EM_ASM将其传递给C)
let inputArrayPointer = Module._malloc(inputArray.length * Int32Array.BYTES_PER_ELEMENT);
Module.HEAP32.set(inputArray, inputArrayPointer / Int32Array.BYTES_PER_ELEMENT);// 调用C函数来处理输入数组(使用Module.ccall)
const outputArrayPointer = Module.ccall('processArray', 'number', ['number', 'number'], [inputArrayPointer, inputArray.length]);// 获取处理后的数组
let outputArray =  Module.HEAP32.subarray(outputArrayPointer / Int32Array.BYTES_PER_ELEMENT, outputArrayPointer / Int32Array.BYTES_PER_ELEMENT + inputArray.length);// 将输出数组从C格式转换为JavaScript格式(使用Array.from)
const outputJsArray = Array.from(outputArray);let outputJsArray = Array.from(outputArray);
// 打印输出数组
console.log(outputJsArray);Module._free(inputArrayPtr);
Module._free(outputArrayPtr);
  • 代码首先加载了编译好的WebAssembly模块,然后定义了一个输入数组。接下来,使用模块的_malloc函数将输入数组分配在内存中,并将其指针传递给C函数。使用ccall函数调用C函数来处理输入数组,并获取处理后的数组的指针。最后,将输出数组从C格式转换为JavaScript格式,并打印了输出数组。

cg

let inputArray = [1, 2, 3, 4, 5];let inputArrayPointer = Module._malloc(inputArray.length * Int32Array.BYTES_PER_ELEMENT);
Module.HEAP32.set(inputArray, inputArrayPointer / Int32Array.BYTES_PER_ELEMENT);const outputArrayPointer = Module.ccall('hf_play_start_train', 'number', ['number', 'number'], [inputArrayPointer,1]);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/642227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第九站(17天):C++IO流

文件IO流 对象:文件,控制台,特定数据类型stringstream (写数据输出流out,读数据输入流in) ofstream : ofstream outfile;//输出流:从键盘输出数据,写入到文件 //文件打开默认位ios::out//字节覆盖写 //可以截断设置为:ios::out | ios::trunc//将之前文件全部…

关于网络模型的笔记

1. OSI 七层参考模型&#xff1a; 简介&#xff1a; 七层模型&#xff0c;亦称 OSI&#xff08;Open System Interconnection&#xff09;参考模型&#xff0c;即开放式系统互联。参考模型 是国际标准化组织&#xff08;ISO&#xff09;制定的一个用于计算机或通信系统间互联…

DolphinScheduler-3.2.0集群部署教程

本文目录 1.集群部署方案(2 Master 3 Worker)2.前置准备工作3.端口说明4.DS集群部署1.时间同步2.配置用户、权限3.配置集群免密登陆4.ZK集群启动5.初始化数据库1.创建数据库、用户、授权2.解压缩安装包3.添加MySQL驱动至libs目录 6.配置文件修改1.dolphinscheduler_env.sh 配置…

基于YOLOv5、v7、v8的竹签计数系统的设计与实现

文章目录 前言效果演示一、实现思路① 算法原理② 程序流程图 二、系统设计与实现三、模型评估与优化① Yolov5② Yolov7③Yolov8 四、模型对比 前言 该系统是一个综合型的应用&#xff0c;基于PyTorch框架的YOLOv5、YOLOv7和YOLOv8&#xff0c;结合了Django后端和Vue3前端&am…

【PyTorch】记一次卷积神经网络优化过程

记一次卷积神经网络优化过程 前言 在深度学习的世界中&#xff0c;图像分类任务是一个经典的问题&#xff0c;它涉及到识别给定图像中的对象类别。CIFAR-10数据集是一个常用的基准数据集&#xff0c;包含了10个类别的60000张32x32彩色图像。在上一篇博客中&#xff0c;我们已…

盖子的c++小课堂:第二十六讲:双向链表

前言 谢谢各位粉丝的支持,望我早日突破1000粉 双向链表 干货!单链表从原理到实现——附python和C++两个版本 - 知乎单链表是链表家族中的一员,每个节点依旧由 数据域(data)和指针域(next)组成,链表的具体概念下面有介绍: 机器学习入坑者:程序员基本功——链表的基…

消息队列RabbitMQ.01.安装部署与基本使用

目录 RabbitMQ的作用 Message queue 释义 问题思考 存在的问题 优化方案 案例分析 带来的好处 消息队列特点 Email邮件案例分析 Docker安装部署RabbitMQ 1.下拉镜像 2.运行RabbitMQ 3.打开防火墙端口号并重新运行防火墙 4.容器启动后,可以通过 docker logs 容器 查…

如何使用宝塔面板搭建Discuz论坛服务并结合内网穿透远程访问

文章目录 前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 前言 Crossday Discuz! Board&#xff08;以下简称 Discuz!&#xff09;是一套通用的社区论坛软件系统&#xff0c;用户可以在不需要任何编程的基础上&a…

(三) MySQL字符集

MySQL字符集包括 基字符集&#xff08;CHARACTER&#xff09;与校对规则&#xff08;COLLATION&#xff09;这两个概念&#xff1a; latin1支持西欧字符、希腊字符等gbk支持中文简体字符big5支持中文繁体字符utf8几乎支持世界所有国家的字符utf8mb4是真正意义上的utf-8 查看当…

Git学习笔记(第6章):GitHub操作(远程库操作)

目录 6.1 远程库操作 6.1.1 创建远程库 6.1.2 命名远程库 6.1.3 本地库推送到远程库(push) 6.1.4 远程库拉取到本地库(pull) 6.1.5 远程库克隆到本地库(clone) 6.2 团队内协作 6.3 跨团队协作 6.4 SSH免密登录 6.1 远程库操作 命令 作用 git remote -v 查看所有远程…

【EISCOPUS双检索】2024电子、通信与智能科学国际会议(ECIS 2024)征稿通知!

2024年5月24日-27日 中国|长沙 会议重要日期 一轮截稿时间&#xff1a;2024年3月10日 录用通知时间&#xff1a;投稿后7-15天 注册截止时间&#xff1a;2024年5月10日 一、大会背景 随着互联网的不断创新&#xff0c;电子、通信和智能科学已经广泛应用于各个领域。为了为…

智慧博物馆信息化系统建设(1)

博物馆RFID藏品管理系统 博物馆藏品保管是一项十分复杂又繁琐的工作。从事保管工作除了经常、及时地进行藏品的登记、分类、编目、保养和修复等一系列工作外,还需要把有关藏品的信息迅速、正确地提供给利用者。要提高保管工作的效率,达到现代化的科学管理,从发展趋势看,进…

街机模拟游戏逆向工程(HACKROM)教程:[19]思路的多样性

在上一章,我们找到了检测敌人出现条件的地方,并测试成功,但是找到这个位置的思路并不只有这个方法,这里我们提供另一个思路。 我们已经知道,敌人出现需要一个条件,当这个条件满足时,敌人的出现,程序会需要初始化这个敌人出现的位置,也就是说,我们可以利用敌人的坐标…

教你三个方法去除图片上的涂鸦快收藏起来吧

在数字时代&#xff0c;我们经常需要在图片上进行各种编辑和修改&#xff0c;以使其符合我们的需求。然而&#xff0c;有时候我们会遇到一些图片上的涂鸦&#xff0c;这些涂鸦不仅影响了图片的美观度&#xff0c;还破坏了图片的整体效果。那么图片上的涂鸦怎么去掉&#xff0c;…

怎么移除WordPress后台工具栏“新建”菜单?如何添加“新建文章”菜单?

默认情况下&#xff0c;WordPress后台顶部管理工具栏有左侧有一个“新建”菜单&#xff0c;而且还有下拉菜单文章、媒体、链接、页面和用户等&#xff0c;不过我们平时用得最多的就是“新建文章”&#xff0c;虽然可以直接点击“新建”&#xff0c;或点击“新建 – 文章”&…

docker安装Rabbitmq教程(详细图文)

目录 1.下载Rabbitmq的镜像 2.创建并运行rabbitmq容器 3.启动web客户端 4.访问rabbitmq的微博客户端 5.遇到的问题 问题描述&#xff1a;在rabbitmq的web客户端发现界面会弹出如下提示框Stats in management UI are disabled on this node 解决方法 &#xff08;1&#…

赠书活动~

关注公众号获得&#xff0c;发送抽奖

JSON简单了解

文章目录 1、JSON介绍2、ES6模版字符串3、JS对象转化为JSON字符串3.1、手动JS对象转化为JSON字符串3.2、自动JS对象转化为JSON字符串 4、JS对象和java互相转换 1、JSON介绍 JSON 概念&#xff1a;JavaScript Object Notation。JavaScript 对象表示法&#xff0c;简单理解JSON是…

AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(九)

26.搭建开发环境 开发环境 | webpack 中文文档 (docschina.org) 之前运行时出现的警告和mode配置有关 目标11&#xff1a;配置开发服务器环境 webpack-dev-server 11.1 下载 webpack-dev-server 软件包到当前项目 11.2 设置打包的模式为开发模式&#xff0c;配置自定义命令 11…

OpenGL ES 实现图像腐蚀、膨胀、边缘检测

前文我们详细讲了图像锐化的基本原理,本文再介绍一下图像基本处理之腐蚀、膨胀和边缘检测,它们在图像处理和计算机视觉领域有着广泛的应用。 图像腐蚀(Image Erosion):用于缩小或消除图像中物体的边界。主要用于去除图像中的小细节、噪声或不规则物体。 实现图像腐蚀的片…