毕设日志26.3.11(1):使用HBuilderX开发APP的预备知识及其原理;Java vs JavaScript
本篇笔记为毕业设计过程中的学习笔记最终成果以毕业设计为准。本篇笔记回答了①HBuilderX是什么②HBuilderX内的几个新建项目类型都是什么以及它们的区别③HBuilderX为什么可以开发手机APP原理④java和JavaScript区别及在HBuilderX内的使用情况目录一、HBuilderX是什么二、HBuilderX内的几个新建项目类型都是什么以及它们的区别三、HBuilderX为什么可以开发手机APP原理四、java和JavaScript区别及在HBuilderX内的使用情况一、HBuilderX是什么摘录一段HBuilderX的官方介绍# HBuilderX 自述文件 (markdown格式)***************************************HBuilderXH是HTML的首字母Builder是构造者X是HBuilder的下一代版本。我们也简称HX。HX是**轻如编辑器、强如IDE**的合体版本。## 让我们简单了解下HX的特点1. 轻巧仅10余M的绿色发行包(不含插件)2. 极速不管是启动速度、大文档打开速度、编码提示都极速响应C的架构性能远超Java或Electron架构3. vue开发强化HX对vue做了大量优化投入开发体验远超其他开发工具[详见](https://hx.dcloud.net.cn/Tutorial/Language/vue) 按下Alt鼠标左键可直接打开网址4. 小程序支持国外开发工具没有对中国的小程序开发优化HX可开发uni-app或小程序、快应用等项目为国人提供更高效工具5. markdown利器HX是唯一一个新建文件默认类型是markdown的编辑器也是对md支持最强的编辑器HX为md强化了众多功能请**务必点击**【菜单-帮助-markdown语法示例】快速掌握md及HX的强化技巧6. 清爽护眼HX的界面比其他工具更清爽简洁绿柔主题经过科学的脑疲劳测试是最适合人眼长期观看的主题界面[详见](https://hx.dcloud.net.cn/Tutorial/Other/health)7. 强大的语法提示HX是中国唯一一家拥有自主IDE语法分析引擎的公司对前端语言提供准确的代码提示和转到定义(Alt鼠标左键)8. 高效极客工具更强大的多光标、智能双击...让字处理的效率大幅提升了解HX的极客技巧[详见](https://hx.dcloud.net.cn/Tutorial/UserGuide/skill)9. 更强的json支持现代js开发中大量json结构的写法HX提供了比其他工具更高效的操作[详见](https://hx.dcloud.net.cn/Tutorial/Language/json)## 扩展性HX支持java插件、nodejs插件并兼容了很多vscode的插件及代码块。还可以通过外部命令方便的调用各种命令行功能并设置快捷键。如果你习惯了其他工具(如vscode或sublime)的快捷键在菜单工具-快捷键方案中可以切换。## 结语在我们团队内部HX不止替代了其他开发工具还替代了记事本、word、evernote等成为霸屏工具令我们爱不释手。希望你也会喜欢上这款免费工具。[赞助](https://dev.dcloud.net.cn/sponsor/) 欢迎对我们的工作给予支持[需求墙](https://dev.dcloud.net.cn/wish/) 可以在这里投票以影响我们的工作优先级[论坛](https://ask.dcloud.net.cn/explore/)[Github](https://github.com/dcloudio/HBuilderX)[uni-im](https://im.dcloud.net.cn/#/?joinGroup677366d82fe5bae6371cbbd9)Q这里提到了好多东西比如我明明在开发app却说这个是hxml有人会说这个是开发网页什么的。能解释一下吗我之前完全没接触过类似的东西。A HX不是单纯的“网页编辑器”“明明在开发App为什么总提到网页、hxml这些词”核心原因在于HX和它主推的uni-app框架本质上是一套“一次编写多端发布”的开发方案你写的代码是.vue文件或你提到的.hxml这是HX项目的配置文件描述项目结构用的是类HTML、JavaScript、CSS的语法。这确实是在写“网页式”的界面和逻辑。HX uni-app的作用当你点击“运行到手机”时它们会在幕后把你写的这些代码实时“翻译”编译成手机能懂的原生代码Java/Kotlin for Android, Swift for iOS并打包安装。结果手机上运行的是一个真正的原生App而不是一个网页。你的蓝牙控制、硬件交互等功能都是通过这种“翻译”调用了手机的原生能力。所以HX既可以开发网页也可以通过uni-app开发App。️ 那些术语分别对应什么术语/链接它是什么和你做毕设的关系HBuilderX (HX)开发工具本身。就是你电脑上安装的那个软件用来写代码、运行、调试。这就是你的“工作台”就像你写Arduino代码用的Arduino IDE一样。uni-app一个开发框架。它提供了一套统一的语法和API让你写一次代码能编译成iOS、Android、各种小程序等多个平台的App。你就是在用uni-app开发你的时钟控制App。我之前给你的代码就是uni-app的语法。.vue文件你主要编写的代码文件类型。它把界面(HTML样式)、逻辑(JavaScript)和样式(CSS)写在一个文件里是uni-app开发的核心。你之后添加按钮、实现番茄钟界面主要就是编辑这类文件。.hxml文件HX项目的配置文件。它记录了你的项目叫什么、用了什么模块比如蓝牙、要编译成哪些平台等信息。你基本不用手动编辑它但在“运行”App前需要确保里面配置了蓝牙权限就像我之前提醒你的。Vue支持 (你提供的第一个链接)这是HX官方对如何编写.vue文件的详细教程。当你需要写更复杂的界面比如想知道“怎么让按钮更好看”、“怎么实现页面跳转”时可以参考这个文档。DCloud问答 (第4个链接)官方技术问答社区。当你遇到HX或uni-app的具体报错、功能无法实现时可以来这里搜索或提问。非常有用的求助资源。如果你之后遇到我无法解决的问题可以来这里找答案或提问。uni-im (最后一个链接)一个基于uni-app的即时通讯组件/插件。和你做时钟控制App没有关系。它是用来给App里加聊天功能的。 帮你重新理解“开发流程”结合你的毕设你现在正处在工具打开HBuilderX。框架使用uni-app的模板和语法。编写主要编辑.vue文件实现界面和蓝牙控制逻辑就像我给你的那段代码。配置在manifest.json一个可视化配置文件效果类似.hxml里勾选“蓝牙”权限。运行点击“运行到手机或模拟器”HX开始幕后“翻译”和打包。调试手机上的App运行起来你在HX的“控制台”看日志和你在Arduino IDE看串口输出是一个道理。➡️ 下一步可以做什么放下概念焦虑你现在不需要搞懂所有术语只需要记住你打开HX新建或打开一个uni-app项目编辑.vue文件点击运行到手机就能看到你的App。这就够了。运行起来试试把我上次给你的那段代码在一个新建的uni-app项目里跑起来。先别管懂不懂先看到“搜索设备-连接-发送数据”这条链路通了建立信心。遇到问题再回来运行时肯定会有报错比如找不到蓝牙模块、权限问题。把具体的报错信息发给我我们像解硬件电路一样一步步分析。所以已经在做“翻译”中最关键的一步让App和ESP32握手。先把这条路走通后面加界面、调样式都是可以慢慢堆砌的工作。Again确实在开发App只不过用了一种更高效的“声明式”语法Vue。就像你用Arduino写digitalWrite底层是AVR的汇编但你不用管。“hxml”不是代码它更像是platformio.ini或CMakeLists.txt是给工具看的项目设置文件。你基本不需要手动编辑它除非要加蓝牙权限就像上次我让你在manifest.json里勾选一样。Vue、HTML这些是“描述语言”它们本身不直接变成App是HBuilder这个“翻译官”让它们变成了App。二、HBuilderX内的几个新建项目类型都是什么以及它们的区别Q点击进入软件后创建新项目有一些选项要选择哪个呢他们有什么区别选项有uni-app、5App、普通项目、Wap2App和IDE插件。A普通项目是什么一个纯粹的静态前端项目。项目结构由 HTML、CSS、JavaScript 文件组成运行在浏览器环境中。产出物网页H5 网站。核心特点代码在浏览器中解释执行无法直接调用手机操作系统的原生 API如蓝牙、摄像头、通讯录。不具备打包成独立安装 App 的能力。与你目标的关系无关。你要的是能安装在手机上、并能调用蓝牙硬件的 App不是网页。2.uni-app是什么一个使用 Vue.js 语法、编译时将同一套代码编译发布为多个平台应用的跨端应用框架。产出物iOS App、Android App、以及微信/支付宝等各种小程序、H5 网站。核心特点编译原理你编写的是.vue文件HBuilderX 内置的编译器会将其解析并根据目标平台如 Android生成对应的原生代码Java/Kotlin或小程序代码。原生能力调用通过框架封装的统一 API如uni.openBluetoothAdapter在运行时动态调用各平台的原生能力。最终产出的 App 是原生应用含有原生渲染引擎和 JS 引擎而不是网页。与你目标的关系匹配。你需要的蓝牙控制 Android App是它的标准产出物之一。3.5App是什么DCloud 公司早期的、基于 Webview 渲染的原生 App 打包方案基于 HTML5 规范。产出物iOS App、Android App。核心特点本质上是在 App 内嵌入一个全屏 Webview 来运行你的 HTML5 页面并通过一个扩展的 JS API 对象plus.来调用原生能力。其架构是“Webview 原生扩展”渲染性能和复杂交互体验不如 uni-app 的自主渲染引擎。与你目标的关系技术栈过时。DCloud 官方已将其定位为维护状态新项目主推 uni-app。它能实现蓝牙功能但开发效率和体验不如 uni-app。4.Wap2App是什么一个将现有手机网站WAP站点快速封装成原生安装包的在线打包工具的入口。产出物iOS App、Android App。核心特点你需要提供一个现有的手机网站 URL。打包工具会生成一个“壳” App这个 App 启动后会在一个全屏 Webview 中加载并显示你提供的那个网站。它没有独立的本地代码逻辑本质上是一个浏览器的包装无法实现 App 与硬件如蓝牙的双向、实时通信。与你目标的关系完全不相关。你既没有现成的手机网站也需要本地蓝牙通信能力。5.IDE插件是什么HBuilderX 编辑器自身的扩展机制入口。产出物增强 HBuilderX 编辑器功能的插件如语法高亮、代码格式化工具、主题等。核心特点这是用来修改和增强开发工具本身的不是用来创建应用程序项目的选项。选中此项是安装或开发插件。与你目标的关系无关。你现在是开发应用而不是开发编辑器插件。三、HBuilderX为什么可以开发手机APP原理Q明白了。所以HBuilder类似于一个编译器。我可以把它类比成visual studio在里面写c语言代码然后编译器会把这些翻译成机器语言我在HBuilderz做的事也一样写vue的描述语言然后呢Hbuilder具体都做了什么把描述性语言直接翻译成二进制码还是先翻译成手机app使用的语言再到二进制码开了蓝牙权限后它又对手机做了什么呢A阶段一你写代码时开发时你写的是.vue文件里面包含三部分template界面结构类似 HTML但会被解析成虚拟 DOM 树script逻辑JavaScript包含你调用蓝牙 API 的部分style样式CSSHBuilder 此时做的事提供语法解析、代码提示、实时语法检查。它知道你在写什么但它还没开始“翻译”。阶段二你点击「运行到手机」或「发行」时编译/打包时这是核心阶段HBuilder 会做一套完整的编译链处理具体步骤如下解析.vue文件将template解析成一个JSON 格式的虚拟 DOM 描述对象不是直接的 UI 代码。将script里的 JS 代码提取出来准备进行转译。将style里的 CSS 提取出来准备进行平台适配。编译/转译关键步骤JS 代码转译用Webpack打包工具 Babel转译器把你的现代 JavaScriptES6代码转译成目标平台能识别的旧版本 JavaScriptES5。因为手机系统里的 JS 引擎比如 iOS 的 JavaScriptCore对最新语法支持程度不一需要降级。API 调用映射这是最关键的一步。你写的uni.openBluetoothAdapter()这类统一 API在编译时会被标记并根据你选择的目标平台Android/iOS映射到不同的底层实现。如果编译目标是Android编译器会准备调用Java 原生层的蓝牙接口。如果编译目标是iOS编译器会准备调用Objective-C 原生层的蓝牙接口CoreBluetooth。生成中间代码取决于目标平台iOS App 目标编译器会生成一个ARM架构的二进制机器码包.ipa文件。这个包里面包含原生 UI 渲染引擎uni-app 的渲染层用 C 编写直接与 GPU 交互。JS 引擎JavaScriptCore用于运行你转译后的 JS 逻辑。原生蓝牙模块Objective-C 编写的系统蓝牙 API 封装。Android App 目标编译器会生成一个APK安装包。这个包里面包含原生 UI 渲染引擎也是 C 编写的。V8 引擎Google 的 JS 引擎用于运行你的 JS 逻辑。原生蓝牙模块Java 编写的 Android 蓝牙 API 封装通过 JNI 与 JS 引擎通信。签名与打包将上述所有部分引擎 你的 JS 代码 资源文件打包成一个完整的安装包。用你配置的开发者证书对安装包进行数字签名证明这个 App 是你开发的未被篡改。阶段三安装到手机上后运行时安装包里的东西在手机里是如何运行的安装手机系统Android 或 iOS将 APK/IPA 解压把里面的原生库.so文件即编译好的 C 引擎和资源文件放到系统指定目录。启动 AppCPU 开始执行原生渲染引擎的二进制机器码。渲染引擎启动并加载内嵌的 JS 引擎V8 或 JavaScriptCore。JS 引擎读取并执行你写的、已经被编译成 ES5 的 JS 逻辑代码。蓝牙调用流程你关心的你的 JS 代码执行到uni.openBluetoothAdapter()。这不是直接发硬件指令而是在 JS 引擎里调用一个由uni-app 运行时提供的 JS 原生函数这个函数是C 层暴露给 JS 层的接口。这个 C 接口接收到调用后通过JNIAndroid或BridgeiOS调用你用 Java 或 Objective-C 写的那个原生蓝牙模块里的对应函数。原生蓝牙模块再调用手机操作系统的系统 APIAndroid 的BluetoothAdapter或 iOS 的CBCentralManager。操作系统内核的蓝牙协议栈驱动最终通过硬件中断和DMA等方式控制蓝牙芯片发射射频信号。数据返回路径当 ESP32 发回数据时顺序是反向的蓝牙芯片收到信号 → 操作系统中断 → 系统 API 回调 → 原生蓝牙模块 → C 桥接层 → JS 引擎事件循环 → 你写在onBLECharacteristicValueChange里的 JS 回调函数被执行。关于「蓝牙权限」具体做了什么当你开启蓝牙权限实际上发生了两件事编译时的清单声明HBuilder 在编译打包时会根据你勾选的权限自动修改 Android 的AndroidManifest.xml或 iOS 的Info.plist文件。在这个文件里写上uses-permission android:nameandroid.permission.BLUETOOTH/等声明。这相当于告诉手机系统我这个 App 在安装时需要向用户申请使用蓝牙的权利。运行时的权限检查Android 6.0 和 iOS 都需要动态权限。你的 JS 代码第一次调用蓝牙 API 时uni-app 运行时会自动触发系统的权限请求对话框这是由原生模块弹出的。用户点击「允许」后手机操作系统会把这个 App 加入允许访问蓝牙的白名单。后续所有蓝牙操作操作系统都会检查这个 App 是否在白名单内如果在才允许通过系统 API 访问蓝牙硬件。Q转述好吧好吧。让我来确定几件事。①手机系统是使用java或javascript开发的。我无法很好地区分二者②HBuilderX的流程是我写了vuevue里面是同一种描述语言。但里面的东西根据其模块不同会被翻译成不同的东西具体来说template界面结构会被解析成虚拟 DOM 树script逻辑会被解析成JavaScriptstyle样式会被解析成CSS③编译完毕后的代码大概是这样有调用原生UI渲染引擎的部分有app核心功能部分也有调用蓝牙的部分。④调用蓝牙并非直接调用而是手机开发时手机系统开发者给app开发者留了接口我们要做的事连接这个接口而不是去考虑其中的硬件传输。这就像蓝牙协议开发者给蓝牙调用者留得onwrite接口一样。A不完全准确。来逐条确认。① 手机系统是使用 Java 或 JavaScript 开发的。我无法很好地区分二者不准确。这是一个需要厘清的关键区分手机操作系统本身如 Android 内核、iOS 内核是用C/C写的。给应用开发者使用的系统框架/接口Android主要使用Java或 Kotlin作为开发语言。你调用的BluetoothAdapter是一个 Java 类。iOS主要使用Objective-C或Swift。JavaScript 的角色JavaScript不是用来写手机操作系统的。它是在你的 App 内部在 uni-app 提供的 JS 引擎里运行然后通过框架提供的桥梁C/JNI去调用上面提到的那些JavaAndroid或 Objective-CiOS系统接口。② HBuilderX 的流程是我写了 vuevue 里面是同一种描述语言。但里面的东西根据其模块不同会被翻译成不同的东西具体来说template界面结构会被解析成虚拟 DOM 树script逻辑会被解析成JavaScriptstyle样式会被解析成CSS基本正确但需要精确化“翻译成不同的东西”这个说法。更准确的描述是template在编译时它被解析成一份描述界面结构的JSON 数据虚拟 DOM 树。这份数据在运行时会被 uni-app 的原生渲染引擎读取并由引擎直接绘制成屏幕上的像素不经过浏览器内核。script里面的逻辑代码你写的 JS在编译时会被Webpack Babel打包、转译成所有手机 JS 引擎都能安全运行的 ES5 代码。最终这些代码是以文本形式打包进 App 的在运行时才由 App 内部的JS 引擎V8/JavaScriptCore加载执行。style里面的 CSS 在编译时被解析和处理。最终样式规则会被原生渲染引擎理解并应用而不是交给浏览器去渲染。③ 编译完毕后的代码大概是这样有调用原生 UI 渲染引擎的部分有 app 核心功能部分也有调用蓝牙的部分。正确。编译后生成的 APK/IPA 安装包内部结构确实包含原生库.so 文件包含 C 编写的 uni-app 渲染引擎、JS 引擎等。资源文件包含你转译后的 JS 代码作为文本资源、图片、字体等。原生模块代码包含框架自带的、和你配置的原生插件比如蓝牙模块的 Java/Obj-C 封装代码。清单文件声明权限、组件等。④ 调用蓝牙并非直接调用而是手机开发时手机系统开发者给 app 开发者留了接口我们要做的事连接这个接口而不是去考虑其中的硬件传输。这就像蓝牙协议开发者给蓝牙调用者留的 onwrite 接口一样。完全正确。你这个理解非常到位正是分层和抽象的思想。手机系统Android/iOS提供了系统级蓝牙 APIJava/Obj-C 接口。uni-app 框架在底层封装了这些系统 API并在上层给你提供了JS 接口如uni.writeBLECharacteristicValue。你作为应用开发者只需要调用 uni-app 提供的 JS 接口处理回调。你完全不需要关心数据是如何从 JS 引擎传递给 Java 层再通过 JNI 进入 C 层最后通过系统内核驱动蓝牙芯片这个完整链路。总结你对整体流程和分层思想的理解是正确的。核心需要再确认的是第①点JS 代码不是系统的一部分它是在你 App 内部的“虚拟机”里运行的“应用层逻辑”通过框架这座“桥”去调用系统用 Java/Obj-C 写好的功能接口。四、java和JavaScript区别及在HBuilderX内的使用情况Q所以java是什么一个什么语言是为了什么为什么玩我的世界要安装java何作用AJava 是什么Java 是一门编程语言同时也是一个运行时平台。作为编程语言它是一种高级、面向对象的语言。语法和 C/C 比较像但更简洁。开发者用 Java 写出的代码称为源代码保存在.java文件里。作为运行时平台这是 Java 最核心的设计。Java 源代码不会直接被编译成特定 CPU比如你的电脑 i7 或手机 ARM 芯片能识别的机器码。它会被编译成一种中间状态——字节码保存在.class文件里。这种字节码不是给硬件看的是给Java 虚拟机JVMJava Virtual Machine看的。为什么玩《我的世界》要安装 Java《我的世界》Java 版就是用 Java 语言写的。它运行的过程解释了 Java 的设计目的一次编写到处运行《我的世界》的开发者Mojang只需要写一套 Java 代码编译成一套字节码就是那个.jar游戏文件。然后在不同操作系统上Windows、macOS、Linux只要安装了对应版本的JVM就能运行这同一套字节码。JVM 负责把字节码“翻译”成当前操作系统和 CPU 能懂的机器码。JVM 的作用当你安装 Java 时实际上是在电脑里装了一个JVM。你双击启动《我的世界》.jar文件。系统启动 JVM。JVM 加载游戏字节码解释或即时编译成机器码交给 CPU 执行。JVM 还负责内存管理比如自动清理不再使用的对象即垃圾回收、调用操作系统底层接口比如把图像画到屏幕上、读取键盘鼠标输入。所以安装 Java本质上是在电脑里装一个“翻译器”和“管理者”——JVM让用 Java 写的程序如《我的世界》能在这个虚拟的机器里运行而不必为每一种操作系统和 CPU 组合都单独做一个版本。Java 与 JavaScript 的本质区别你之前提到无法区分二者。它们除了名字相似几乎毫无关系维度JavaJavaScript关系毫无关系。名字是 Netscape 公司为了蹭 Java 热度而改的。毫无关系。类型编程语言 运行时平台JVM。编程语言最初只在浏览器里运行。运行方式编译型 解释型先编译成字节码再由 JVM 解释/编译执行。解释型代码由 JS 引擎如 Chrome 的 V8逐行解释执行。主要用途企业级后端服务、Android 应用开发、大型桌面应用。网页交互、前端逻辑、Node.js 后端、以及像你做的uni-app 这种跨平台应用的逻辑层。在手机上的角色Android 系统提供 Java 框架接口供 App 调用。在你的 uni-app 里JS 代码运行在 App 内置的 JS 引擎中通过框架调用 JavaAndroid或 Obj-CiOS的系统接口。总结 Java 的作用对《我的世界》Java 是它存在的基石。JVM 让同一份游戏文件能在所有主流电脑上运行开发者不用为每个系统重写代码。对 Android 系统Java 是系统向应用开发者开放功能的主要语言。你手机里的 App包括你用 uni-app 开发的那个最终都是通过调用用 Java 写的系统接口来控制硬件的。对你做毕设你在 uni-app 里写的 JS 代码要控制蓝牙最终就是通过框架的桥梁调用到了 Android 系统里用Java写好的BluetoothAdapter系列接口。我明白了是因为不同操作系统的底层不同所以有人去做了适配它们的JVM这样开发者只要开发一个java的代码放进JVM里就可以全部用上了扩展理解完全正确问题Windows、macOS、Linux 底层不同CPU 指令集也可能不同x86、ARM 等。如果直接编译成机器码一个程序得做十几个版本。Java 的解法Sun 公司Java 发明者为每个主流操作系统Windows、Mac、Linux 等分别写了一个JVM。开发者只需要把 Java 源码编译成字节码一套中间代码不用管用户用的是什么系统。用户在自己的电脑上安装对应系统的JVM。JVM 负责在运行时把字节码翻译成当前系统能懂的机器码。结果开发者写一次到处运行Write Once, Run Anywhere。用户只需安装一次游戏那一套字节码在任何装了 JVM 的系统上都能跑。这就是为什么《我的世界》一个.jar文件能在 Windows、Mac、Linux 上同时运行。扩展一点JVM 不只是翻译除了你说的“适配不同系统”JVM 还做了另外两件重要的事内存管理Java 程序里new出来的对象JVM 会自动跟踪哪些不再被使用并在合适的时机回收内存这叫垃圾回收Garbage Collection。开发者不需要像 C/C 那样手动free或delete。安全沙箱JVM 在运行字节码时会检查代码有没有越界行为比如试图访问系统不允许的内存区域防止恶意代码直接破坏操作系统。所以 JVM 既是一个翻译官把字节码翻译成机器码也是一个管家管理内存、保障安全。现在再回头看你的 uni-app 项目你会发现是同样的模式你的角色 Java 开发者你写.vue代码类似 Java 源码。uni-app 框架 编译器 JVM 的一部分把你的代码转译成中间形态JS 逻辑 虚拟 DOM 描述并提供统一的 API如uni.openBluetoothAdapter。HBuilder 打包过程 生成字节码 打包 JVM它把中间形态连同 uni-app 运行时包括 JS 引擎、渲染引擎、原生模块一起打包成 APK/IPA。手机上的 uni-app 运行时 JVM它负责解释执行你的 JS 逻辑管理内存并通过内置的桥接层去调用 Android 系统用 Java 写的蓝牙接口或 iOS 系统用 Objective-C 写的蓝牙接口。Q但我现在开始混淆刚刚我们谈论的那一套到底哪里用了java哪里用了javascript以及为什么了A第一层你写的代码应用层语言JavaScript你在.vue文件的script里写的所有逻辑都是JavaScript。包括你调用的uni.openBluetoothAdapter()、uni.writeBLECharacteristicValue()以及处理数据的回调函数。为什么是 JS因为 uni-app 这个框架选用了 JS 作为应用层的开发语言类似 Java 选用了 Java 语言作为应用层开发语言。你用 JS 描述“我要做什么”。第二层uni-app 框架层桥接层语言C / Objective-C / Java这一层你看不见它在 HBuilder 打包时被内置到你的 App 里了。它由两部分组成JS 引擎C 编写比如 iOS 下的 JavaScriptCoreAndroid 下的 V8。作用在 App 启动后这个引擎负责解释执行你写的那套 JS 代码。你的 JS 逻辑是在这个引擎里跑的不是在浏览器里也不是直接变成系统调用。原生桥接模块Java / Objective-C 编写uni-app 官方为 Android 用Java写了一套蓝牙模块封装为 iOS 用Objective-C写了一套蓝牙模块封装。作用当你的JS 代码调用uni.openBluetoothAdapter()时JS 引擎里的这个函数实际上是一个“代理”它会通过 C 层最终调用到用JavaAndroid或Objective-CiOS写的那个模块里的对应函数。为什么这里要用 Java/Objective-C因为只有这些语言能直接调用手机操作系统提供的系统 API。第三层手机操作系统层系统接口层语言JavaAndroid/ Objective-CiOSAndroid 系统向开发者开放的系统接口是用Java写的。比如你要操作蓝牙最终要调用android.bluetooth.BluetoothAdapter这个 Java 类里的方法。iOS 系统向开发者开放的系统接口是用Objective-C或Swift写的。比如CBCentralManager这个类。为什么系统接口要用这些语言因为 Android 系统本身是用 Java 写的核心是 C但应用框架层是 JavaiOS 系统本身是用 Objective-C/Swift 写的。它们只“听得懂”自己生态的语言。完整调用链路以 Android 为例你现在在.vue里写javascriptuni.writeBLECharacteristicValue({ // ... 参数 })实际发生的事按顺序你的 JS 代码在JS 引擎V8里被执行。JS 引擎里的uni.writeBLECharacteristicValue函数是一个C 函数由 uni-app 运行时提供的 JS 包装。调用它时会进入 C 层。C 层通过JNIJava Native Interface调用到 uni-app 预先用Java写好的那个蓝牙模块里的方法。那个Java 方法再调用Android 系统的 Java API比如BluetoothGatt.writeCharacteristic()。Android 系统内核C接收到 Java 层传来的指令驱动蓝牙硬件芯片。数据返回时蓝牙硬件收到数据 → 系统内核C→ 系统 Java API 回调 → uni-app 的 Java 模块 → JNI → C 层 → JS 引擎事件循环 → 你写在onBLECharacteristicValueChange里的JS 回调函数被执行。一句话总结层次语言角色你写的代码JavaScript描述业务逻辑我要连蓝牙、发数据uni-app 框架内置的桥接层C / Java / Objective-C把 JS 的指令转译成系统能听懂的 Java/Obj-C 调用手机操作系统接口Java (Android) / Objective-C (iOS)真正执行蓝牙操作的底层接口你没有写任何 Java 或 Objective-C 代码但你的 App 里包含了用这些语言写好的模块由 uni-app 框架提供它们负责在运行时把你的 JS 指令“翻译”给操作系统听。

相关新闻

性能测试关键概念与澄清

性能测试关键概念与澄清

明确性能测试目标 对于常规项目而言,性能测试通常围绕三个核心目标展开:定值压测、探底压测、长时压测。 定值压测 定值压测是指在固定负载条件下,对系统的响应时间和处理能力进行定量测试。这里的 “固定负载” 通常体现为预设一个固定的…

2026/7/14 16:38:50 阅读更多 →
收藏!2026春招AI岗位暴增14倍,5个低门槛高薪岗,小白/程序员必看

收藏!2026春招AI岗位暴增14倍,5个低门槛高薪岗,小白/程序员必看

今天下班通勤刷脉脉时,一组2026年春招AI相关岗位的数据直接惊到我了——AI岗位新发量同比暴涨14倍,其中字节跳动给大模型应用架构专家开出的年薪高达128万!当然要说明下,这属于顶尖人才的薪资水平,并非人人都能达到&am…

2026/7/15 13:16:54 阅读更多 →
记一次 新电脑使用wsl + vscode+vim 等配置内核源码配置

记一次 新电脑使用wsl + vscode+vim 等配置内核源码配置

参考链接: 注意. wsl 跟 window并不是一个环境。 wslvscodeclangd 安装 https://zhuanlan.zhihu.com/p/551978555首先在windows安装vscode安装远程wsl的工具,clangd,并且设置clangd插件安装简体中文插件,搜chineseclangd生产索引&…

2026/7/15 18:14:32 阅读更多 →

最新新闻

波束成形IC如何简化相控阵天线设计

波束成形IC如何简化相控阵天线设计

1. 相控阵天线设计的传统挑战在无线通信和雷达系统中,相控阵天线一直扮演着关键角色。传统相控阵天线设计面临几个主要难题:首先是复杂的馈电网络设计,每个天线单元都需要独立的相位和幅度控制电路;其次是庞大的体积和重量&#x…

2026/7/16 1:30:56 阅读更多 →
告别手动复制:利用浏览器插件高效管理京东Cookie

告别手动复制:利用浏览器插件高效管理京东Cookie

1. 为什么需要管理京东Cookie?每次手动复制京东的pt_key和pt_pin就像用镊子夹芝麻——不仅费时费力,还容易出错。想象一下你每天要登录5个京东账号,每次都要重复打开开发者工具、查找Cookie、复制粘贴这一系列操作,光是想想就让人…

2026/7/16 1:26:55 阅读更多 →
国内AI大模型无偿调用实战:从环境配置到批量处理完整指南

国内AI大模型无偿调用实战:从环境配置到批量处理完整指南

这类“国内无偿调用”的标题,最容易让人困惑的不是功能列表,而是到底能不能在普通网络环境里稳定跑起来、会不会有隐藏限制。我一般会先拆解这类方案的核心实现方式:是直接调用官方 API、通过代理中转、还是本地部署的接口封装。从标题提到的…

2026/7/16 1:26:55 阅读更多 →
终极暗黑破坏神2宽屏补丁D2DX:3步让经典游戏在现代PC完美运行

终极暗黑破坏神2宽屏补丁D2DX:3步让经典游戏在现代PC完美运行

终极暗黑破坏神2宽屏补丁D2DX:3步让经典游戏在现代PC完美运行 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 还…

2026/7/16 1:22:54 阅读更多 →
AI代码生成如何重塑C++开发:效率、质量与实战指南

AI代码生成如何重塑C++开发:效率、质量与实战指南

1. 项目概述:当C遇见AI,一场关于效率与质量的思辨作为一名在C领域摸爬滚打了十多年的老程序员,我亲眼见证了这门语言的辉煌与挑战。从早期的MFC、Qt桌面开发,到后来的游戏引擎、高频交易系统,C以其无与伦比的性能和控制…

2026/7/16 1:22:54 阅读更多 →
上拉电阻应用全解析:从原理到硬件面试实战

上拉电阻应用全解析:从原理到硬件面试实战

这次我们来深入探讨硬件工程师笔面试中的经典问题——上拉电阻的应用场景。作为数字电路设计的基础知识点,上拉电阻的正确使用直接关系到电路稳定性和系统可靠性,是硬件工程师必须掌握的核心技能。在硬件设计面试中,上拉电阻相关问题出现的频…

2026/7/16 1:22:54 阅读更多 →

日新闻

HarmonyOs应用《重要日》开发第6篇 - 数据持久化存储

HarmonyOs应用《重要日》开发第6篇 - 数据持久化存储

本篇深入剖析 ImportantDays 项目的数据持久化方案——基于 HarmonyOS ArkData 模块的 Preferences 轻量级存储,以及 PreferenceUtil 工具类的单例封装。一、HarmonyOS 数据存储方案对比 HarmonyOS 提供了多种数据存储方案:方案适用场景特点Preferences轻…

2026/7/16 0:08:27 阅读更多 →
Python实现跨境电商商品图批量翻译教程

Python实现跨境电商商品图批量翻译教程

一、问题引入做跨境电商的卖家朋友,你是否遇到过这样的困扰?每次上架新品到亚马逊、Shopee或Lazada等平台,都需要处理大量商品图片的多语言版本。比如上架200款衣服,每款需要翻译成英语、日语、韩语等5种语言,这意味着…

2026/7/16 0:08:27 阅读更多 →
鸿蒙 7 新特性实战①:从 0 到 1 掌握 @kit 标准导入规范

鸿蒙 7 新特性实战①:从 0 到 1 掌握 @kit 标准导入规范

从鸿蒙 7(HarmonyOS NEXT)开始,官方全面完成了从 ohos.* 零散模块到 kit.* 领域套件的体系重构。对开发者来说,第一道门槛不是 API 用法变化,而是统一的导入规范——旧体系默认导入、解构导入混用的混乱局面被彻底终结…

2026/7/16 0:10:29 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/15 21:09:01 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/15 19:42:20 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/15 17:52:08 阅读更多 →

月新闻