鸿蒙HarmonyOS 与 Android 的NDK有什么不一样?

1. 序言

就像开发Android要用Android Studio一样,Android Studio(简称AS)其实是基于IDEA+gradle插件+android插件开发而来。

鸿蒙系统,你可以认为它和android有点像,但又是超越android的存在,除了手机,还可以其他各种设备。。然后,我们需要一个对标Android Studio的开发工具。那就是DevEco Studio了。

Android Studio是一个IDE,基于gradle执行构建,应用层写Java/Kotlin,NDK层则可以用C/C++开发。

DevEco Studio也是一个IDE,基于gradle执行构建,应用层写Java/JS,NDK层可以用C/C++开发。

总之,NDK层,大家都是C/C++写代码,基于CMake构建。如果你是搞NDK开发的,应该知道这一点:把编译器和cmake的toolchain文件配置好,不用IDE就可以开发了。

Android NDK可以手动从官网下载;但是鸿蒙NDK似乎没法从官网直接下载,需要在DevEco Studio中下载。

1. 安装DevEco Studio以及NDK

官网说明文档:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/software_install-0000001053582415

要点:

  1. 注册华为账号,邮箱或手机号

  2. 下载DevEco Studio安装包

  3. File->Settings->Appearance & Behavior->System Settings->HarmonyOS SDK,勾选Native安装

安装时可以手动改Sdk安装位置,默认在C盘,我改为了D:\soft\Huawei\sdk,只要不是在DevEco Studio安装目录里面都可以。

  1. gradle代理

遇到的问题是,连接到huaweicloud的gradle相关的下载总是失败。后来发现,由于先前我配置过Android开发环境,配置过gradle代理,需要关掉gradle代理才能让DevEco顺畅下载。即:

C:\Users\zz\.gradle\gradle.properties文件,临时改名(回头用Android Studio时改回来)

2. OHOS NDK开发(命令行方式)

从鸿蒙的NDK相关的cmake toolchain里面可以发现,鸿蒙开放系统,被简称为了OHOS,估计是Open Harmony Operating System的缩写吧。

OHOS的NDK安装在sdk里面。例如我的:
ohos sdk目录:D:\soft\Huawei\sdk;
ohos ndk目录:D:\soft\Huawei\sdk\native\3.0.0.80;
ohos ndk的cmake toolchain文件:D:\soft\Huawei\sdk\native\3.0.0.80\build\cmake\ohos.toolchain.cmake

到这里,习惯于命令行方式执行交叉编译的工程师们都知道怎么做了。

作为样例,我贴一下我的OHOS NDK的hello world的相关文件:

cmake_minimum_required(VERSION 3.15)set(CMAKE_EXPORT_COMPILE_COMMANDS ON)project(hello)add_library(hello STATIC${CMAKE_SOURCE_DIR}/hello.h${CMAKE_SOURCE_DIR}/hello.cpp
)

hello.cpp

#include "hello.h"//#include <stdio>
#include <iostream>void hello(const char* name)
{if (name==NULL) {//printf("Hello World\n");std::cout << "Hello World\n";} else {//printf("Hello %s\n", name);std::cout << "Hello " << name << "\n";}
}

hello.h

#ifndef HELLO_H
#define HELLO_Hvoid hello(const char* name);#endif

build/ohos-arm64-v8a.bat

@echo offset OHOS_NDK=D:/soft/Huawei/sdk/native/3.0.0.80
set TOOLCHAIN=%OHOS_NDK%/build/cmake/ohos.toolchain.cmakeREM echo "=== TOOLCHAIN is: $TOOLCHAIN"set BUILD_DIR=ohos-arm64-v8a
if not exist %BUILD_DIR% md %BUILD_DIR%
cd %BUILD_DIR%cmake -G Ninja ^-DCMAKE_TOOLCHAIN_FILE=%TOOLCHAIN% ^-DOHOS_ARCH="arm64-v8a" ^-DCMAKE_BUILD_TYPE=Debug ^../..ninjacd ..

这里注意系统中应当先装好了cmake和ninja并且放在了系统PATH中。当然,你也可以用OHOS NDK里面装好的cmake。

在cmd中切换到build目录,执行ohos-arm64-v8a.bat,可以生成静态库文件libhello.a

3. OHOS NDK开发(IDE模式)

Android Studio中在创建项目的时候可以选择带Native的开发,会生成CMakeLists.txt和相应C++文件。DevEco Studio目前暂时支持的创建项目模板不多,还不能直接生成NDK相关文件。不过手动创建CMakeLists.txt和C++文件,应该还是比较容易的,对于做过NDK开发的人来说没啥问题。

除了CMake和C/C++代码,还需要修改模块的build.gradle文件,让gradle知道怎么调用cmake。官方文档:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/build_config-0000001052902431

贴一下我的entry模块的build.gradle,其中卡壳的地方是需要手动指定 CMAKE_TOOLCHAIN_FILE 路径。这一点需要DevEco Studio改进(或者是我没有正确配置?如果知道还请指出):

apply plugin: 'com.huawei.ohos.hap'
ohos {compileSdkVersion 3defaultConfig {compatibleSdkVersion 3}externalNativeBuild {path "src/main/cpp/CMakeLists.txt"   //CMake配置入口,提供CMake构建脚本的相对路径arguments "-DCMAKE_TOOLCHAIN_FILE=D:/soft/Huawei/sdk/native/3.0.0.80/build/cmake/ohos.toolchain.cmake"    //传递给CMake的可选编译参数abiFilters "arm64-v8a"     //用于设置本机的ABI编译环境cppFlags ""   //设置C++编译器的可选参数}
}dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])testCompile'junit:junit:4.12'
}

如果没有指定 OHOS 的 CMAKE_TOOLCHAIN_FILE 文件,会报错说stdio.h找不到。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

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

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

相关文章

笛卡尔树[天梯赛二叉树专项训练]

文章目录 题目描述思路AC代码 题目描述 输入样例1 6 8 27 5 1 9 40 -1 -1 10 20 0 3 12 21 -1 4 15 22 -1 -1 5 35 -1 -1 输出样例1 YES 输入样例2 6 8 27 5 1 9 40 -1 -1 10 20 0 3 12 11 -1 4 15 22 -1 -1 50 35 -1 -1 输出样例2 NO思路 见注释 AC代码 #include <bits/st…

搭建python编译环境

目录 1.安装依赖包 2.安装失败进行换源 3. 更新系统 通过C 语言调用 Python 代码&#xff0c;需要先安装 libpython3 的 dev 依赖库&#xff08;不同的 ubuntu 版本下&#xff0c; python 版本 可能会有差异&#xff0c; 比如ubuntu 22.04 里是 libpython3.10-dev &#xff09…

2024/4/1—力扣—最小高度树

代码实现&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ struct TreeNode* buildTree(int *nums, int l, int r) {if (l > r) {return NULL; // 递归出口}struct…

[StartingPoint][Tier1]Sequel

Task 1 During our scan, which port do we find serving MySQL? (在扫描过程中&#xff0c;我们发现哪个端口为 MySQL 提供服务&#xff1f;) 3306 Task 2 What community-developed MySQL version is the target running? (目标正在运行哪个社区开发的 MySQL 版本&…

Python实现【坦克大战】+源码分享

写在前面&#xff1a; 坦克大战&#xff0c;这款经典的电子游戏&#xff0c;无疑是许多80后和90后心中不可磨灭的童年记忆。它不仅仅是一款游戏&#xff0c;更是那个时代科技娱乐方式的缩影&#xff0c;见证了电子游戏行业的起步与发展。 在那个电脑和网络尚未完全普及的年代…

c语言实现2048小游戏

#include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h>int best 0 ;// 定义2048游戏的结构体 typedef struct { int martix[16]; // 当前4*4矩阵的数字 int martixPrior[16]; // 上一步的4*4矩阵的数字 int emptyIndex[16…

LeetCode 1017. 负二进制转换

解题思路 相关代码 class Solution {public String baseNeg2(int n) {if(n0) return "0";String s"";while(n!0)if(Math.abs(n)%20){nn/(-2);ss0;}else{ss1; n (n-1)/(-2);}String t reverse(s);return t;}public String reverse(String s){Str…

前端三剑客 —— JavaScript (第一节)

目录 回顾内容 1.弹性布局 2.网格布局 JavaScript 概述 发展 浏览器 什么是Javascript JavaScript 能干什么 JavaScript需要的环境 JavaScript初体验 基本数据 JS书写方式 行内JS 页面JS 外部JS 1&#xff09;创建外部JS文件 2&#xff09;编写页面 对话框 警…

【Threejs进阶教程-效果篇】1.Threejs文字与css2d/css3d技术

Threejs文字与css2d/css3d技术 学习ThreeJS的捷径学习之前先搞清楚自己想要什么样的效果贴图文字准备一张带文字的png贴图使用sprite来进行贴图实现2D始终面朝相机的文字使用planeGeometry来贴图实现3D文字使用planeGeometry来贴图实现伪3D文字动态贴图文字html2Canvas 文字几何…

操作系统复习

虚拟内存 内存(memory)资源永远都是稀缺的&#xff0c;当越来越多的进程需要越来越来内存时&#xff0c;某些进程会因为得不到内存而无法运行&#xff1b; 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存&#xff0c;而实际上&#xff0…

HTML基础知识详解(下)(如果想知道html的全部基础知识点,那么只看这一篇就足够了!)

前言&#xff1a;在上一篇文章中&#xff0c;我们已经学习完了超链接标签、列表标签和表格标签&#xff0c;但是我们还有一些标签没有学习&#xff0c;在这篇文章中&#xff0c;我们将学习剩余的标签。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页…

JAVA并发编程(一)

JAVA并发编程&#xff08;一&#xff09; 1.1JAVA线程API 1.1.1currentThread package com.lisus2000.thread;/** * 当前线程 * */ public class Test07 extends Thread {public Test07() {System.out.println("new Test07()......" Thread.currentThread().getNa…

vivado中移位寄存器的优化(二)

移位寄存器优化用于改善移位寄存器单元&#xff08;SRLs&#xff09;与其他逻辑单元之间的负裕量路径的时序。如果存在对移位寄存器单元&#xff08;SRL16E或SRLC32E&#xff09;的时序违规&#xff0c;优化会从SRL寄存器链的开始或结束位置提取一个寄存器&#xff0c;并将其放…

深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作

二叉树&#xff08;1&#xff09;&#xff1a;深入理解数据结构第一弹——二叉树&#xff08;1&#xff09;——堆-CSDN博客 二叉树&#xff08;2&#xff09;&#xff1a;深入理解数据结构第二弹——二叉树&#xff08;2&#xff09;——堆排序及其时间复杂度-CSDN博客 前言…

面试:HashMap

目录 1、底层数据结构&#xff0c;1.7 与1.8有何不同? 2、为何要用红黑树&#xff0c;为何一上来不树化&#xff0c;树化阈值为何是8&#xff0c;何时会树化&#xff0c;何时会退化为链表? 3、索引如何计算? hashCode都有了&#xff0c;为何还要提供hash()方法?数组容量为…

【Easy云盘 | 第十二篇】分享模块(获取分享信息、校验分享码、获取文件列表)

文章目录 4.4.4获取分享信息4.4.5校验分享码4.4.6获取文件列表 4.4.4获取分享信息 明天做 4.4.5校验分享码 明天做 4.4.6获取文件列表 明天做

Vue3大事件项目1 登录注册

创建项目 引入 element-ui 组件库 登录&#xff1a;注册样式准备之后&#xff0c;配置校验规则&#xff08;4个条件&#xff1a;一数据、二规则&#xff09; 1. 校验相关 (1) 给当前表单绑上整个的数据对象&#xff1a;el-form > :model"ruleForm" 绑…

云服务器是不是云盘?

​  云服务器是不是云盘?云服务器和云盘是两个不同的概念&#xff0c;尽管它们都是云计算服务的一部分。云服务器是一种提供计算能力的服务&#xff0c;可以运行各种应用程序和服务&#xff0c;而云盘则是一种提供数据存储和共享服务的工具。 具体来说&#xff1a; 云服务器…

【Qt】事件

目录 一、介绍 二、进入离开事件 三、鼠标事件 3.1 鼠标单击事件 3.2 鼠标释放事件 3.3 鼠标双击事件 3.4 鼠标移动事件 3.5 滚轮事件 四、按键事件 4.1 单个按键 4.2 组合按键 五、定时器 5.1 QTimerEvent类 5.2 QTimer类 5.3 获取系统日期及时间 六、窗口移…

蓝桥杯刷题 前缀和与差分-[NewOJ P1819]推箱子(C++)

题目描述 在一个高度为H的箱子前方&#xff0c;有一个长和高为N的障碍物。 障碍物的每一列存在一个连续的缺口&#xff0c;第i列的缺口从第l各单位到第h个单位&#xff08;从底部由0开始数&#xff09;。 现在请你清理出一条高度为H的通道&#xff0c;使得箱子可以直接推出去。…