当前位置: 首页 > article >正文

【Butterfly库OpenHarmony实战使用教程】|NAPI封装+Native C API调用+真机运行

Butterfly库OpenHarmony实战使用教程NAPI封装Native C API调用真机运行大家好我是InMainJhy一名在上海读本科的大一学生。本篇严格按照鸿蒙三方库征文要求创作基于NAPI封装Native C API演示Butterfly库在鸿蒙应用中的实际调用全文超3万字细节拉满、步骤完整、可直接复制发布新手跟着操作就能一次跑通✨一、前置成果回顾通过上一篇适配指南我们已经完成了Butterfly库的OpenHarmony 5.0全适配获得适配完成的Butterfly完整源码合规HPKBUILD编译脚本arm64-v8a架构静态库libbutterfly.a符合社区规范的tar.gz交付包AtomGit代码托管 合规PR提交社区本篇聚焦实战集成基于NAPI封装实现C/C与ArkTS的桥接演示库在鸿蒙应用中的实际调用完成从底层适配到上层应用的全流程闭环。二、集成环境与工程准备✅2.1 环境要求DevEco Studio 5.0.3OpenHarmony 5.0(API 11)目标架构arm64-v8a工程模板Empty Ability必须勾选Native C2.2 资源准备编译好的libbutterfly.a静态库Butterfly头文件butterfly.h新建的鸿蒙ArkTSNative工程三、静态库导入与CMake配置核心基础3.1 目录创建在工程中创建以下目录entry/src/main/ohos/libs/arm64-v8a/ entry/src/main/cpp/include/3.2 文件放置将libbutterfly.a放入entry/src/main/ohos/libs/arm64-v8a/将butterfly.h及所有头文件放入entry/src/main/cpp/include/3.3 完整CMakeLists.txt配置带详细注释cmake_minimum_required(VERSION 3.16) project(butterfly_demo) # 添加头文件搜索路径确保编译器能找到butterfly.h include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include) # 设置静态库搜索路径 set(LIBDIR ${CMAKE_SOURCE_DIR}/../src/main/ohos/libs/arm64-v8a) link_directories(${LIBDIR}) # 编译源文件添加napi_wrapper.cpp add_library(entry SHARED src/main/cpp/napi_wrapper.cpp) # 链接Butterfly静态库必须添加否则无法调用库接口 target_link_libraries(entry PUBLIC libbutterfly.a)点击同步项目无红色报错即为导入成功。我曾因忘记链接静态库导致出现大量未定义引用报错新手务必注意。四、NAPI封装C/C ↔ ArkTS桥梁4.1 NAPI封装原理NAPI是鸿蒙提供的C/C与ArkTS交互的桥接框架通过封装C/C接口让ArkTS可以直接调用底层图形库能力实现跨语言调用。4.2 完整NAPI封装代码带详细注释新建src/main/cpp/napi_wrapper.cpp内容如下#includenapi/native_api.h#includeinclude/butterfly.h// 封装Butterfly核心图形绘制接口bf_draw_demo// 该函数会在ArkTS中被调用触发底层图形绘制staticnapi_valuebf_draw_demo(napi_env env,napi_callback_info info){// 调用Butterfly库的底层绘制函数butterfly_draw_demo();// 返回nullptr若有返回值可修改为对应类型的napi_valuereturnnullptr;}// 封装Butterfly图形初始化接口可选根据库功能添加staticnapi_valuebf_init(napi_env env,napi_callback_info info){// 调用Butterfly初始化函数intretbutterfly_init();// 将返回值转换为napi_value返回给ArkTSnapi_value result;napi_create_int32(env,ret,result);returnresult;}// NAPI初始化暴露接口给ArkTSEXTERN_C_START napi_valueInit(napi_env env,napi_value exports){// 定义要暴露的接口数组napi_property_descriptor desc[]{{bfDrawDemo,// ArkTS中调用的函数名nullptr,// getter函数无需则填nullptrbf_draw_demo,// 封装的C/C函数nullptr,// setter函数无需则填nullptrnullptr,// 函数名调试用无需则填nullptrnullptr,// 额外数据无需则填nullptrnapi_default,// 接口属性默认即可nullptr// 额外数据无需则填nullptr},{bfInit,// ArkTS中调用的初始化函数名nullptr,bf_init,nullptr,nullptr,nullptr,napi_default,nullptr}};// 将接口注册到exports中供ArkTS导入使用napi_define_properties(env,exports,sizeof(desc)/sizeof(desc[0]),desc);returnexports;}EXTERN_C_END// 注册NAPI模块模块名必须与CMakeLists.txt中的target名称一致此处为entryNAPI_MODULE(entry,Init)五、ArkTS页面编写完整UI交互样式5.1 完整Index.ets代码可直接运行importnativefrom../lib/entry.soimport{promptAction}fromkit.ArkUI;EntryComponentstruct ButterflyDemoPage{// 状态变量记录绘制状态StateisDrawed:booleanfalse;build(){Column({space:24}){// 页面标题Text(Butterfly图形库鸿蒙演示).fontSize(32).fontWeight(FontWeight.Bold).textAlign(TextAlign.Center).width(100%).margin({top:48})// 图形展示区域用于显示Butterfly绘制的图形Column().width(92%).height(360).backgroundColor(Color.White).borderRadius(20).shadow({radius:12,color:#D0D0D0,offsetX:0,offsetY:6}).margin({top:20})// 初始化按钮调用bfInit接口Button(初始化图形库).width(85%).height(56).fontSize(18).fontWeight(FontWeight.Medium).backgroundColor(#0099FF).fontColor(Color.White).borderRadius(28).onClick((){// 调用NAPI封装的初始化接口letretnative.bfInit();if(ret0){promptAction.showToast({message:图形库初始化成功,duration:2000,bottom:120});}else{promptAction.showToast({message:初始化失败,duration:2000,bottom:120});}})// 绘制按钮调用bfDrawDemo接口Button(点击绘制图形).width(85%).height(56).fontSize(18).fontWeight(FontWeight.Medium).backgroundColor(#0066CC).fontColor(Color.White).borderRadius(28).onClick((){// 调用NAPI封装的绘制接口native.bfDrawDemo();this.isDrawedtrue;promptAction.showToast({message:图形绘制成功,duration:2000,bottom:120});})// 绘制状态提示Text(this.isDrawed?图形已绘制完成:未绘制图形).fontSize(16).fontColor(this.isDrawed?Color.Green:Color.Grey).margin({top:8})// 底部说明文字Text(基于OpenHarmony 5.0 Butterfly适配库).fontSize(14).fontColor(Color.Grey).margin({bottom:24})}.width(100%).height(100%).justifyContent(FlexAlign.Center).backgroundColor(#F5F5F5)}}六、真机/模拟器运行与多轮测试✅6.1 运行步骤连接鸿蒙真机或启动OpenHarmony 5.0模拟器选择arm64-v8a架构点击运行按钮等待编译、安装、启动应用进入页面后先点击「初始化图形库」按钮再点击「点击绘制图形」按钮观察Logcat面板无红色报错连续多次点击按钮测试应用无崩溃、无闪退、无内存泄漏验证图形正常渲染符合预期效果6.2 测试验证标准按钮点击后能成功调用Butterfly库接口绘制对应图形多次点击后应用运行稳定无崩溃、无闪退Logcat面板无报错日志无内存泄漏图形渲染正常与原生库效果一致应用启动速度快无卡顿七、集成全量报错彻底解决⚠️7.1 报错1找不到entry.so模块报错日志Error: Cannot find module ../lib/entry.so报错原因NAPI模块名写错、so文件路径错误、编译失败未生成so文件解决方法确认NAPI模块名与封装中的模块名一致此处为entry检查so文件路径是否正确确保so文件已生成重新编译项目生成so文件7.2 报错2架构不匹配闪退报错日志Process crashed due to signal 11 (SIGSEGV)报错原因库架构与应用架构不一致解决方法全工程统一为arm64-v8a重新编译静态库和应用7.3 报错3头文件未找到报错日志fatal error: butterfly.h file not found报错原因头文件未复制到cpp目录、头文件路径配置错误解决方法将Butterfly头文件复制到entry/src/main/cpp/include/在CMakeLists.txt中添加头文件搜索路径include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include)7.4 报错4链接静态库失败报错日志ld: error: linker command failed with exit code 1报错原因静态库路径错误、CMakeLists.txt未链接静态库、静态库损坏解决方法确认静态库路径正确添加静态库搜索路径到CMakeLists.txt确保CMakeLists.txt中已链接libbutterfly.a重新编译静态库确保静态库无损坏7.5 报错5应用崩溃内存泄漏报错日志无明显日志应用直接闪退报错原因Butterfly库中未释放内存、NAPI封装中内存管理不当解决方法在Butterfly库中添加内存释放逻辑确保图形绘制后释放资源在NAPI封装中检查内存分配避免内存泄漏使用DevEco Studio的内存检测工具排查内存泄漏问题八、集成成果总结本次Butterfly库在鸿蒙应用中的集成完整实现了鸿蒙应用与适配后Butterfly库的全流程集成NAPI桥接层封装实现C/C与ArkTS的互通美观、高可用的ArkTS交互页面包含初始化、绘制、状态提示真机/模拟器稳定运行无报错、无泄漏形成可复用的三方库集成标准模板完全满足鸿蒙三方库征文要求可顺利领取30元文章激励金✅九、未来拓展方向封装更多Butterfly库接口如自定义图形、颜色填充、文字渲染等适配armeabi-v7a、x86_64等多架构扩大应用范围开发完整鸿蒙画板应用集成Butterfly库的所有绘制能力优化NAPI封装提升接口调用效率减少内存占用发布可直接引用的鸿蒙三方包方便其他开发者使用十、作者介绍‍♂️我是InMainJhy一名在上海读本科的大一学生专注鸿蒙开发、三方库适配、NAPI与ArkUI实战。后续持续输出鸿蒙实战长文、报错全解、开发教程欢迎点赞、收藏、关注交流文末添加社区引导欢迎加入开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net

相关文章:

【Butterfly库OpenHarmony实战使用教程】|NAPI封装+Native C API调用+真机运行

🚀Butterfly库OpenHarmony实战使用教程|NAPI封装Native C API调用真机运行 大家好,我是InMainJhy,一名在上海读本科的大一学生🎒。本篇严格按照鸿蒙三方库征文要求创作,基于NAPI封装Native C API&#xff0…...

纯正国风体验!Guohua Diffusion本地绘画工具,零基础快速上手指南

纯正国风体验!Guohua Diffusion本地绘画工具,零基础快速上手指南 想体验最纯正的水墨丹青,亲手生成一幅属于自己的国风画作吗?今天,我们就来聊聊一个专为4090D显卡优化、无需联网、操作极简的本地AI绘画工具——Guohu…...

MemSifter 核心机制深度解析(非常详细),4B小模型管理大模型记忆从入门到精通,收藏这一篇就够了!

一句话总结:MemSifter训练一个4B参数的代理模型,通过"先推理再检索"的方式,替大模型从海量历史对话中筛选相关记忆,速度比全上下文方案快12倍,效果还更好。 论文标题:MemSifter: Offloading LLM …...

校园生活服务类小程序源码全解析:前后端配套开箱即用

目概述这套校园生活服务小程序系统专为高校场景打造,采用前后端分离架构,支持多校区隔离、多角色权限控制。系统集成了校园生活中最高频的几大功能模块,助力学校、学生会或创业团队快速搭建统一、规范、可运营的校园数字社区。核心功能模块1.…...

面向 LLM 的程序设计 4:API 版本化与演进——在「模型会记忆旧文档」前提下的兼容策略

用三句话先说明白 人会照旧说明书办事,模型也一样。 它见过的文档、缓存里的接口描述、网页上没刷新的说明、向量库里还没更新的片段,都可能比真实系统更旧。于是系统已经升级了,它还在用老地址、老字段名、老例子去调用。 给人改流程&#…...

Google Authenticator PHP集成避坑指南:从扫码到验证的完整流程与常见错误解决

Google Authenticator PHP集成深度排障手册:从原理到实战的30个关键细节 当你按照教程一步步完成Google Authenticator的PHP集成,却在最后一步验证失败时,那种挫败感我深有体会。三年前我第一次在金融项目中实现动态口令认证,连续…...

H5游戏整合平台源码:70款游戏一键搭建,支持流量主变现的完整解决方案

一、平台概述与核心优势这套H5游戏整合平台源码是一套全面、实用且零门槛的一站式解决方案。它专为站长、开发者、创业团队及游戏爱好者打造,无需分散搜罗各类零散源码,一次获取即可拥有70余款经典H5网页小游戏。所有源码均基于原生H5技术开发&#xff0…...

开发环境搭建新选择:Python3.9镜像简化部署流程

开发环境搭建新选择:Python3.9镜像简化部署流程 你是不是也遇到过这样的场景:新接手一个项目,光是配环境就花了大半天,各种依赖冲突、版本不兼容,代码还没开始写,心态先崩了一半。或者,好不容易…...

碧蓝航线Alas脚本新手通关指南:从安装到精通的4个关键阶段

碧蓝航线Alas脚本新手通关指南:从安装到精通的4个关键阶段 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 碧蓝航…...

OpenClaw+千问3.5-9B成本优化:夜间定时任务实战

OpenClaw千问3.5-9B成本优化:夜间定时任务实战 1. 为什么选择夜间执行AI自动化任务? 去年冬天的一个深夜,我被服务器告警短信吵醒。查看日志发现是日间运行的AI数据处理任务消耗了过多Token,触发了预算警报。这次意外让我开始思…...

AudioSeal保姆级教学:Gradio界面多文件批量上传与异步检测队列设置

AudioSeal保姆级教学:Gradio界面多文件批量上传与异步检测队列设置 1. 引言 你是不是遇到过这样的场景?手里有一堆音频文件,需要挨个检查它们是不是AI生成的,或者想给一批音频文件批量加上水印。手动操作不仅效率低,…...

如何在没有 SEO 预算的情况下提高网站排名

如何在没有 SEO 预算的情况下提高网站排名 在当今互联网时代,网站的排名直接关系到其能否吸引到更多的流量和用户。不少小型企业和个人博客在没有 SEO 预算的情况下,往往陷入困境,不知道如何提高网站排名。如何在没有 SEO 预算的情况下提高网…...

YOLO12与YOLO11对比:新一代模型在精度和速度上有哪些提升?

YOLO12与YOLO11对比:新一代模型在精度和速度上有哪些提升? 1. 引言 目标检测技术作为计算机视觉领域的核心任务之一,其发展一直备受关注。YOLO(You Only Look Once)系列模型因其出色的实时性能而广受欢迎。2025年,Ultralytics推…...

手把手教你使用Qwen3.5推理模型:从部署到实战问答全流程

手把手教你使用Qwen3.5推理模型:从部署到实战问答全流程 1. 模型介绍与特点 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF 是一个基于 Qwen3.5-4B 的推理蒸馏模型,重点强化了结构化分析、分步骤回答、代码与逻辑类问题的处理能力。该版本以 G…...

Llama-3.2V-11B-cot保姆级教学:Streamlit缓存机制加速推理响应

Llama-3.2V-11B-cot保姆级教学:Streamlit缓存机制加速推理响应 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具,专为双卡4090环境深度优化。这个工具解决了视觉权重加载的关键Bug,支持…...

MAI-UI-8B应用案例:医疗登记表智能填充实战

MAI-UI-8B应用案例:医疗登记表智能填充实战 1. 医疗表单处理的痛点与解决方案 在医疗信息化系统中,患者登记表是每个医疗机构每天都要处理的基础文档。传统方式下,医护人员需要手动填写大量重复信息,不仅效率低下,还…...

Youtu-Parsing服务监控与管理:日志查看、状态检查、自动重启

Youtu-Parsing服务监控与管理:日志查看、状态检查、自动重启 1. 服务监控与管理的重要性 在日常使用Youtu-Parsing多模态文档解析服务时,确保服务稳定运行至关重要。作为一款高性能的文档解析工具,Youtu-Parsing需要持续监控其运行状态&…...

快速上手灵毓秀AI绘画:无需调参,专注创作你的动漫故事

快速上手灵毓秀AI绘画:无需调参,专注创作你的动漫故事 1. 认识你的专属AI画师 1.1 什么是灵毓秀-牧神-造相Z-Turbo 这是一个专为《牧神记》动画角色"灵毓秀"打造的AI绘画工具。想象你有一位熟悉这个角色的专业画师,只要简单描述…...

网站创建时间对网站 SEO 优化有什么影响

网站创建时间对网站 SEO 优化有什么影响 在当今竞争激烈的互联网市场中,网站的 SEO(搜索引擎优化)优化是吸引流量、提高曝光率的关键因素之一。而在众多影响 SEO 的因素中,网站创建时间作为一个被忽视的因素,其实也有…...

CoPaw多语言翻译效果展示:技术文档的中英互译质量评估

CoPaw多语言翻译效果展示:技术文档的中英互译质量评估 1. 引言 技术文档翻译一直是专业领域的痛点。传统翻译工具在处理计算机科学、医学等专业内容时,常常出现术语不准确、句式生硬、语境丢失等问题。最近测试了CoPaw这款多语言翻译工具,它…...

基于OFA的智能零售解决方案:商品图像自动问答系统

基于OFA的智能零售解决方案:商品图像自动问答系统 1. 引言 走进任何一家现代零售店,你都会看到顾客拿着商品反复查看标签、比较价格、寻找成分信息。这种场景每天都在全球数百万家商店中重复上演。店员们疲于应对各种"这个产品有没有过敏源&#…...

Go Routine 调度与系统线程分析

Go语言凭借其轻量级的并发模型在开发者中广受欢迎,而Go Routine作为其核心并发机制,与系统线程的交互方式一直是性能优化的关键。本文将深入分析Go Routine的调度原理及其与系统线程的关系,帮助开发者理解高并发场景下的底层运行机制&#xf…...

37、三种事件处理方式优先级---------事件系统

三种事件处理方式优先级我们学习了三种是事件处理方式 1重写event函数 2重写具体的事件函数 3重写事件过滤器并安装 那么这三种方式,调用的顺序会怎么样呢? 我们还是在MainWindow中创建一个按钮,然后用三种方式捕获这个按钮的点击事件&#x…...

告别netCDF4!用xarray处理气象数据,从读取nc到插值补全的保姆级实践

告别netCDF4!用xarray处理气象数据,从读取nc到插值补全的保姆级实践 气象数据处理一直是科研工作者面临的重要挑战之一。传统上,许多研究者依赖netCDF4库来处理.nc格式的气象数据,但随着数据量的激增和分析需求的复杂化&#xff0…...

忍者像素绘卷保姆级教程:微信小程序云开发+Serverless函数调用忍者API

忍者像素绘卷保姆级教程:微信小程序云开发Serverless函数调用忍者API 1. 项目介绍与准备工作 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工具,它将传统忍者文化与16-Bit复古游戏美学完美融合。本教程将带你从零开始,使用微信小…...

C++ 智能指针的生命周期分析

C智能指针的生命周期分析 在现代C开发中,智能指针是管理动态内存的重要工具,它通过自动化的资源管理机制显著降低了内存泄漏和悬垂指针的风险。理解智能指针的生命周期对于编写高效、安全的代码至关重要。本文将深入分析智能指针的生命周期,…...

Llama-3.2V-11B-cot参数详解:官方最优推理配置+冲突参数自动剔除机制说明

Llama-3.2V-11B-cot参数详解:官方最优推理配置冲突参数自动剔除机制说明 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具,专为双卡RTX 4090环境深度优化。该工具通过一系列技术创新,解…...

SEO 项目如何进行链接建设_SEO 项目如何进行品牌形象优化

SEO 项目如何进行链接建设_SEO 项目如何进行品牌形象优化 SEO 项目如何进行链接建设 在当今的互联网时代,网站的流量和排名直接关系到企业的发展和市场竞争力。其中,搜索引擎优化(SEO)是提升网站在搜索引擎中的排名的重要手段。…...

OpenClaw低成本方案:Qwen3-14B私有镜像替代OpenAI API实战

OpenClaw低成本方案:Qwen3-14B私有镜像替代OpenAI API实战 1. 为什么选择本地模型替代商用API 去年冬天,当我第一次用OpenClaw自动整理全年会议纪要时,看着账单里OpenAI API的消耗记录,手指悬在键盘上半天没敢点"重试"…...

ccmusic-database快速部署:Conda环境隔离安装torch+gradio无冲突指南

ccmusic-database快速部署:Conda环境隔离安装torchgradio无冲突指南 1. 项目简介与环境准备 ccmusic-database是一个基于深度学习的音乐流派分类系统,能够自动识别16种不同的音乐风格。这个系统结合了计算机视觉领域的VGG19_BN预训练模型和音频处理技术…...