首页 文章 精选 留言 我的

精选列表

搜索[鸿蒙PC],共9172篇文章
优秀的个人博客,低调大师

用鸿蒙写出第一个 Hello World!鸿蒙开发快速入门之:Hi3861 开发板(4)

最激动入门级选手的心的时刻来了,本示例将演示如何编写简单业务,输出“Hello World”。 修改源码 bugfix和新增业务两种情况,涉及源码修改。下面以新增业务举例,向开发者介绍如何进行源码修改。 确定目录结构。 开发者编写业务时,务必先在./applications/sample/wifi-iot/app路径下新建一个目录(或一套目录结构),用于存放业务源码文件。 例如:在app下新增业务my_first_app,其中hello_world.c为业务代码,BUILD.gn为编译脚本,具体规划目录结构如下: . └── applications └── sample └── wifi-iot └── app │── my_first_app │ │── hello_world.c │ └── BUILD.gn └── BUILD.gn 编写业务代码。 在hello_world.c中新建业务入口函数HelloWorld,并实现业务逻辑。并在代码最下方,使用OpenHarmony启动恢复模块接口SYS_RUN()启动业务。(SYS_RUN定义在ohos_init.h文件中) #include "ohos_init.h" #include "ohos_types.h" void HelloWorld(void) { printf("[DEMO] Hello world.\n"); } SYS_RUN(HelloWorld); 编写用于将业务构建成静态库的BUILD.gn文件。 如步骤1所述,BUILD.gn文件由三部分内容(目标、源文件、头文件路径)构成,需由开发者完成填写。以my_first_app为例,需要创建./applications/sample/wifi-iot/app/my_first_app/BUILD.gn,并完如下配置。 static_library("myapp") { sources = [ "hello_world.c" ] include_dirs = [ "//utils/native/liteos/include" ] } static_library中指定业务模块的编译结果,为静态库文件libmyapp.a,开发者根据实际情况完成填写。 sources中指定静态库.a所依赖的.c文件及其路径,若路径中包含"//"则表示绝对路径(此处为代码根路径),若不包含"//"则表示相对路径。 include_dirs中指定source所需要依赖的.h文件路径。 编写模块BUILD.gn文件,指定需参与构建的特性模块。 配置./applications/sample/wifi-iot/app/BUILD.gn文件,在features字段中增加索引,使目标模块参与编译。features字段指定业务模块的路径和目标,以my_first_app举例,features字段配置如下。 import("//build/lite/config/component/lite_component.gni") lite_component("app") { features = [ "my_first_app:myapp", ] } my_first_app是相对路径,指向./applications/sample/wifi-iot/app/my_first_app/BUILD.gn。 myapp是目标,指向./applications/sample/wifi-iot/app/my_first_app/BUILD.gn中的static_library("myapp")。 调测验证 目前调试验证的方法有两种,分别为通过printf打印日志、通过asm文件定位panic问题,开发者可以根据具体业务情况选择。 由于本示例业务简单,采用printf打印日志的调试方式即可。下面开始介绍这两种调试手段的使用方法。 printf打印 代码中增加printf维测,信息会直接打印到串口上。开发者可在业务关键路径或业务异常位置增加日志打印,如下所示。 void HelloWorld(void) { printf("[DEMO] Hello world.\n"); } 根据asm文件进行问题定位 系统异常退出时,会在串口上打印异常退出原因调用栈信息,如下文所示。通过解析异常栈信息可以定位异常位置。 =======KERNEL PANIC======= **********************Call Stack********************* Call Stack 0 -- 4860d8 addr:f784c Call Stack 1 -- 47b2b2 addr:f788c Call Stack 2 -- 3e562c addr:f789c Call Stack 3 -- 4101de addr:f78ac Call Stack 4 -- 3e5f32 addr:f78cc Call Stack 5 -- 3f78c0 addr:f78ec Call Stack 6 -- 3f5e24 addr:f78fc ********************Call Stack end******************* 为解析上述调用栈信息,需要使用到Hi3861_wifiiot_app.asm文件,该文件记录了代码中函数在Flash上的符号地址以及反汇编信息。asm文件会随版本大包一同构建输出,存放在./out/wifiiot/路径下。 将调用栈CallStack信息保存到txt文档中,以便于编辑。(可选) 打开asm文件,并搜索CallStack中的地址,列出对应的函数名 信息。通常只需找出前几个栈信息对应的函数,就可明确异常代码方向。 Call Stack 0 -- 4860d8 addr:f784c -- WadRecvCB Call Stack 1 -- 47b2b2 addr:f788c -- wal_sdp_process_rx_data Call Stack 2 -- 3e562c addr:f789c Call Stack 3 -- 4101de addr:f78ac Call Stack 4 -- 3e5f32 addr:f78cc Call Stack 5 -- 3f78c0 addr:f78ec Call Stack 6 -- 3f5e24 addr:f78fc 根据以上调用栈信息,可以定位WadRecvCB函数中出现了异常。 完成代码排查及修改。 运行结果 示例代码编译、烧录、运行、调测后,会显示如下结果: ready to OS start FileSystem mount ok. wifi init success! [DEMO] Hello world.

优秀的个人博客,低调大师

微软面向 AI PC 的 Copilot 操作系统曝光,取消了开始菜单

微软一款此前处于保密状态的全新操作系统遭到了外界曝光。这款在内部被称为“Project Aion”的系统,彻底颠覆了人们对传统 Windows 系统的认知。 该系统完全基于 Microsoft Edge 浏览器和轻量化的网页技术代码库构建,是微软专门为 AI 时代量身定制的先锋产品。 在 Project Aion 中,传统的“开始菜单”和繁杂的桌面图标已被彻底移除,取而代之的是一个极简的 AI 交互界面。用户启动系统后,底部的任务栏将直接呼出 Copilot 智能助理,由其主导所有的日常操作。 整个系统的核心功能围绕着信息流、内容创作和今日要闻展开,并且引入了全新的“空间”概念。这种设计能够将用户打开的网页和应用自动分类归纳,点击一次即可成组唤醒,极大地提升了多任务处理的效率。 值得注意的是,该系统完全放弃了对传统 Windows 原生桌面应用的底层支持,转而全面拥抱 Web 应用。这意味着用户在系统内运行的所有软件,本质上都是通过网页端来实现的高效协同。 对于习惯了传统办公软件的用户,微软在系统中给出了向云端过渡的解决方案,即通过 Windows 365 远程接入桌面服务。

优秀的个人博客,低调大师

Google 全新操作系统发布首个稳定版,可用于 PC 和 Mac

今年二月份的时候,Google 推出了 “全新” 的操作系统 chromeOS Flex,在经过五个多月的早期预览阶段后,chromeOS Flex 在今天推出首个稳定版本(版本 103),稳定版本意味着所有对这个系统感兴趣的用户都可以安装使用了,可以满足用户日常使用需求。 以防大家还不太了解这个 “新” 系统,这里还是做一些简要介绍。chromeOS Flex 与常规 chromeOS 不同,你可以将 chromeOS Flex 安装在原本基于 Windows 或 macOS(支持英特尔和 AMD 处理器,不支持 ARM)的设备上,从而将它们变成 Chromebook。 chromeOS Flex 建立在 Google 2020 年收购的 CloudReady 之上,后者主要面向那些希望延长现有设备使用寿命的企业和教育用户,因此这还是一个绿色、环保,具有可持续性的项目,毕竟 chromeOS 所需的配置要求不高。 Google 在博客中表示: 全球每年产生 4000 万吨电子垃圾,相当于每秒扔掉 800 台笔记本电脑。 将设备升级到 chromeOS Flex 而不是完全更换它们是减少浪费和防止这一日益严重的问题的有效方法。 为了让用户放心使用,Google 目前已经认证了超过 400 台设备,经过认证就意味着音频输入/输出、显示、网络、USB、网络摄像头,以及核心组件等都可以正常运行和使用。Google 还会继续扩大认证的规模,目前没有获得认证的设备并不代表无法使用 chromeOS Flex。 自早期预览计划以来,Google 已经解决了 600 多个问题,运行 chromeOS Flex 的最低设备要求如下: 架构:Intel 或 AMD x86-64-bit 兼容设备 内存:4 GB 存储:16 GB 可从 USB 启动 BIOS:完全管理员访问权限 处理器和显卡:2010 年以前生产的组件可能会导致体验不佳。注意:英特尔GMA 500、600、3600 和 3650 显卡硬件不符合 chromeOS Flex 性能标准。 运行 chromeOS Flex 的设备与 chromeOS 共享相同的代码库、应用级沙盒、只读操作系统、后台系统更新、发布节奏和极快的启动速度。其他相似之处还包括 Chrome 浏览器、用户界面、云同步(用于设置和书签)、Google 助理,以及对 Smart Lock、Instant Tethering 和 Nearby Sharing 的支持。然而,chromeOS Flex 缺乏对 Android 应用的支持,系统中也没有 Play Store。 chromeOS Flex 可以无需安装直接通过 USB 设备来启动。现有的 CloudReady 用户将可以通过自动升级的方式升级到新系统。具体安装方式可参考官方文档。

优秀的个人博客,低调大师

开发者提交补丁,Linux 5.10 或支持联想 PC 键盘快捷键

Linux 5.10 中可能将支持新型号联想Thinkpad 键盘上的快捷键驱动。 联想 ThinkPad 一直以来对支持 Linux 发行版情有独钟,Fedora、Ubuntu 与 Red Hat 等都是它希望预装的对象,联想还表示将进一步努力确保提供良好的 Linux 硬件支持,并与他们的硬件合作伙伴更好地互动,同时参与诸如 LVFS/Fwupd 支持之类的活动。 来自 Red Hat 的工程师日前对 ThinkPad ACPI 驱动进行更改,并且将相关补丁提交 Linux 5.10,想要让新型号产品支持键盘上的快捷键。F9-F11 三个键将调用不同功能,thinkpad_acpi 驱动会针对这些键接收 3 个新的 hkey 事件,比如 F9显示或隐藏通知中心,F10 为应答来电。另外,当按下 Fn + 右 Shift 键,这些 Thinkpad 型号还会发送新的 0x1316 hkey 事件。 工程师这一 commit 即为内核增加了对这 4 个新 hkey 事件的支持,不出意外的话,Linux 5.10 中将会看到相关驱动的变化。具体可查看:https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git/commit/?h=next&id=7ed7748d2c9cb8c26f5fcbfe4f4fa87655bb9a21

优秀的个人博客,低调大师

FydeOS for PC v9.1 发布,新增「系统设置」程序和燧炻传送功能

FydeOS v9 又是一次大家期待已久的里程碑式的更新,希望本次更新所带去的新功能和新特性可以给你更好的 FydeOS 体验,让这个不一样的春天稍有一丝期待。其中,最值得一提的有: Chromium 浏览器升级至 80.0.3987.*,同步了上游所有关于浏览器的新特性。 系统启动画面改为黑色背景,在屏幕亮度不可调节的时候对眼睛更友好。 添加「系统设置」app,将操作系统和设备相关的设置与浏览器的设置分离开来。你的所有 Chrome App、浏览器插件以及安卓程序一目了然。你可以更轻松的检查以及控制每个 App 的权限和更多设置,亦可更方便地管理并删除不需要的 App。 对平板模式交互方式的进一步优化。富媒体播放控制界面在锁屏状态下仍然呈现,在平板模式下关屏听歌时可更方便地控制。 将 Linux(测试版)所携带的默认容器升级到 Debian 10*并默认开启硬件图形加速支持。 其中,在 FydeOS v9.1 中,做了如下更新和优化: Chromium 浏览器升级至 80.0.3987.158,修复了一些安全性相关的问题。 在「文件」app 中内嵌了对「燧炻传送」的支持,让你更方便地与其它设备在局域网内传送文件。只需要在同一内网下的其它设备上访问drop.fydeos.com即可自动建立连接。 更新说明:https://fydeos.com/releases/9.1/amd64-fydeos/

优秀的个人博客,低调大师

Android-x86 9.0-r1 发布,PC 上的安卓系统

在测试版本已经可用了几个月之后,目前,Android-x86 9.0-r1 正式发布。这是Android-x86 9.0(pie-x86)的第一个稳定版本。预建镜像可在以下站点中找到: https://www.fosshub.com/Android-x86.html https://osdn.net/rel/android-x86/Release%209.0 主要特征如下: 9.0-r1 版本基于最新的 Android 9.0.0 Pie 版本(android-9.0.0_r53)。功能包括: 最新的 LTS 内核 4.19.105 支持 64 位和 32 位内核以及用户空间。 支持 Mesa 19.3.4 为 Intel、AMD、Nvidia 和 QEMU(virgl)提供的 OpenGL ES 3.x 硬件加速。 通过SwiftShader支持 OpenGL ES 2.0,以便在不受支持的 GPU 设备上进行软件渲染。 在具有 Intel HD 和 G45 graphics family 的设备上支持硬件加速编解码器。 支持从 UEFI 安全启动并安装到 UEFI 磁盘。 基于文本的 GUI 安装程序。 向 GRUB-EFI 添加主题支持。 支持多点触控、音频、Wifi、蓝牙、传感器、摄像头和以太网(仅 DHCP)。 仅在具有以太网的设备上模拟 WiFi 适配器,以提高应用程序兼容性。 自动挂载外部 USB 驱动器和 SD 卡。 添加任务栏作为替代启动器,它将启动菜单和最新应用程序托盘置于屏幕顶部,并支持自由格式窗口模式。 在没有已知传感器的设备上启用 ForceDefaultOrientation。Portrait 应用程序可以在横向设备中运行,而无需旋转屏幕。 通过本机桥接机制支持臂拱应用程序。(设置-> Android-x86 选项,仅 64 位) 支持从非官方发行版升级。 添加对较新的 Intel 和 AMD GPU 的实验性Vulkan支持。(通过高级选项引导-> Vulkan 支持) 对包括VirtualBox、QEMU、VMware 和 Hyper-V 在内的 VM 的鼠标集成支持。 更多详情可查看发布说明。

优秀的个人博客,低调大师

PC结束 Spark 二次开发 收到自己主动,并允许好友请求

本次Spark二次开发是为了客服模块的开发, 能让用户一旦点击该客服则直接自己主动加入好友。而客服放则需自己主动加入好友,不同弹出对话框进行允许,这方便的广大客服。 如今废话不多说,直接上代码。 package org.jivesoftware.spark.ui; import java.util.ArrayList; import org.jivesoftware.spark.util.log.Log; import org.jivesoftware.spark.util.ModelUtil; import org.jivesoftware.resource.Res; import org.jivesoftware.smack.Roster; import org.jivesoftware.smack.RosterEntry; import org.jivesoftware.smack.RosterGroup; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.packet.RosterPacket; import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.spark.SparkManager; import org.jivesoftware.spark.UserManager; /** * 处理全部订阅请求 * @author jian * */ public class MySubscription { private String jid; //构造函数 public MySubscription(){ } /** * 调用 * @param jid 主键ID */ public void invoke(final String jid){ this.jid=jid; final Roster roster=SparkManager.getConnection().getRoster();//返回好友冊 //假设用户已经在好友其中,则不显示 RosterEntry entry=roster.getEntry(jid);//返回相应的用户 if(entry!=null&&entry.getType()==RosterPacket.ItemType.to){ Presence response=new Presence(Presence.Type.subscribed); response.setTo(jid); SparkManager.getConnection().sendPacket(response); return; } UserManager userManager=SparkManager.getUserManager(); String username=userManager.getNickname(userManager.getFullJID(jid)); username=username==null? StringUtils.parseName(UserManager.unescapeJID(jid)):username;//给usernam赋值 boolean addEntry=addEntry(username); GetGroupName(); if(addEntry){ Presence response=new Presence(Presence.Type.subscribed); response.setTo(jid); SparkManager.getConnection().sendPacket(response); } } /** * 允许加入好友 */ private boolean addEntry(String username){ String errorMessage=Res.getString("title.error"); String groupName="Friends"; //获取该用户组是否存在 ContactGroup contactGroup=SparkManager.getWorkspace().getContactList().getContactGroup(groupName); boolean isSharedGroup = contactGroup!=null&&contactGroup.isSharedGroup(); System.out.println("用户组存在?"+isSharedGroup); if(isSharedGroup){ errorMessage=Res.getString("message.cannot.add.contact.to.shared.group"); }else if(!ModelUtil.hasLength(username)){ errorMessage=Res.getString("message.specify.contact.jid"); }else if(!ModelUtil.hasLength(groupName)){ errorMessage=Res.getString("message.specify.group"); }else if(ModelUtil.hasLength(username)&&ModelUtil.hasLength(groupName)&&!isSharedGroup){ System.out.println("加入好友"); System.out.println("直接输出Group组:"+groupName); addEntity(jid, username, groupName); return true; } return false; } /** * 把新用户加入到好友名单 * @param jid 账号 * @param username 昵称 * @param groupName 组名 */ private RosterEntry addEntity(String jid,String username,String groupName){ String[] groups={groupName}; System.out.println("開始加入了哦"); for(int i=0;i<groups.length;i++){ System.out.println(groups[i]); } Roster roster=SparkManager.getConnection().getRoster(); RosterEntry userEntry=roster.getEntry(jid); boolean isSubscribed=true; if(userEntry!=null){ isSubscribed=userEntry.getGroups().size()==0; } if(isSubscribed){ try { roster.createEntry(jid, username, new String[]{groupName}); } catch (XMPPException e) { Log.error("不能加入新的好友"+jid,e); } return roster.getEntry(jid); } try { RosterGroup rosterGroup=roster.getGroup(groupName); if(rosterGroup==null){ rosterGroup=roster.createGroup(groupName); } if(userEntry==null){ roster.createEntry(jid, username, groups); userEntry=roster.getEntry(jid); }else { userEntry.setName(username); rosterGroup.addEntry(userEntry); } userEntry=roster.getEntry(jid); } catch (XMPPException ex) { Log.error(ex); } return userEntry; } private void GetGroupName(){ ArrayList<String> list=new ArrayList<String>(); for(ContactGroup group:SparkManager.getWorkspace().getContactList().getContactGroups()){ if(!group.isOfflineGroup()&&!"Unfiled".equalsIgnoreCase(group.getGroupName())&&!group.isSharedGroup()){ list.add(group.getGroupName()); System.out.println(group.getGroupName()); } } } } 而在加入好友所用的类:org.jivesoftware.spark.ui.SubscriptionDialog.java 而监听并调用的类为:org.jivesoftware.spark.ui.ContactList.java 第2134行 版权声明:本文博客原创文章。博客,未经同意,不得转载。 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4663452.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册