OpenHarmony 一篇入门-设备开发之helloworld(L2) 原创 精华

碼磚民工
发布于 2022-2-15 08:36
浏览
10收藏

【春节不停更,此文正在参加「星光计划-春节更帖活动」】

@toc

一、简介

此文章以OpenHarmony3.0代码为基础,Hi3516开发板来进行编写测试。

  1. 介绍子系统添加
  2. 介绍静态库编译
  3. 介绍动态库编译
  4. 介绍动态库和静态库的调用
    入门了解设备开发:
    partA/feature1编译的静态库,
    partB/module编译的是动态库
    partA/feature2可执行程序中调用动态库和静态库
    OpenHarmony 一篇入门-设备开发之helloworld(L2)-鸿蒙开发者社区

二、代码添加编译

2.1 子系统添加

配置文件:build/subsystem_config.json

,
  "sub_example": {
    "project": "hmf/test",
    "path": "test/example",
    "name": "sub_example",
    "dir": "test"
  }

如果自己想自定义目录,test为测试代码放在目录路径。

2.2 子模块添加

配置文件:productdefine/common/products/Hi3516DV300.json

{
  "product_name": "Hi3516DV300",
  "product_company": "hisilicon",
  "product_device": "hi3516dv300",
  "version": "2.0",
  "type": "standard",
  "product_build_path": "device/hisilicon/build",
  "parts":{
…
    "sub_example:partB":{},
    "sub_example:partA":{}
  }
}

2.3 模块partA/feature1

目录结构
OpenHarmony 一篇入门-设备开发之helloworld(L2)-鸿蒙开发者社区
编译配置文件:test\example\partA\feature1\BUILD.gn

import("//build/ohos.gni")

config("helloworld1_lib_config") {
 include_dirs = [ "include" ]
}
ohos_static_library("libhelloworl1_lib") {
  output_extension = "a"
  sources = [
    "include/helloworld1.h",
    "src/helloworld1.c"
  ]
  public_configs = [ ":helloworld1_lib_config" ]
  part_name = "partA"
}

其中ohos_static_library标准系统是ninja生成静态库的关键。

2.4 模块partB/module

目录结构
OpenHarmony 一篇入门-设备开发之helloworld(L2)-鸿蒙开发者社区
配置文件test\example\partB\module\BUILD.gn

import("//build/ohos.gni")

config("module_lib_config") {
  include_dirs = [ "include" ]
}

ohos_shared_library("module_lib") {
  sources = [
    "//test/example/partB/module/include/module.h",
    "//test/example/partB/module/src/module.c"
  ]
  public_configs = [ ":module_lib_config" ]
  part_name = "partB"
  subsystem_name = "sub_example"
}

其中ohos_shared_library标准系统是ninja生成动态库的关键。

2.5 动态库和静态库调用模块partA/feature2

目录结构
OpenHarmony 一篇入门-设备开发之helloworld(L2)-鸿蒙开发者社区
编译配置:test\example\partA\feature2\BUILD.gn

import("//build/ohos.gni")

ohos_executable("helloworld2_bin") {
  sources = [
    "src/helloworld2.c"
  ]
  include_dirs = [ 
    "include",
    "//test/example/partB/module/include"
  ]
  deps = [                                # 组件内模块依赖
    "../feature1:libhelloworl1_lib",
    #"//test/example/partB/module:module_lib",
    "../feature3:feature3_etc",
  ]
  external_deps = [ "partB:module_lib", ]     # 跨组件的依赖,格式为“组件名:模块名”
  install_enable = true                   # 可执行程序缺省不安装,需要安装时需要指定
  part_name = "partA"
  subsystem_name = "sub_example"
}

调用的C代码:test\example\partA\feature2\src\helloworld2.c

#include "helloworld1.h" // 模块partA/feature1
#include "module.h" // 模块partB/module
#include <stdio.h>

void helloworld2(void)
{
    printf("[demo] hello world 2222\n");
    helloworld1(); // partA/feature1
    module(); // partB/module
}

int main()
{
    helloworld2();
    return 0;
}

2.6 编译配置test\example\ohos.build

配置中的inner_kitstest\example\partA\feature2\BUILD.gn跨组件依赖配置的关键。

{
    "subsystem": "sub_example",
    "parts": {
        "partB": {
            "module_list": [
                "//test/example/partB/module:module_lib"
            ],
            "inner_kits": [
                {
                    "type": "so",
                    "name": "//test/example/partB/module:module_lib",
                    "header": {
                        "header_files": [
                            "module.h"
                        ],
                        "header_base": "//test/example/partB/module/include"
                    }
                }
            ],
            "system_kits": [],
            "test_list": []
        },
        "partA": {
            "module_list": [
                "//test/example/partA/feature1:libhelloworl1_lib",
                "//test/example/partA/feature2:helloworld2_bin"
            ],
            "inner_kits": [],
            "system_kits": [],
            "test_list": []
        }
    }
}

三、编译测试运行

3.1 编译:

./build.sh --product-name Hi3516DV300 --ccache --build-target helloworld2_bin

编译成功后,可以把编译好的helloworld2_bin和libmodule_lib.z.so用hdc_std.exe发送到Hi3516DV300开发板中去运行,在串口终端上输出调用结果。

3.2 修改系统权限,目录能读能写:

mount -o remount,rw /

3.3 发送文件到开发板:

hdc_std.exe file send Z:\L2\out\ohos-arm-release\sub_example\partB\libmodule_lib.z.so /system/lib
//开发板目录/data/test为自建目录,没有的话,先创建。
hdc_std.exe file send Z:\L2\out\ohos-arm-release\sub_example\partA\helloworld2_bin /data/test

3.3 修改成可执行权后:

chmod 0711 /data/test/helloworld2_bin 

3.4 运行:

/data/test/helloworld2_bin 

OpenHarmony 一篇入门-设备开发之helloworld(L2)-鸿蒙开发者社区

文档中的代码没有完全展示,下载【源代码】
重点关注目录:example\partB\module,example\partA\feature1,example\partA\feature2
代码库中的源码相对于文档中的代码有少许调整,基本结构不变.

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-11-18 11:08:55修改
11
收藏 10
回复
举报
3条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

老师最近真是高产!

已于2022-2-15 10:35:15修改
回复
2022-2-15 10:35:08
民之码农
民之码农

666

1
回复
2022-2-17 08:17:32
beyond阿亮
beyond阿亮

很详细

回复
2022-10-27 11:06:01
回复
    相关推荐