(WebAssembly)JS/微信小程序,调用C/C++

这篇具有很好参考价值的文章主要介绍了(WebAssembly)JS/微信小程序,调用C/C++。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JS调用C库函数

1、将.c文件编译成WebAssembly,具体步骤参考:编译 C/C++ 为 WebAssembly - WebAssembly | MDN,这个比较简单,文章中比较详细的步骤

2、编译后生成3个文件:一个.js,一个.wasm,一个.html,其中.js、.wasm不用做修改,.html文件中做了2处改动

新增button,用于触发事件

<button class="mybutton">运行我的函数</button>

调用c函数代码,其中get_device_type就是c目标函数

document.querySelector('.mybutton').addEventListener('click', function(){
  console.log('检查控制台');
  var result = Module.ccall('get_device_type', // name of C function
                             null, // return type
                             null, // argument types
                             null); // arguments
  // alert(result);
  console.log(result)
});

3、调用结果如下:

注:3个文件需要部署到服务器中才能正常运行,如nginx、tomcat等(都放到同一级目录中)。

(WebAssembly)JS/微信小程序,调用C/C++

微信小程序调用C库函数

这类资料少,花了点时间才跑通,话不多说,整活:

1、本质上也是js调用c库函数,但微信小程序有他自己的一套东西,要做一些修改和适配,相比上面js直接调用麻烦一些,首页还是将.c文件编译成WebAssembly

重点来了:打开微信开发者工具,我的版本1.06,调试基础库:2.27.1(网上有的说基础库用2.14.0,我也试了,没解决我的问题)

2、pages同级创建workers目录,将上面编译好的.js文件放里面,我的是app_client.js

(WebAssembly)JS/微信小程序,调用C/C++

 3、为了适配微信小程序,需要修改app_client.js,共5处都写到一起了

1、文件最底部导出Module
module.exports = {
  Module: Module
}

2、注释
// scriptDirectory = self.location.href

3、修改胶水js中instantiateArrayBuffer函数
function instantiateArrayBuffer(receiver) {
		return WXWebAssembly.instantiate('/pages/index/app_client.wasm', info)
			.then(function(instance) {
				return instance;
			})
			.then(receiver, function(reason) {
				err('failed to asynchronously prepare wasm: ' + reason);

				// Warn on some common problems.
				if (isFileURI(wasmBinaryFile)) {
					err('warning: Loading from a file URI (' + wasmBinaryFile + ') is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing');
				}
				abort(reason);
			})
		// return getBinaryPromise().then(function(binary) { return WebAssembly.instantiate(binary, info) }).then(receiver, function(reason) {
		//     err("failed to asynchronously prepare wasm: " + reason);
		//     abort(reason)
		// })
	}

4、修改胶水js中receiveInstance函数
wasmTable = new WXWebAssembly.Table({ "initial": 1577, "maximum": 1577 + 0, "element": "anyfunc" });

5、将胶水js中所有WebAssembly修改为WXWebAssembly

4、workers目录创建index.js,用于调用app_client.js

关键代码:cv_debug.Module._get_device_type

const cv_debug = require('app_client.js');
console.log('cv_debug', cv_debug);

setTimeout(() => {
  var zz = {};
  var v = cv_debug.Module._get_device_type('192.168.88.1',zz)//调用c函数
  console.log("zz=",zz);
  console.log('v=',v);
  worker.postMessage({
    msg: v
  })
}, 1000);

worker.onMessage(function (msg) {
  // processing of workder
  console.log(msg);

  worker.postMessage({
    msg: 'result of worker666888'
  })
})

5、/pages/index目录下index.js内容如下:用于调用workers目录下的index.js

const app = getApp()

Page({
  data: {
    message:'hello'
  },
  onLoad() {
    var _this = this;
    var worker_func = function() {
      const worker = wx.createWorker('workers/index.js', {
        // useExperimentalWorker: true
      })
      worker.postMessage({msg:'msg from main'});
      worker.onMessage(function (m) {
        console.log(m)
        _this.setData({
          message: m.msg
        })
      })
    }
    
    setTimeout(worker_func, 200);
  },
})

6、不要忘记把第1步生成的.wasm文件拷贝到/pages/index目录中,对应第3步第3点中实例化.wasm文件的路径

(WebAssembly)JS/微信小程序,调用C/C++

 7、app.json中增加配置:"workers": "workers"

(WebAssembly)JS/微信小程序,调用C/C++

 8、人狠话不对,OK了

(WebAssembly)JS/微信小程序,调用C/C++文章来源地址https://www.toymoban.com/news/detail-498507.html

到了这里,关于(WebAssembly)JS/微信小程序,调用C/C++的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【微信小程序】引用公共js文件

            我这里的公共js文件为utils文件下的util.js,需要导出的公共方法是 verifyPhone();我需要在login.js中调用util.js中的verfyPhone方法         导入         注意:1、这里要写相对路径                    2、要加.js后缀         使用 login.wxml  login.js

    2024年02月04日
    浏览(33)
  • 微信小程序 js中写一个px单位转rpx单位的函数

    大家写东西自然还是会比较喜欢用rpx 但是 事实证明 在js中 还是px好用 因为很多单位交互的函数还是只返回px单位的 理论上将 750 rpx 是整个屏幕的宽度 那么 我们可以这样写一个函数 这里 我们看看效果 wxml wxss js 这里 我们用wxss 设置元素高度为 300rpx 然后 我们js获取px单位 高

    2024年02月08日
    浏览(37)
  • 【微信小程序】在WXML文件中显示JS文件中全局变量

    我们知道在wxml中可以通过数据绑定的方法来获取到js文件中data里面的数据,并且显示到wxml界面,那么我们该如何在wxml中显示js文件里面的全局变量呢? 在wxml种我们可以显示js代码中data代码段中的变量。 具体的操作是: 1.在js中添加data字段以及相应的格式,并在data字段中创

    2024年02月04日
    浏览(52)
  • 【微信小程序】wxml、wxss、js、json文件介绍

    😉博主:初映CY的前说(前端领域) ,📒本文核心:微信小程序的入门介绍 【前言】书接上回,我们知道了一个小程序的构成结构,接下来我们来进一步学习小程序的目录结构中的.wxml、.wxss、.js、.json。 用于页面的布局结构,相当于网页中 .html 文件 换做网页来说就是我们的

    2024年02月09日
    浏览(44)
  • 利用PDF.js在微信小程序里预览PDF文件

    在微信小程序可以通过wx.downloadFile 和 wx.openDocument 两个api下载并打开pdf文件。这种方式主要有不少的缺点: 1、需要下载才可以查看,且每次打开都需要下载生成一个临时文件,如果PDF文件比较多的话,临时文件会越来越多,且如果PDF文件比较大的话,打开会比较慢。 2、在导

    2024年02月03日
    浏览(59)
  • 【微信小程序】JS文件内数组循环(批量)更新方法 图片批量增删

    学习微信小程序开发时遇到图片的批量增删问题,在分析了一些大佬的代码之后总结如下: 先定义一个临时数组承接已有的数组,进入循环用push来增加内容,或者用splice来删除内容,然后循环结束后,用setData把临时数组更新到原数组名下。 示例代码: 日拱一卒 功不唐捐

    2024年02月12日
    浏览(42)
  • 微信小程序云函数调用报错Error: cloud.callFunction:fail Error: errCode: -504002 functions execute fail | errMsg:

    这个错误通常是因为在云函数中没有正确引入 wx-server-sdk 模块导致的。在云函数中,我们需要使用 wx-server-sdk 模块来访问小程序的云开发服务。 你需要检查你的云函数代码中是否正确引入了 wx-server-sdk 模块,可以参考下面的代码示例: 在上面的代码中,我们通过 require(\\\'wx-

    2024年02月05日
    浏览(69)
  • uniapp 微信小程序 纯js文件中引入自定义modal组件(无需所有页面手动引入组件)

    工具:uniapp 开发端:微信小程序 其他:uview 2.0 场景:接口请求统一封装中需要对接口返回token失效的情况做modal显示,引导用户退出小程序,我的想法是将modal的默认confirm按钮替换成小程序自带的退出方法: 这样用户点击确认按钮就能退出小程序,因此uni.showModel不满足需求

    2024年02月09日
    浏览(45)
  • 微信小程序 ,[JS 文件编译错误] 以下文件体积超过 500KB,已跳过压缩以及 ES6 转 ES5 的处理。

    导入全部图表的echarts.js非常大,如果你的项目较大可能会导致项目上传失败, 在你把整个echarts.js导入项目时开发者工具也会有如下提示: [JS 文件编译错误] 以下文件体积超过 500KB,已跳过压缩以及 ES6 转 ES5 的处理。ec-canvas/echarts.js 我们可以通过图表在线定制来替换 echarts.js 文

    2024年02月13日
    浏览(30)
  • uniapp(vue3) - 微信小程序平台使用import引入外部js文件出现undefined,正常引入js文件(sdk插件)文件路径正确但console.log控制台打印时却是undefined

    注:uniapp 小程序平台! 在使用 uniapp 微信小程序端导入 SDK 的过程中,您可能会遇到这样的情况: 使用 console.log() 打印导入的模块名称时,实际输出的名称并不是您期望的名称。这是因为 uniapp 进行了编译和打包处理后,会将代码重新命名以减小文件大小和提高执行效率,包

    2024年02月10日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包