鸿蒙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_H
 
void hello(const char* name);
 
#endif

build/ohos-arm64-v8a.bat

@echo off
 
set OHOS_NDK=D:/soft/Huawei/sdk/native/3.0.0.80
set TOOLCHAIN=%OHOS_NDK%/build/cmake/ohos.toolchain.cmake
 
REM 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 ^
    ../..
 
ninja
 
cd ..

这里注意系统中应当先装好了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 3
    defaultConfig {
        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.鸿蒙南向开发方向

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IO流

一、IO概述 1&#xff0e;什么是IO流? 存储和读取数据的解决方案l: inputo: output流∶像水流一样传输数据 2.IO流的作用? 用于读写数据&#xff08;本地文件&#xff0c;网络) 3.IO流按照流向可以分类哪两种流? 输出流:程序 - > 文件 输入流:文件 - > 程…

30道python自动化测试面试题与答案汇总!

Python是不可或缺的语言,它的优美与简洁令人无法自拔,下面这篇文章主要给大家介绍了关于30道python自动化测试面试题与答案汇总的相关资料,需要的朋友可以参考下 1、什么项目适合做自动化测试&#xff1f; 关键字&#xff1a;不变的、重复的、规范的 1&#xff09;任务测试明…

Collection与数据结构 Stack与Queue(二):队列与Queue

1. 队列 1.1 概念 只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾&#xff08;Tail/Rear&#xff09; 出队列&#xff1a;进行删除操作…

JVM内存性能调优思路之:通过GC log、Thread Dump 、Heap Dump分析内存使用说明

文章目录 一. 各日志概述1. Garbage Collection Log - 找到GC规律2. 线程转储(Thread dump) - 分析&#xff08;快照&#xff09;线程状态3. 堆转储(Heap dump) - APP某刻内存使用全貌 二. 命令1. 程序的gc日志2. 线程转储3. 堆转储 概述 在 Java 虚拟机中&#xff0c;(GC) Gar…

C语言分支语句

一、什么是语句 C语句可分为以下五类&#xff1a; 表达式语句 函数调用语句 控制语句 复合语句 空语句 本周后面介绍的是控制语句。 控制语句用于控制程序的执行流程&#xff0c;以实现程序的各种结构方式&#xff0c;它们由特定的语句定义符组成&#xff0c;C语 言有…

测试工程师求职是选自研公司还是选外包公司呢?

大家好&#xff0c; 今天我们一起来聊一聊测试工程师求职是选自研公司&还是选外包公司呢&#xff1f; 今天来谈谈我的个人看法&#xff0c;作为一个在测试岗位上多年的我来说&#xff0c;自研公司比较好&#xff0c;外包公司其实也不会差。各自都有特点特色&#xff0c;根据…

虚拟主机VPS和共享服务器有什么区别?VPS和共享服务器怎么选择,VPS和云服务器区别

今天易极赞小编来跟大家科普一个新的知识“虚拟主机和云服务器有什么区别&#xff1f;”看完这篇文章后你应该就能知道虚拟主机和云服务器哪个更适合你了。 如果你不知道服务器的常见类型有哪些&#xff0c;查看下面这篇文章&#xff1a; 服务器7中常见的类型&#xff0c;服务…

刷力扣中学习使用static,final

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/throne-inheritance/今天在力扣题中第一次使用了static和final&#xf…

Ceph学习 -3.存储简介

文章目录 1.存储简介1.1 存储类型1.1.1 储备知识1.1.2 三种存储1.1.3 块存储1.1.4 文件存储1.1.5 对象存储1.1.6 三种存储之间的关系1.1.7 总结 1.2 Ceph简介1.2.1 官方介绍1.2.2 软件特点1.2.3 基本结构1.2.4 应用场景 1.3 小结 1.存储简介 学习目标&#xff1a;这一节&#x…

Shiny Items VFX for URP

一系列令人惊叹且易于编辑的Shuriken粒子系统和粒子着色器&#xff0c;用于稀有物品、奖励或通电物品 用我的“闪亮物品”包提高你在URP项目中的稀有物品、奖项或电源的吸引力。 该包提供了使用Shuriken粒子系统创建的14个“项目”预制集&#xff0c;以及项目的自定义着色图着色…

PPP-B2b星历下载

目前做PPP-B2b研究比较多&#xff0c;其中PPP-B2b需要北斗的CNAV星历下载链接为&#xff08;例如2024.04.05对应的2024年第097天&#xff09;&#xff1a;数据下载http://www.csno-tarc.cn/datacenter/ephemeris

c++ Constraints 和 concepts介绍

C++20 引入了 Concepts,以改进模板编程的体验。Concepts 是一种用于模板编程的新机制,它允许程序员在编译时对模板参数进行约束和限制,从而提高模板的可读性、可维护性和错误检测能力。 Constraints(约束)是 Concepts 的一部分,它定义了模板参数必须满足的条件。一个约束…

《科技创业月刊》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答&#xff1a;问&#xff1a;《科技创业月刊》是什么级别的刊物&#xff1f; 答&#xff1a;省级&#xff0c;主管单位&#xff1a; 湖北省科学技术厅 &#xff1b;主办单位&#xff1a;湖北省科技信息研究院 问&#xff1a;《科技创业月刊》是c刊吗&#xff1f; 答&…

Rustdesk二次编译,新集成AI功能开源Gpt小程序为远程协助助力,全网首发

环境&#xff1a; Rustdesk1.1.9 sciter版 问题描述&#xff1a; Rustdesk二次编译&#xff0c;新集成AI功能开源Gpt小程序为远程协助助力,全网首发 解决方案&#xff1a; Rustdesk二次编译&#xff0c;新集成开源AI功能Gpt小程序&#xff0c;为远程协助助力&#xff0c…

【C++】RapidJSON 设置支持 std::string,防止编译报错

问题 rapidjson 创建 json 数据&#xff0c;使用 std::string 字符串进行赋值&#xff0c;编译时&#xff0c;抱一堆错误 .... rapidjson/include/rapidjson/document.h:690:5: note: candidate expects 0 arguments, 1 provided [build] make[2]: *** [main/CMakeFiles/ma…

2024.4.7

1. 2列火车 #include<myhead.h>pthread_mutex_t m1; pthread_mutex_t m2;void* run(void* arg) {while(1){pthread_mutex_lock(&m1);printf("火车B进入\n");printf("A请等待\n");pthread_mutex_unlock(&m2);sleep(2);} }int main(in…

cookie、session、token的区别

这三者都和维持状态信息有关。比如我们如果在网页进行了一次登录&#xff0c;如果我们希望以后再访问该网页的时候&#xff0c;维持登录信息的话&#xff0c;就需要用到上面的这三种&#xff0c;如果不用的话&#xff0c;那么我们每次都需要携带登录信息到服务器&#xff0c;并…

海纳斯删除广告位

找到文件 vim /var/www/html/home.php 删除代码段 <div class"adleft" id"adleftContainer"><button onclick"closeAd()">关闭</button><a href"https://www.ecoo.top/ad.html" target"_blank">&l…

Android Studio学习16——Activity跳转时的参数传递

传递数据——example 传递对象类型的数据——example 传递 接收 回传数据——example

Docker容器(五)Docker Compose

一、概述 1.1介绍 Docker Compose是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。Compose 是 Docker 公司推出的一个工具软件&#xff0c;可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml&#xff0c;…