php网站实例宁波做网站公司

web/2025/10/6 14:53:51/文章来源:
php网站实例,宁波做网站公司,网站建设 知乎,杭州关键词排名工具介绍 针对JS与C/C跨语言访问场景#xff0c;NAPI使用比较繁琐。而AKI提供了极简语法糖使用方式#xff0c;一行代码完成JS与C/C的无障碍跨语言互调#xff0c;使用方便。本示例将介绍使用AKI编写C跨线程调用JS函数场景。通过调用C全局函数#xff0c;创建子线程来调用JS函…介绍 针对JS与C/C跨语言访问场景NAPI使用比较繁琐。而AKI提供了极简语法糖使用方式一行代码完成JS与C/C的无障碍跨语言互调使用方便。本示例将介绍使用AKI编写C跨线程调用JS函数场景。通过调用C全局函数创建子线程来调用JS函数实现对变量value的加10操作为开发者使用AKI提供参考。 效果图预览 使用说明 1.点击页面“AKI跨线程调用JS函数”按钮每次点击显示数值加10。 实现思路 以下是使用AKI和NPAI的libuv实现跨线程调用JS函数的实现对比 AKI和NAPI初始化。AKI初始化使用JSBIND_ADDON注册Native插件使用AKI的JSBIND_GLOBAL注册FFI特性然后在JSBIND_GLOBAL作用域下使用AKI的JSBIND_FUNCTION绑定C全局函数AkiThreadsCallJs。 ... // 使用JSBIND_ADDON注册Native插件可从JavaScript import导入插件。注册AKI插件名:即为编译*.so名称规则与NAPI一致。 JSBIND_ADDON(aki_use_practice) // 使用JSBIND_GLOBAL注册FFI特性。用于圈定需要绑定的全局函数作用域。 JSBIND_GLOBAL() {// 在JSBIND_GLOBAL作用域下使用JSBIND_FUNCTION绑定C全局函数后可从JavaScript直接调用。JSBIND_FUNCTION(AkiThreadsCallJs); } ...NAPI的libuv初始化需要定义napi_property_descriptor结构体准备模块加载相关信息将Init函数与模块名等信息记录下来。 ... static napi_value Init(napi_env env, napi_value exports) {// 第一个参数add为ArkTS侧对应方法的名称。napi_property_descriptor desc[] {{UvWorkTest, nullptr, UvWorkTest, nullptr, nullptr, nullptr, napi_default, nullptr} }; napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); return exports; }// 准备模块加载相关信息将Init函数与本模块名等信息记录下来。 static napi_module demoModule {.nm_version 1,.nm_flags 0,.nm_filename nullptr,.nm_register_func Init,.nm_modname entry,.nm_priv ((void *)0),.reserved {0}, };extern C __attribute__((constructor)) void RegisterModule(void) { napi_module_register(demoModule); } 2.AKI和NAPI在native侧的业务函数实现。 AKI在native侧业务函数实现是在AkiThreadsCallJs中创建子线程子线程中使用aki::JSBind:: GetJSFunction获取指定JavaScript函数akiAccumulate的句柄后使用Invoke触发调用。 // 定义C函数AkiThreadsCallJs。从native主线程中创建子线程subThread调用JavaScript函数。 void AkiThreadsCallJs(int value) {// 创建子线程subThreadstd::thread subThread([]() {// 使用aki::JSBind::GetJSFunction获取指定JavaScript函数句柄后使用Invoke触发调用。这里获取JS侧定义的函数akiAccumulate。if (auto func aki::JSBind::GetJSFunction(akiAccumulate)) {// 定义一个函数对象callback该函数对象接受一个整数参数并返回void。std::functionvoid(int) callback [](int value) {};// 调用JavaScript函数InvokeT指定返回值类型。func-Invokevoid(value, callback);}});// 将子线程subThread从主线程中分离出来,独立运行。subThread.detach();return; }NAPI的libuv在native侧业务函数实现是在native主线程中实现UvWorkTest接口。接口接收到ArkTS传入的JS回调函数后创建子线程执行函数CallbackUvWorkTest。在CallbackUvWorkTest中创建工作任务workReq通过uv_queue_work将工作任务添加到libuv队列中等待被执行。 static napi_value UvWorkTest(napi_env env, napi_callback_info info) {size_t argc 1;napi_value argv[1] {0};napi_get_cb_info(env, info, argc, argv, nullptr, nullptr);napi_valuetype valueType napi_undefined;napi_typeof(env, argv[0], valueType);if (valueType ! napi_function) {OH_LOG_ERROR(LOG_APP, UvWorkTest param is not function);return nullptr;}OH_LOG_INFO(LOG_APP, UvWorkTest current value:[%{public}d], g_cValue);for (int i 0; i g_threadNum; i) {auto asyncContext new CallbackContext();if (asyncContext nullptr) {OH_LOG_ERROR(LOG_APP, UvWorkTest new asyncContext fail!);return nullptr;}asyncContext-env env;asyncContext-retData i;OH_LOG_INFO(LOG_APP, UvWorkTest thread begin index:[%{public}d], value:[%{public}d], i, g_cValue);napi_create_reference(env, argv[0], 1, asyncContext-callbackRef);std::thread testThread(CallbackUvWorkTest, asyncContext);testThread.detach();OH_LOG_INFO(LOG_APP, UvWorkTest thread end index:[%{public}d], value:[%{public}d], i, g_cValue);}return nullptr; }void CallbackUvWorkTest(CallbackContext *context) {if (context nullptr) {OH_LOG_ERROR(LOG_APP, UvWorkTest context is nullptr);return;}uv_loop_s *loop nullptr;napi_get_uv_event_loop(context-env, loop);// 创建工作数据结构,自定义数据结构添加在data中uv_work_t *workReq new uv_work_t;if (workReq nullptr) {if (context ! nullptr) {napi_delete_reference(context-env, context-callbackRef);delete context;OH_LOG_INFO(LOG_APP, UvWorkTest delete context);context nullptr;}OH_LOG_ERROR(LOG_APP, UvWorkTest new uv_work_t fail!);return;}workReq-data (void *)context;// 此打印位于子线程OH_LOG_INFO(LOG_APP, UvWorkTest childThread_1 [%{public}d], g_cValue);// 添加工作任务到libuv的队列中uv_queue_work(loop, workReq, WorkCallback, AfterWorkCallback); }3.AKI和NAPI在ArkTS侧调用JS函数。 AKI在ArkTS侧使用AKI的JSBind.bindFunction绑定JavaScript全局函数akiAccumulate。使用AKI调用C全局函数AkiThreadsCallJs。 ... // 使用AKI的JSBind.bindFunction绑定JavaScript全局函数。 libaki.JSBind.bindFunction(akiAccumulate, (values: number) {// 对变量value做加10操作刷新Text组件的value值。values 10;this.value values; }); // TODO知识点使用AKI调用C全局函数AkiThreadsCallJs并传入参数value。 libaki.AkiThreadsCallJs(this.value); ...NAPI的libuv在ArkTS侧调用C全局函数UvWorkTest。 entry.UvWorkTest((values: number) {values 10;logger.info(UvWorkTest js callback value , values.toString());this.value values;return values; }通过以上AKI和NAPI实现跨线程调用JS的实现步骤的对比可以发现AKI在native侧相较于NAPI实现的代码量要少很多使用也更加方便。 高性能知识点 1.AKI使用方便但相比于NPAI对性能的损耗相对会多一些。对性能要求不高且更需要易用性开发的场景推荐使用AKI。 工程结构模块类型 akiusepractice // har类型 |---src\main\cpp | |---akiusepractice.cpp // native层-native侧业务处理 | |---CMakeLists.txt // native层-AKI相关CMake配置 |---src\main\ets\view | |---AkiView.ets // 视图层-AKI跨线程调用JS函数页面 模块依赖 本实例依赖AKI。 本实例依赖common模块来实现公共组件FunctionDescription。 为了帮助大家更深入有效的学习到鸿蒙开发知识点小编特意给大家准备了一份全套最新版的HarmonyOS NEXT学习资源获取完整版方式请点击→HarmonyOS教学视频https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3 HarmonyOS教学视频语法ArkTS、TypeScript、ArkUI等…视频教程 鸿蒙生态应用开发白皮书V2.0PDF 获取完整版白皮书方式请点击→https://docs.qq.com/doc/DZVVkRGRUd3pHSnFG?ua42c4946d1514235863bb82a7b2ac128 鸿蒙 (Harmony OS)开发学习手册→https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3 一、入门必看 1.应用开发导读(ArkTS) 2……… 二、HarmonyOS 概念→https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3 1.系统定义 2.技术架构 3.技术特性 4.系统安全 5… 三、如何快速入门→https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3 1.基本概念 2.构建第一个ArkTS应用 3… 四、开发基础知识→https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3 1.应用基础知识 2.配置文件 3.应用数据管理 4.应用安全管理 5.应用隐私保护 6.三方应用调用管控机制 7.资源分类与访问 8.学习ArkTS语言 五、基于ArkTS 开发→https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3 1.Ability开发 2.UI开发 3.公共事件与通知 4.窗口管理 5.媒体 6.安全 7.网络与链接 8.电话服务 9.数据管理 10.后台任务(Background Task)管理 11.设备管理 12.设备使用信息统计 13.DFX 14.国际化开发 15.折叠屏系列 更多了解更多鸿蒙开发的相关知识可以参考https://docs.qq.com/doc/DZVVBYlhuRkZQZlB3

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

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

相关文章

营销型网站工程义乌简游网络科技有限公司

一、yarn的简介 Yarn 是一款 JavaScript 的包管理工具(npm的代替方案),是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具。 正如 Yarn 官网的介绍,Yarn 的具有速度快 、安全 、可靠 的优点&#x…

网站建设 微信营销宣传广告牌图片

转载自 java.util.Stack类简介 Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来 Deque(双端队列)比起Stack具有更好的完整性和一致性,应该被优先使用…

浙江省工程建设管理质量协会网站怎么推广自己的qq群

2 疑问 2.1 这里的“只有当线程池是无界的或者可以拒绝任务时,该队列才有实际价值”,为什么这么说 SynchronousQueue是一种特殊的队列,它不保留任务,而是直接将任务移交给工作线程。这种队列适合于执行大量生命周期非常短的异步…

医院管理系统网站模板保定建设局网站

末端方法 末端方法是对流的最终操作。当对某个 Stream 执行末端方法后,该流将会被"消耗"
且不再可用。换句话说就是末端方法一旦调用后就会关闭流,再不能对流进行操作,否则会抛出异常。 方法功能forEach(Consumer action)遍历流…

河南平台网站建设制作网络推广营销网

queue是队列,特点是先进先出,后进后出,你可以理解为数据结构里的队列模型,他只允许你访问 queue<T> 容器适配器的第一个和最后一个元素。只能在容器的末尾添加新元素,只能从头部移除元素。许多程序都使用了 queue 容器。queue 容器可以用来表示超市的结账队列或服务…

wordpress建站工具包自媒体多平台发布工具

7-15 BCD解密 BCD数是用一个字节来表达两位十进制的数&#xff0c;每四个比特表示一位。所以如果一个BCD数的十六进制是0x12&#xff0c;它表达的就是十进制的12。但是小明没学过BCD&#xff0c;把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制…

学网站建设多少学费免费wordpress企业主题

本次练习的任务是使用逻辑归回和神经网络进行识别手写数字&#xff08;form 0 to 9, 自动手写数字问题已经应用非常广泛&#xff0c;比如邮编识别。 使用逻辑回归进行多分类分类 练习2 中的logistic 回归实现了二分类分类问题&#xff0c;现在将进行多分类&#xff0c;one vs…

网站建设前景怎么样公司建立网站的必要性

多维时序 | MATLAB实现WOA-CNN-BiGRU-Attention多变量时间序列预测&#xff08;SE注意力机制&#xff09; 目录 多维时序 | MATLAB实现WOA-CNN-BiGRU-Attention多变量时间序列预测&#xff08;SE注意力机制&#xff09;预测效果基本描述模型描述程序设计参考资料 预测效果 基本…

建个电子商务网站多少钱网站建设程序制作

open函数 要点&#xff1a; int open(const char *pathname, int flags); perror函数 close函数 控制台输入&#xff1a; man 2 open2 表示第二章&#xff08;Linux系统IO函数位于第二章&#xff09;&#xff0c;第三章是标准C库的一些函数部分输出&#xff1a; 1、open函数返…

宁津网站开发网站开发需要的技术人员有什么软件

前言&#xff1a;在Quartz.Net项目发布第一版Quartz.Net分布式任务管理平台后&#xff0c;有挺多园友去下载使用&#xff0c;我们通过QQ去探讨&#xff0c;其中项目中还是存在一定的不完善。所以有了现在这个版本。这个版本的编写完成其实有段时间了一直没有放上去。现在已经同…

外国茶网站建设如何做一间公司的网站

在Python中&#xff0c;可以使用Pandas库中的Series.to_json()方法将Series对象转换为JSON格式的字符串。以下是一个简单的例子&#xff1a; import pandas as pd# 创建一个Pandas Seriess pd.Series({a: 1, b: 2, c: 3})# 转换为JSON字符串json_str s.to_json(orientrecords…

建网站需要编程吗地方网站类型

在centos服务器中配置好vsftp后&#xff0c;开了root用户上传权限&#xff0c;也关了系统的防火墙&#xff0c;但ftp连接的时候依然还会出现 "550 Create directory operation failed." 错误&#xff0c;如何解决呢&#xff1f; 解决&#xff1a; 1、查看 SELinux 的…

网站代理协议汕头网页怎么制作

SpringBoot教程&#xff08;十五&#xff09; | SpringBoot集成RabbitMq&#xff08;消息丢失、消息重复、消息顺序、消息顺序&#xff09; RabbitMQ常见问题解决方案问题一&#xff1a;消息丢失的解决方案&#xff08;1&#xff09;生成者丢失消息丢失的情景解决方案1&#xf…

网站建设与管理 规划书投诉举报网站 建设方案

目录 uni-app介绍 uni-app开发工具HBuilderX 创建项目前提条件 uni-app项目结构 配置mumu模拟器 uni-app生命周期 1.应用生命周期 小程序规范 2.页面生命周期-小程序规范 3.组件生命周期 vue规范 uni-app登录按钮方法 uni-app发布安卓app uni-app介绍 uni-app 是一个…

仿99健康网网站源码为什么有网网站打不开怎么回事啊

一、选择数据库 在 MySQL 中&#xff0c;要选择&#xff08;或称为切换到&#xff09;一个数据库&#xff0c;可以使用 SQL 命令 USE。 USE database_name; database_name 是你要切换到的数据库的名称。 例如&#xff0c;要切换到名为 my_database 的数据库&#xff0c;可以…

长沙哪家网站公司wordpress 导航栏搜索

1.新建&#xff08;New&#xff09;: 线程对象已创建&#xff0c;但还没有调用 start() 方法。 2.可运行&#xff08;Runnable&#xff09;: 线程已启动&#xff0c;处于就绪状态&#xff0c;等待 JVM 的线程调度器分配CPU时间。 3.阻塞&#xff08;Blocked&#xff09;: 线程…

申请阿里巴巴网站首页wordpress pdf 加密

一、前言 对于大型企业而言&#xff0c;数据已经成为基本的生产资料&#xff0c;但是有很多公司还是值关心上层应用&#xff0c;而忽略了数据的治理&#xff0c;从而并不能很好的发挥公司的数据资产效益。比如博主自己是做后端的&#xff0c;主要是做应用层&#xff0c;也就是…

使用腾讯云建设网站教程wordpress的安全错误

模拟固定吞吐量的定时器。它可以控制测试计划中各个请求之间的时间间隔&#xff0c;以达到预期的吞吐量。 参数包括&#xff1a; Target Throughput&#xff1a;目标吞吐量&#xff08;每分钟请求数&#xff09;Calculate Throughput based on&#xff1a;吞吐量计算基准&…

google推广妙招百度怎么优化关键词排名

在使用 BeautifulSoup 和 Selenium 时&#xff0c;处理 href"javascript:;" 的链接需要一些额外的步骤&#xff0c;因为这些链接不直接指向一个 URL&#xff0c;而是通过 JavaScript 代码来执行某些操作。这可能包括导航到另一个页面、触发模态窗口、显示/隐藏内容等…