caimouse
在IT行业有20多年的经验。拥有20多年的C和C++开发经验,5年以上Python开发经验,资深数据库开发、上百G数据库优化经验。曾经任职嵌入式工程师、P2P开发工程师、银行信用卡交易系统工程师、全自动化电池测试部门经理。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
UI引擎里AceAbility::OnStart函数1
摘要:这段代码展示了AceAbility::OnStart方法的核心初始化流程,主要包括:1)调用父类Ability的默认初始化;2)生成唯一的容器ID;3)使用once_flag确保一次性初始化;4)获取Ability上下文对象;5)准备应用缓存目录。该过程为后续AceContainer创建和ArkUI引擎初始化奠定了基础,体现了HarmonyOS在生命周期管理、资源隔离和多实例处理方面的设计思想,支持冷启动、配置变更恢复和分布式迁移等场景。原创 2025-10-31 15:46:59 · 93 阅读 · 0 评论 -
鸿蒙应用的启动流程的过程
《HarmonyOS中AceAbility::OnStart()的调用机制分析》 摘要:本文详细剖析了HarmonyOS中AceAbility::OnStart()方法的调用机制。该方法由框架自动管理,调用路径依次为:用户操作触发StartAbility()→AbilityManagerService处理请求→AbilityThread创建实例→通过反射机制最终调用目标Ability的OnStart()。开发者只需重写该方法实现业务逻辑,不应直接调用。调用时需注意:1)必须在200ms内完成,耗时操作应异步原创 2025-10-28 18:51:57 · 262 阅读 · 0 评论 -
AceContainer类中用于初始化任务执行系统的核心方法--AceContainer::InitializeTask
本文解析了AceContainer类中InitializeTask方法的实现逻辑,该方法负责初始化ArkUI框架的任务调度系统。主要功能包括:创建任务执行器(支持自定义或默认实现)、初始化平台线程(UI线程)、设置JS线程策略(声明式JS前端复用UI线程,其他前端使用独立JS线程)。代码体现了性能优化(减少线程切换)与资源隔离(卡片独立线程)的设计理念,通过灵活的参数配置支持主应用、卡片及分布式等不同场景,是ArkUI框架实现高效渲染的核心机制。原创 2025-10-28 16:27:29 · 93 阅读 · 0 评论 -
三个构造函数AceContainer的区别和作用
本文分析了AceContainer类的三个构造函数:1)FA模型构造函数,使用shared_ptrAppExecFwk::Ability,标识为传统FA模型;2)Stage模型基础构造函数,采用weak_ptr<Context>和weak_ptr<AbilityInfo>,支持子容器标识;3)Stage模型动态组件构造函数,新增TaskWrapper参数支持任务定制。三者通过模型隔离、资源优化和动态扩展设计,为HarmonyOS应用提供多场景适配能力,区别主要体现在核心参数、任务管理原创 2025-10-24 17:42:23 · 228 阅读 · 0 评论 -
AceContainer::Initialize()函数的分析
该代码展示了HarmonyOS ArkUI框架中AceContainer类的初始化逻辑。主要功能包括:1)通过ContainerScope管理容器作用域,确保线程安全隔离;2)根据前端类型(声明式JS/非声明式)进行差异化初始化处理;3)非声明式前端立即调用InitializeFrontend()进行初始化。关键设计点在于解决UI线程依赖问题,通过延迟初始化声明式前端来保证线程安全,同时优化资源使用。该机制体现了框架对多前端类型和复杂线程模型的精细控制能力。原创 2025-10-24 17:33:29 · 90 阅读 · 0 评论 -
HarmonyOS ArkUI框架中AceContainer类的成员变量定义
该摘要介绍了HarmonyOS ArkUI框架中AceContainer类的核心功能与设计特点。作为UI实例的管理中枢,AceContainer包含9大功能模块:1)核心组件管理;2)资源系统;3)窗口管理;4)卡片支持;5)状态管理;6)事件处理;7)配置扩展;8)线程安全控制;9)扩展能力。其创新设计体现在多实例隔离、精细资源管理、事件处理机制和动态配置更新等方面,支持主窗口、子窗口和卡片等多种UI形态,并通过10+个互斥锁确保线程安全。该框架展现了华为在跨设备UI领域的技术深度。原创 2025-10-24 17:22:33 · 480 阅读 · 0 评论 -
鸿蒙OS 生命周期中调用的函数流程图
HarmonyOS的UIAbility生命周期函数定义了应用从创建到销毁的完整流程。Stage模型下主要包含6个核心函数:onCreate初始化全局资源;onWindowStageCreate加载UI内容;onForeground处理界面可见时的恢复操作;onBackground释放资源并暂停任务;onWindowStageDestroy清理UI资源;onDestroy进行最终资源释放。这些函数覆盖了应用启动、运行、切换和销毁的全过程,开发者需合理利用各阶段进行资源管理和状态维护,特别是onBackgrou原创 2025-10-24 15:36:01 · 144 阅读 · 0 评论 -
触发页面的 JS 代码加载和根组件更新
本文解析了HarmonyOS ArkUI框架中的loadCallback回调函数,该函数在异步加载JS/ArkTS页面资源后触发JS代码加载和根组件更新。函数通过WeakPtr弱引用JS引擎实例避免内存泄漏,接收页面路径、页面实例和主页面标记三个参数,执行时先加载JS代码再更新根组件,实现从资源加载到UI渲染的完整流程。作为资源加载与JS执行的关键桥梁,loadCallback是ArkUI框架实现页面异步渲染的重要组成部分。原创 2025-10-23 19:36:58 · 299 阅读 · 0 评论 -
TextComponent(文本组件描述)与 FrameNode(渲染节点)的关联
本文分析了HarmonyOS ArkUI中TextComponent与FrameNode的关联机制。TextElement作为中间层连接两者,通过Init()方法完成组件绑定、FrameNode创建及属性同步。TextComponent存储文本属性(内容、样式等),TextElement负责将这些属性转换为FrameNode可用的渲染参数并维护双向引用。当属性变化时,Update()方法触发同步更新并标记渲染节点为"脏"以重绘。这种分层设计实现了文本定义与渲染的解耦,提高了框架的灵活性和原创 2025-10-23 18:05:07 · 64 阅读 · 0 评论 -
鸿蒙的声明式 UI转换为 JSView
摘要:HarmonyOS声明式UI通过JSView树与Component树的一一映射实现高效渲染机制。JSView作为JS层UI描述载体,存储元素结构、样式和交互逻辑;其派生类(如JSText、JSGrid)实现组件原子化特性。JsiDeclarativeEngine将JSView树转换为原生Component树,每个JSView节点对应特定Component类。这种分层设计实现描述与渲染解耦,支持高效差异更新和跨平台适配,是"声明式描述→高效渲染"的核心链路。原创 2025-10-22 15:53:01 · 113 阅读 · 0 评论 -
鸿蒙 HarmonyOS 应用框架中前端开发模式或应用类型的分类
摘要:FrontendType枚举类用于标识鸿蒙ArkUI框架中的前端开发模式类型,包含7种枚举值(如JSON、JS、ETS_CARD等),分别对应不同的开发范式和场景(传统JS开发、声明式开发、卡片应用等)。框架通过该类型适配不同的解析器、渲染管线和运行时环境,实现资源加载、生命周期管理和开发范式隔离。该设计支持多种开发方式在统一框架下高效运行,满足从简单JSON配置到复杂ArkTS声明的各类需求。原创 2025-10-21 14:23:34 · 180 阅读 · 0 评论 -
PreloadAceModuleWorker 方法的核心功能
摘要:该代码是JsiDeclarativeEngineInstance类的PreloadAceModuleWorker方法,用于在Worker线程中预加载ArkUI框架的核心模块。主要功能包括:标记Worker模式、初始化ArkTS运行时环境、关联原生引擎、创建局部作用域、注册字符串缓存表、预加载视图组件和枚举类型,以及注入原生模块调用接口。该方法通过预先加载必要资源,确保Worker线程能够高效执行ArkUI相关脚本,并实现与原生引擎的交互,是ArkUI框架支持多线程协作的关键初始化步骤。原创 2025-10-21 11:27:31 · 72 阅读 · 0 评论 -
Harmonyos 中RenderNode的作用
摘要:HarmonyOS中的RenderNode是UI渲染的核心组件,负责封装UI元素的绘制信息(尺寸、位置、样式等),管理渲染层级关系,驱动绘制流程,优化性能(脏区域标记、缓存机制),并适配多种渲染场景。作为UI与底层渲染引擎的桥梁,RenderNode实现了高效正确的UI显示,开发者可通过理解其机制优化性能或进行自定义渲染扩展。(149字)原创 2025-10-20 08:35:36 · 193 阅读 · 0 评论 -
鸿蒙系统组件编译的内幕
ArkUI组件编译流程:开发者编写的带有@Component注解的struct组件,经ArkCompiler处理后,会转换为继承ViewPU的类。流程包括:1)识别注解标记组件;2)生成中间表示;3)将struct转为class并继承ViewPU;4)注入渲染逻辑和状态管理;5)生成最终可执行代码。ViewPU继承自C++类NativeViewPartialUpdate,由此实现声明式UI到C++组件树的转换,支持界面更新。该流程通过编译器自动完成struct到class的转换,简化开发同时确保符合框架运行原创 2025-10-17 14:42:38 · 125 阅读 · 0 评论 -
鸿蒙前端使用按钮组件的处理流程
本文介绍了前端开发中按钮组件的正确使用方式。通过ArkUI提供的<Button>组件,开发者可以便捷地实现按钮功能,框架会自动完成与底层DOMButton的关联。文章展示了ArkTS声明式和JS扩展两种用法示例,并解释了前端组件与底层DOMButton的映射关系,包括属性解析、实例化、渲染关联和事件绑定四个阶段。同时说明了使用封装组件而非直接操作DOMButton的优势:封装隔离底层细节、跨端适配不同平台、提升开发效率。最后强调开发者只需使用框架提供的组件接口,无需关心底层实现。原创 2025-10-11 10:44:42 · 113 阅读 · 0 评论 -
鸿蒙应用开发之List容器
前面学习了表格类似的布局容器,在这里也有列表形式的容器,比如List容器。特别适合图片进行浏览显示,这样用户可以不断地滚动查看图片,差不多是无限查看的可能。.divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 }) // 每行之间的分界线。.edgeEffect(EdgeEffect.Spring) // 滑动到边缘无效果。采用列面,本身就可以滚动,所以可以上下查看内容。这里设置的排列方向为竖直的排列方向。原创 2024-08-22 20:36:08 · 251 阅读 · 0 评论 -
鸿蒙应用开发之GridItem容器
.rowStart(1).rowEnd(2).columnStart(1).columnEnd(2) // 同时设置合理的行列号。}.columnStart(1).columnEnd(4) // 只设置列号,不会从第1列开始布局。从上图看到4字这项占用的空间比较大,其它的是一样的,这样的布局又是如何实现的呢?这时候就需要使用到GridItem容器。就是上面显示最后那列内容为5的表格。这样设置就会显示为4的单元格大小。原创 2024-08-16 11:24:54 · 201 阅读 · 0 评论 -
鸿蒙应用开发之Grid容器
而这个行列布局完全靠两个字符串来决定,因此,灵活性上来说,它没有GridRow容器灵活,但是它简单一些,对于大量元素显示的布局就比较合适,比如图片浏览显示等等。主要的属性就两个,第一个属性是columnsTemplate,它是设置每行多少列显示的。例如, '1fr 1fr 2fr' 是将父组件分3列,将父组件允许的宽分为4等份,第一列占1份,第二列占1份,第三列占2份。设置为'0fr'时,该列的列宽为0,不显示GridItem。如果这两个属性都设置,那么只按照这个设置进行显示,多余不会显示。原创 2024-08-08 10:00:03 · 232 阅读 · 0 评论 -
鸿蒙应用开发之GridRow和GridCol容器
在不同屏幕上布局是一个比较困难的问题,因为屏幕大小不一样,导致内容布局会比较混乱。所以提出一种网络的方式来布局,即使屏幕大小改变了,但是布局行列数不变,那么内容就不会混乱。这个参数是用来设置判断不同屏幕大小时,进行切换的判断标准。当屏幕大小为xs时,空间占用两格,当屏幕为sm时,占用3格,当为md时,占用4格。这个参数是用来表示每格之间的间距,x是表示横向方向,y是表示竖向方式。要想把这种布局搞好,还是需要不断试验和修改才能调整适合不同设备的界面。所以可以根据这个情况来设置界面的布局。主要有上面这些标志。原创 2024-08-06 12:01:58 · 253 阅读 · 0 评论 -
鸿蒙应用开发之Flex容器
前面学习了Column等容器,现在学习一个灵活弹性的容器,它就是Flex容器。它可以让容器里面的组件按不同的方式来排序前后,而不需要调整界面显示的代码。在这里可以看到组件显示的方向不一样,前面一行是从左到右进行布局,而后面一行是从右到左布局。针对这种需求,只能使用Flex容器才能方便实现。标准Flex布局容器。这是方向参数的区别。原创 2024-07-13 12:11:09 · 869 阅读 · 1 评论 -
鸿蒙应用开发之Counter容器
要在文本组件里显示出来,需要定义一个数字变量,然后在上面两个事件里对这个变量进行计数,点击减少就对变量进行减少,点击增加就对变量进行增加,然后就可以在文本组件里显示出变量的值变化。这段就是事件响应代码,如果变量值不是按1变化,可以按10变化地修改。上面组件中间显示5的组件是一个文本组件,边上提供了增减的按钮。原创 2024-07-11 11:40:31 · 848 阅读 · 0 评论 -
鸿蒙应用开发之ColumnSplit容器
这样就可以拖动的操作了。原创 2024-07-11 11:21:28 · 954 阅读 · 0 评论 -
鸿蒙应用开发之Column容器
这个Column容器设置显示为上一个容器的90%宽度,所以在手机两边就留有空间。其中看到每个边框有实线的也是一个Column容器,这里只不过把它的边框显示出来,最外面这个Column没有把边框线显示出来。先在最外面建立一个Column容器,space和方框显示等显示内容都是作为一行进行排列。如果一行里子容器不填满宽度,那么就需要进行排列,默认是中间排列,也可以设置为从左向右,或者从右向左都可行。这个容器已经使用了很多次,但是还是需要来简单地学习一下,它的主要作用是沿垂直方向布局的容器。原创 2024-07-05 10:26:19 · 224 阅读 · 0 评论 -
鸿蒙应用开发之Badge容器
在开发应用的时候,经常需要一些提示,特别当用户打开应用时,有一些事情需要提醒一下用户,但是不能自动打开这个窗口提示,这样会让用户比较烦。方法1: Badge(value: {count: number, position?在这里显示红点的地方,就是目前介绍的容器Badge实现的功能。从上面来看,有三种不同的形式,一种是在图标上显示一个红点,一种是图标后面显示红色文字,最后一种是显示一个数量。方法2: Badge(value: {value: string, position?根据字符串创建标记组件。原创 2024-07-04 10:28:55 · 300 阅读 · 0 评论 -
鸿蒙应用开发之OpenGL的EGL
EGL 是渲染 API(如 OpenGL ES)和原生窗口系统之间的接口,通常来说,OpenGL 是一个操作 GPU 的 API,它通过驱动向 GPU 发送相关指令,控制图形渲染管线状态机的运行状态,但是当涉及到与本地窗口系统进行交互时,就需要这么一个中间层,且它最好是与平台无关的,因此 EGL 被设计出来,作为 OpenGL 和原生窗口系统之间的桥梁。这也许就是EGL的功劳吧,简单地说EGL就是Opengl和平台各平台之间的一个适配器,是一系列的接口,具体实现是由具体的设备厂商实现的。原创 2024-06-29 12:23:31 · 500 阅读 · 0 评论 -
鸿蒙应用开发之OpenGL绘画三角形
并且使用GL_FLOAT类型,由于坐标值已经归一化,也就是在-1到1之间,所以设置为GL_FALSE,无须归一化处理。可用的符号常量有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值为GL_FLOAT。这个数组定义了三角形的三个坐标,第一个顶点是(0.0f, 0.5f, 0.0f),第二个顶点是(-0.5f, -0.5f, 0.0f),第三个顶点是(0.5f, -0.5f, 0.0f)。原创 2024-06-04 11:25:06 · 585 阅读 · 0 评论 -
鸿蒙应用开发之OpenGL应用和X组件12
如果成功,就会返回非0值,这时候就可以返回整个编译后的着色器对象shader,否则后面就去查找编译出错的原因。这段代码把上面的x组件的ID转换为string串对象,然后调用函数 PluginRender::GetInstance获取渲染对象render ,最后调用渲染对象的函数render->m_eglCore->ChangeColor。这个函数主要传入两个参数,第一个参数type是加载着色器的类型,在这里主要有两种,一种是GL_VERTEX_SHADER,另外一种是GL_FRAGMENT_SHADER;原创 2024-06-03 10:05:07 · 384 阅读 · 0 评论 -
鸿蒙应用开发之OpenGL应用和X组件11
在这个函数,先设置m_flag标志,这个标志是用来表示是否画四边形,如果为false表示还没有画四边形,这时候点击界面就不会改变颜色。这段代码就可以通过X组件的指针来获取X组件的ID字符串,把它保存在变量idStr,这样后面就可以通过ID串来找到对应的渲染对象。这段代码从环境变量里获取X组件的指针,保存在exportInstance里,后面会通过X组件指针来操作X组件。要显示四边形,先要构造一个四边形的顶点数组。在上面这段代码里,先进行日志输出,然后进行参数判断,如果参数不正确就返回出错。原创 2024-05-31 09:04:03 · 930 阅读 · 1 评论 -
鸿蒙应用开发之OpenGL应用和X组件10
ExecuteDraw的作用是设置要显示图形的顶点坐标,以及显示的颜色,并进行绘制。这个函数输入几个参数,第一个参数position是用来表明是哪一个索引输入位置,是从函数glGetAttribLocation(m_program, POSITION_NAME)里获取的返回值,其实就是"a_position"的位置,也就是顶点坐标的输入索引;在这里使用这行代码glVertexAttrib4fv(1, color)来设置所有顶点的颜色值,这里指定的索引号为1,也就是GLSL程序里的位置1的颜色索引。原创 2024-05-30 09:57:24 · 243 阅读 · 0 评论 -
鸿蒙应用开发之OpenGL应用和X组件9
着色器程序对象相当于着色器对象的容器,和任何OpenGL管理的对象一样,在使用着色器程序对象之前,需要通过glCreateProgram接口来创建出一个着色器程序对象。这段代码就是对前面进行链接的程序进行判断是否出错,如果连接成功就可以返回当前的程序进行使用,当前程序是保存在变量program里。这段代码调用glAttachShader进行关联到着色器管理对象,这样顶点着色器和片段着色器就放到管理对象里面,最后调用glLinkProgram来进行连接,才能生成GPU执行的二进制程序。原创 2024-05-29 09:53:17 · 274 阅读 · 0 评论 -
鸿蒙应用开发之OpenGL应用和X组件8
layout(location = 0),叫做布局限定符,目的是为了方便给变量提供数据,layout()的还有其他的选项,在这里location相当于设定了变量在着色器程序中的访问位置。还需要注意的是,变量名不能以 gl_ 作为前缀,这个是 GLSL 保留的前缀,用于 GLSL 的内部变量。gl_Position vec4 输出属性,变换后的顶点位置,用于后面的裁剪等操作,所有的顶点着色器都必须写这个值。gl_MultiTexColor vec4 输入属性,表示的是顶点的第n个纹理的坐标。原创 2024-05-28 10:11:25 · 299 阅读 · 0 评论 -
鸿蒙应用开发之OpenGL应用和X组件7
在前面介绍了X组件调用函数来初始化,初始化之后,就需要调用EGL函数来初始化OpenGL的环境,才能使用OpenGL函数来绘制图形。调用 EGLboolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor),该函数会进行一些内部初始化工作,并传回EGL版本号(major.minor)。保存窗口的宽度和高度,以便后面使用。这段代码开始进行初始化EGL,主要是调用eglInitialize函数,然后获取OpenGL的版本号。原创 2024-05-27 12:12:03 · 306 阅读 · 0 评论 -
鸿蒙应用开发之OpenGL应用和X组件6
接着重要的功能,就是设置X组件回调函数对象m_callback,它的4个调函数指针,都设置好之后,就可以给X组件进行处理了。前面已经分析怎么样注册X组件的回调函数,然后这些回调函数就可以在X组件合适的时机进行回调,就可以让C++的代码在合适的时间做合适的事情。在这段代码,先从容器里查找是否在存在这个ID的X组件插件,如果没有就会创建一个PluginRender对象,这个对象负责注册回调对象维护,并且管理显示图像的对象。在这个回调函数里,传入两个参数,第一个参数component是一个X组件的指针;原创 2024-05-24 12:24:12 · 502 阅读 · 0 评论 -
鸿蒙应用开发之OpenGL应用和X组件5
这段代码就通过NAPI的函数napi_get_named_property获取X组件的通用指针,它定义名称为OH_NATIVE_XCOMPONENT_OBJ,这是X组件在C++端的名称。这段代码就是使用获得的X组件的指针,然后通过函数OH_NativeXComponent_GetXComponentId来获取X组件的ID,这个ID保存在idStr数组里,给后面使用。因此,我们需要注册C++层的回调函数OnSurfaceCreated,这样当X组件创建成功之后调用我们在C++里的代码。原创 2024-05-22 11:59:36 · 280 阅读 · 0 评论 -
鸿蒙应用开发之OpenGL应用和X组件4
接着就是做主要的事情,映射库的导出方法getContext,这是在ArkTS里看到的方法,在C++里实际上是函数PluginManager::GetContext,这个函数也是一个静态的全局函数,可以任何地方调用,并且这个函数里的访问变量也是全局的。这行代码干的活比较多,首先要拿到X组件在C++里的指针,然后绑定这个X组件和ID关系,并且注册X组件的回调函数,这样才能根据X组件的生命周期来处理界面,最后还需要导出X组件交互函数,以便用户在X组件点击时触发C++层的代码运行。接着查找GLES库。原创 2024-05-21 10:39:18 · 378 阅读 · 0 评论 -
鸿蒙应用开发之OpenGL应用和X组件3
这些函数都是根据APP生命周期来调用库里的函数,这样库里的函数就可以根据这些函数来安排不同的代码执行了,在这个例子里基本上就是打印一个日志输出,没有什么实质内容。前面已经分析应用生命周期和页面生命周期,所以我们需要在OpenGL开发的库里区分这两个状态,以便在不同的状态下导出不同的函数给TS侧使用。然后返回一个任何类型的对象。上面页面的生命周期的调用顺序流程图,根据流程图,就可以在将要显示的函数加载资源文件,以便在显示出来时就能画到界面上。这样在C++开发的代码库里,就可以根据这些函数来执行需要的代码。原创 2024-05-20 11:49:01 · 273 阅读 · 0 评论 -
鸿蒙应用开发之OpenGL应用和X组件2
紧跟着下来onLoad方法设置加载XComponent组件成功之后获取这个组件对应的对象,保存在变量this.xComponentContext,这样后面就可以调用它为更新X组件绘制的内容,达到交互的目的。在这里要注意的是显示文本串是从资源里加载,并且资源里有中英资源,可以根据系统的语言来自动切换不同的语言显示的。在X组件里又设置了这个库的名称,那么在加载X组件时,就会自动要求系统加载这个库,当这个库加载完成之后,就会调用。从上面可知,应用生命周期是大于页面生命周期的,所以需要区分所处状态。原创 2024-05-20 10:15:43 · 365 阅读 · 0 评论 -
鸿蒙应用开发之OpenGL应用和X组件1
前面学习调用C++开发的代码库,这样可以加入C++语言来开发鸿蒙应用,加快对一些要求运算速度比较高的场合,也提高对旧的项目移植性。前面的C++语言开发的应用,只是简单的调用功能计算,并没有C++代码来操作界面的要求,并且没有使用复杂的C++的功能,这里不仅要在C++里输出图形到界面,并且还是采用OpenGL来开发,OpenGL就是一个非常复杂的库,以及不同的编程习惯。从上图我们就可以看到整个软件的基本组成,与前面学习的C++开发代码库是一样的,只是不同的文件,以及增加X组件的应用。原创 2024-05-17 12:12:46 · 961 阅读 · 1 评论 -
鸿蒙应用开发之调用C++开发代码库4
在这里调用函数napi_create_double,它是用来从C++类型double创建一个JS类型对象返回,并且把返回结果保存在变量napiResult,由于napi_value是指针,那么&napiResult就是指向指针的指针。返回值采用napi_value类型定义,napi_value类型是一个指针类型,并且是一个通用的指针类型,其实它就是相当于void*类型,可以保存任何类型的数值指针。接着定义它返回napi_value类型,这个类型是NAPI的通用类型,可以表示数字、字符串和布尔值等。原创 2024-05-16 12:14:01 · 353 阅读 · 0 评论 -
鸿蒙应用开发之调用C++开发代码库3
extern "C"的作用就是声明这个函数是以C语言接口方式导出,方便JS引擎加载模块时,可以按C的方式执行函数RegisterModule,RegisterModule的作用是把本模块的信息demoModule放到引擎的调用队列里,以便后面TS代码执行时去查找队列。"myHypot"是声明在文件index.d.ts的函数,也就是JS引擎可以识别的函数,而MyHypot是C++的函数,这中间的转换就靠NAPI框架转换了。我们从JS调用框架图就知道,调用主要分为三层,JS开发的C++模块、框架层、JS引擎。原创 2024-05-16 09:03:16 · 601 阅读 · 0 评论
分享