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

在C++中调用JS函数二(跨线程调用) 一、emscripten_run_script() 最直接但较慢的方法是使用emscripten_run_script()。这样可以有效地从C / C ++运行指定的JavaScript代码 test.cpp #include <pthread.h> #include <emscripten.h> #include <stdio.h> extern "C" { EMSCRIPTEN_KEEPALIVE void *decodeHEVC(void* tim. 阅读详情

Emscripten下载

简单Demo

#include <stdio.h>
#include <emscripten/emscripten.h>
    
int main(int argc, char ** argv) {
    printf("Hello World\n");
}
    
#ifdef __cplusplus
extern "C" {
#endif
    
EMSCRIPTEN_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)

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]);
Emscripten之基础使用 一、前言 随着WebAssembly技术的发展,asm.js的竞争力已经逐渐被削弱了,所以Emscripten进一步与Binaryen结合,形成基于LLVM构建的WebAssembly后端。现如今,我们已经可以通过Emscripten工具链直接构建Wasm应用了。 有兴趣了解WebAssembly与asm.js的可以参考以下资料: asm.js 阮一峰《asm.js和Emscripten入... 阅读详情

相关推荐

在c++中调用JS函数

一、emscripten_run_script() 最直接但较慢的方法是使用emscripten_run_script()。这样可以有效地从C / C ++运行指定的JavaScript代码 test.cpp #include <emscripten.h> int main() { emscripten_run_script("alert('hi emscripten_run_scripten!')"); return 0; } 使用emcc编译成html emcc te.

qq_34754747的博客 8387

WebAssembly笔记(4)-JavaScript和C++的交互

一 JS调用C++函数从JS中调用C++函数,需要把C++函数声明为导出,有好几种方法,本文采用最原始也是效率最高的方法,就是函数签名加上EMSCRIPTEN_KEEPALIVE。1.1 EMSCRIPTEN_KEEPALIVE作用是告诉C++编译器这个函数会被用到,不要在“tree shaking”的时候删掉,并且会将函数名加上前缀 _ 导出给 JS。另外还需加上 extern "C" 告诉 ...

楚游香的博客 2355

WebAssembly学习(四)——文件系统概览

上一篇的文章里面已经初步接触了本地文件的读取,但是出现了很多其他的问题,这篇文章就是更进一步学习Emscripten文件系统的原理。 下面几节简要介绍了Emscripten的文件系统环境和架构。除了讨论对标准C/C++同步文件API的支持外,还简要地讨论了文件系统API和Emscripten的异步文件系统API。

qq_29174429的博客 1277

前端读取excel文件

由html5的FileReader这个对象来完成 FileReader接口的方法: readAsBinaryString file 将文件读取为二进制编码 readAsText file,[encoding] 将文件读取为文本,其中第二个参数是文本的编码方式,默认值为 UTF-8 readAsData...

weixin_34075551的博客 1507

使用MLP解决OCR问题(OpenCV)(下)

分类模型:        分类模型涉及的一个比较关键的问题就是输出的10维向量是如何与具体的类别挂钩的。实际上:10维向量的每一位都代表一类,在对于训练集的表达中,如果输入数据是0,则10维向量的第一位赋值为1,其余均为0。即0对应[1,0,0,0,0,0,0,0,0,0]。MLP模型训练完成后,就需要对用户输入的数据所属类别进行判定。这时得到的输出数据基本不可能是正好的所属类为1,其他位置为0

qq_18515405的专栏 1907

SpringBoot+Flowable 6.8.0实战:5分钟搞定免登录流程图设计器

本文详细介绍了如何通过SpringBoot与Flowable 6.8.0深度整合,快速实现免登录流程图设计器的集成方案。通过排除默认安全配置、自定义安全策略和用户模拟服务,开发者可在5分钟内完成设计器的部署,适用于快速原型开发和企业内部工具搭建。

weixin_29204205的博客 280

C++调JS上层的4种方法

【代码】C++调JS上层的4种方法。

qq_34754747的博客 1439

【Agent】多智能体框架MetaGPT入门教程

创建一个 Action 类的子类 SimpleWriteCode,子类中定义好 prompt,并解析返回结果。在 MetaGPT 中,

酒酿小圆子呀~ 3139

javascript和C++交互大全(wasm)emscripten

/ 最终的emcc编译命令:emcc src/main.cpp -o bin/function.html -s EXPORTED_FUNCTIONS="['_int_sqrt','_main']" -s EXPORTED_RUNTIME_METHODS=["ccall","cwrap"]// emcc编译命令:emcc src/main.cpp -o bin/function.html -s EXPORTED_FUNCTIONS="['_int_sqrt','_main']"//return a;

lizfs_csdn的博客 1013

Jaspersoft Studio安装与配置全攻略:从下载到首个报表生成

本文提供Jaspersoft Studio从下载、安装到创建首个报表的完整实战指南。详细介绍了如何获取安装包、配置工作空间,并通过可视化设计器创建报表模板、添加参数与字段,最终实现数据预览与PDF导出。帮助Java开发者快速掌握这一强大的开源报表工具,提升报表开发效率。

weixin_28826521的博客 704

12. Web安全—渗透测试用例—敏感信息泄漏

12. Web安全—渗透测试用例—敏感信息泄漏

weixin_43567873的博客 413

WebAssembly编译指南

Emscripten包含一套完整的工具链, 它不依赖任何其它的编译环境。其中最重要的就是emcc和em++,它们类似gcc和g++。emcc使用Clang和LLVM编译出wasm,同时emcc还可以生成JavaScirpt,提供API给Node.js或者HTML中调用。Emscripten对标准c/c++支持非常全面,Emscripten SDK用于安装整个工具链,包括emcc和LLVM等,它可以在Linux、Windows或者MacOS上安装使用。

Just_bg的专栏 4128

Weibull Distribution韦布尔分布的深入详述(1)原理和公式

本章介绍韦布尔分布(weibull distribution)和实践之基本公式和推导。 韦伯分布被经常用来对失效性(Failure)或者,反而言之为,可靠性,进行衡量的工具。他的目标就是构建一个失效性分析的模型,或者说构建一个失效性分析的Pattern.【Franklin案,在展示CDF公式的之前,不得不提我们的国内的某些度知识里面的公式,采用的希腊字母完全和国外的不同,然而,很多希腊字母在使用中有特定的意义,本文采用的是通用的表达公式】 F(x)={1−e−(xλ)kx≥00x..............

山云的专栏 8万+

WebAssembly技术_JS调用C函数示例_传递参数、方法导出

Webassembly 是一种可以在浏览器端运行二进制格式代码的技术,WebAssembly最大的优点莫过于可大幅度提升 Javascript 的性能。

3347

数字滤波器应用介绍

线性滤波器FIR ,会引起恒定延迟,通过补零的方式补偿非线性滤波器IIR,会引起频率相关的延迟,通过零相位延迟filtfilt补偿从信号中去除不需要的频谱时,通过滤波和补偿实现。如果需要去除的频率与采样率相差甚远,比如4kHz 与100Hz, 可通过 低通滤波->补偿->降采样–> 滤波 补偿 -->上采样还原的方法。*降采样前一定要先低通滤波为了防止混叠。

weixin_39107270的博客 274

ProgLoss+STAL 技术详解:YOLO26 小目标检测增强方案

本文提出了一种基于ProgLoss渐进式损失函数和STAL小目标感知标签分配的YOLO26增强方案。针对小目标检测中特征信息少、正负样本不平衡等难题,STAL通过尺度感知的标签分配策略动态调整候选样本数量和IoU阈值,为小目标分配更多正样本;ProgLoss则根据训练阶段动态调整分类和回归损失的权重,早期侧重定位能力,后期加强分类精度。实验表明,该组合方案显著提升了小目标检测性能,在COCO数据集上小目标AP达到38.2%,比基线提升6.5个百分点。该方法为遥感、监控等场景的小目标检测提供了有效解决方案。

一键难忘的博客 1285

Emscripten胶水代码初探

1.前言 如果我们想把C/C++代码编译为WebAssembly,那十有八九就会用到Emscripten。在运行Emscripten相关编译指令后,我们可以得到wasm文件和js文件。如果在编译时添加对应的参数,我们还可以使用模板HTML或者将wasm文件放到web worker中执行。 其中Emscripten编译生成的js文件即是所谓的胶水代码,我们只需要在自己的项目中引入这段胶水代码,胶水代码就会帮我们加载wasm模块,并且将定义在C/C++中的函数绑定在全局变量上供我们调用。 本文主要简单的探索Em

Wopelo的博客 3280

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

使用emscripten实现js直接调用C代码(emscripten的初探)

最近感觉一个时间转换的C库挺好用的,但不想做成C扩展,并不是说C扩展难,对于我来说好歹也是写过一些C扩展的,主要是C扩展对环境有一些依赖,比如非win下需要node-gyp做为环境支持来进行编译,对使用者来说相对麻烦。并且我希望前端也可以调用,所以目标瞄准了emscripten,但看了这么多emscripten的文章,大多都是将理论要不就是翻译了教程,具体教程本人没看到。那就自己写的教程,记录顺便...

weixin_33794672的博客 6649

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

在Worker中使用Emscripten(wasm)

在Worker中使用Emscripten(wasm)

qq_33541826的博客 901

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

WebAssembly探索篇(一)安装编译环境,emcc和cmake

使用webassembly技术,使web端可直接调用C/C++编写的图像算法,并提速,此文为基础安装篇

huhui806的博客 1439

Emscripten教程之连接C++和JavaScript(三)

翻译:云荒杯倾本文是Emscripten-WebAssembly专栏系列文章之一,更多文章请查看专栏。也可以去作者的博客阅读文章。欢迎加入Wasm和emscripten技术交流群,群聊号码:939206522。 Emscripten提供了多种方法来连接和交互JavaScript和编译的C或c++,本文逐一介绍。 JavaScript使用c...

weixin_33895657的博客 1014

html插入运行c程序,WebAssembly之使用JS调用C/C++接口

image.png如果想在C/C++代码中定义一个需要从JavaScript调用的函数,可以使用Emscripten 的ccall()函数并使用EMSCRIPTEN_KEEPALIVE声明(它将添加函数到导出函数列表)来完成。代码创建创建一个test.c文件:#include #include int main(int argc, char ** argv){printf("Hello World...

weixin_32762235的博客 1837

构建企业级AI代理平台:高性能可扩展的中间件解决方案

Super Agent Party是一款创新的企业级AI代理中间件平台,通过零侵入式架构设计,为大型语言模型提供实时互联网访问、永久记忆、代码执行工具、MCP协议支持、A2A通信等高级功能。该平台采用模块化设计理念,支持流式输出而不影响原始API响应速度,实现了即插即用的LLM增强能力,为开发者提供了构建智能应用的技术基础设施。 ## 技术架构设计原理 Super Agent Party采用分

gitblog_00451的博客 665

WebAssembly数组传递(输入篇)

接着输出篇,接下来就讲输入的操作 *注意:在使用emscripten::val和emscripten::bind时,编译时要带上--bind参数 传统法: JS: var ptr = Module._malloc(myTypedArray.length * myTypedArray.BYTES_PER_ELEMENT); Module.HEAPF64.set(myTypedArray, ...

量子复合态的博客 6092

第二章: 学习Emscripten

在本章中,我们学习了如何安装和使用 Emscripten 将 C/C++ 编译成 WebAssembly 模块。我们还探讨了 emsdk 工具和在生成 WebAssembly 模块时的各种优化级别。在下一章中,我们将探索 WebAssembly 模块。

cppclub的博客 3946

Webassembly 实践指南(一)

提供高性能应用程序是一个噩梦。JavaScript 是一种动态类型语言。因此,JavaScript 引擎在执行 JavaScript 时假设类型。这些假设导致了不可预测的性能。这使得在 JavaScript 中提供一致的高性能应用程序变得更加困难。WebAssembly 提供了一种在 JavaScript 引擎中运行类型安全和高性能应用程序的方法。WebAssembly 非常快WebAssembly 是网络发生的下一件大事。

龙哥盟 1462
上一篇: webassembly003 whisper.cpp的项目结构CMakeLists.txt
下一篇: pyaudio:录制并保存系统声音+绘制频谱
FakeOccupational
博客等级 码龄6年 2万+粉丝 1727原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值