鴻蒙NDK開發
0. 代碼地址
https://github.com/zchrissirhcz/cmake_examples/tree/master/ohos_ndk_example
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
要點:
-
注冊華為賬號,郵箱或手機號
-
下載DevEco Studio安裝包
-
File->Settings->Appearance & Behavior->System Settings->HarmonyOS SDK,勾選Native安裝

安裝時可以手動改Sdk安裝位置,默認在C盤,我改為了D:\soft\Huawei\sdk,只要不是在DevEco Studio安裝目錄里面都可以。
- 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找不到。
