成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

[觸覺智能RK3568]OpenHarmony NDK工具(上)

系統 OpenHarmony
NDK (原生開發套件) 是一套工具,使開發者能夠在 OpenHarmony hap應用中使用 C/C++ 代碼。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

在OpenHarmony應用開發中選擇Native C ++開發方式需要使用OpenHarmony NDK工具,或者想移植一個C/C ++的三方庫到OpenHarmony中也可以使用NDK。NDK使用到的編譯工具是cmake,也就是CMakeLists.txt那一套。Native C ++應用開發方式可以做直接編譯三方庫的so庫再利用NAPI框架實現能力的調用(只需要在三方庫原生的CMakeLists.txt中修改小部分的內容就可以實現)。

一、OpenHarmony NDK

  • NDK (原生開發套件) 是一套工具,使開發者能夠在 OpenHarmony hap應用中使用 C/C++ 代碼。
  • NDK提供了一系列的工具可以幫助開發者快速的開發C/C++的動態庫、靜態庫和可執行文件。
  • OpenHarmony 應用開發的??Native C++???開發方式就要依賴NDK。NDK被包含在OpenHarmony SDK中??梢栽??DevEco Studio???使用 NDK 將 C/C ++ 代碼編譯到so庫中,然后使用 DevEco Studio 的構建插件??hvigor-ohos-plugin???將so庫打包到 Hap 中。ArkTS代碼隨后可以通過??NAPI框架??調用SO庫中的函數。

二、獲取NDK的方式

1、從每日構建中獲取

每日構建地址: http://ci.openharmony.cn/dailys/dailybuilds。

組件形態選擇ohos-sdk,版本選擇最新版本的sdk一般是沒有問題的(但是筆者之前遇到下載的ndk中的clang工具找不到libatomic.so無法工作的情況的情況)。

下載解壓后可以得到如下文件,根據linux或者windows端解壓不同文件得到sdk。

2、編譯源碼得到SDK中的NDK

安裝依賴
./build/build_scripts/env_setup.sh

執行完上述命令后記得執行source ~/.bashrc或者重啟終端
source ~/.bashrc

安裝編譯SDK需要的依賴包(編譯鏡像的時候是不依賴這些包的)
sudo apt-get install libxcursor-dev libxrandr-dev libxinerama-dev

./build.sh --product-name ohos-sdk --ccache --build-target ohos_ndk

寫文章提的issue https://gitee.com/openharmony/build/issues/I6H8IO?from=project-issue

  • 在對應的目錄底下找到編譯成功的NDK,相關路徑out/sdk/packages/ohos-sdk/linux/native,根據linux或者windows端解壓不同文件得到sdk

 #創作者激勵#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎軟件社區

二、NDK目錄

native
├── NOTICE.txt 聲明文件
├── build
└── cmake
├── ohos.toolchain.cmake ---->編譯的工具鏈
└── sdk_native_platforms.cmake ---->編譯的工具鏈(在DevEco Studio中編譯打包so要用到)
├── build-tools ---->cmake編譯工具所在目錄(NDK提供的編譯工具)
├── llvm ---->編譯器所在目錄(NDK提供的編譯工具)
├── sysroot ---->編譯器的 sysroot 目錄,存放 SDK 內部的已經包含的庫和對應的頭文件
├── ndk_system_capability.json ---->NDK自帶so庫能力描述文件
├── nativeapi_syscap_config.json ---->調用NDK自帶so庫能力相關頭文件
├── docs ---->調用NDK自帶so庫能力相關文檔
└── oh-uni-package.json ---->SDK 信息描述
  • llvm中bin目錄下的編譯器有。
FileCheck    clang-format      ld64.lld        lldb-vscode      llvm-cxxfilt     llvm-objdump   llvm-strip       yaml2obj
clang clang-tidy lld llvm-addr2line llvm-dis llvm-profdata llvm-symbolizer
clang++ clangd lld-link llvm-ar llvm-lib llvm-ranlib not
clang-12 count lldb llvm-as llvm-link llvm-readelf sancov
clang-check dsymutil lldb-argdumper llvm-cfi-verify llvm-modextract llvm-readobj sanstats
clang-cl git-clang-format lldb-mi llvm-config llvm-nm llvm-size scan-build
clang-cpp ld.lld lldb-server llvm-cov llvm-objcopy llvm-strings scan-view

三、linux下使用NDK編譯庫文件和可執行文件

1、使用NDK編譯一個簡單demo

shared-library            
├── CMakeLists.txt 外部CMakeLists.txt
├── include 頭文件目錄
└── shared
└── Hello.h
└── src 源文件目錄
├── CMakeLists.txt 內部CMakeLists.txt
├── Hello.cpp
└── main.cpp
  • 外部CMakeLists.txt
#cmake的版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
#工程名稱
PROJECT(HELLO_LIBRARY)
#添加一個子目錄并構建該子目錄
ADD_SUBDIRECTORY(src)

cmake的內置命令是不區分大小寫的,因此add_subdirectory與ADD_SUBDIRECTORY作用一致。但是cmake的所有變量都是區分大小寫的

  • 內部CMakeLists.txt
#設置可執行文件輸出路徑
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/output)
# 設置so庫文件輸出路徑
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/output)

############################################################
# Create a library
############################################################

#SHARED表示生成的是動態庫,動態庫的名字是hello_shared_library。生成動態庫的源文件是Hello.cpp
ADD_LIBRARY(hello_shared_library SHARED
Hello.cpp
)
#為生成的動態庫添加一個別名,后續hello::library可使用來替代hello_shared_library
ADD_LIBRARY(hello::library ALIAS hello_shared_library)

#為指定目標hello_shared_library添加頭文件搜索路徑(這個指定目標決不能是alias target,也就是指定的別名hello::library)
TARGET_INCLUDE_DIRECTORIES(hello_shared_library
PUBLIC
${PROJECT_SOURCE_DIR}/include
)

############################################################
# Create an executable
############################################################

# 使用指定的源文件main.cpp創建出一個可執行文件hello_shared_binary
ADD_EXECUTABLE(hello_shared_binary
main.cpp
)

#TARGET_LINK_LIBRARIES指令的作用為將目標文件與庫文件進行鏈接
#將可執行文件hello_shared_binary與庫文件hello::library進行鏈接
TARGET_LINK_LIBRARIES( hello_shared_binary
PRIVATE
hello::library
)

3、進行cmake編譯

(1)NDK自帶的cmake編譯工具添加到環境變量

1、第一種方法:

#將其臨時加入環境變量中(適用于臨時想用用NDK)
export PATH=$PATH:/ohos-sdk/linux/native/build-tools/cmake/bin(你自己解壓的NDK目錄)

2、第二種方法:

#將其永遠加入環境變量中
#打開.bashrc文件
vim ~/.bashrc
#在文件最后添加cmake路徑,該路徑是自己的放置文件的路徑,之后保存退出
export PATH=/ohos-sdk/linux/native/build-tools/cmake/bin:$PATH
#在命令行執行source ~/.bashrc使環境變量生效
source ~/.bashrc

3、查看環境變量添加是否成功。

cmake -version

 #創作者激勵#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎軟件社區

可知cmake的版本是3.16.5 ,所以編寫CMakeLists.txt可參考的鏈接為 https://cmake.org/cmake/help/v3.16/guide/tutorial/

(2)安裝make

如果沒有安裝make會出現以下報錯,則執行sudo apt-get install make。(如果已經安裝make,請忽略)。

(3)cmake的幾個參數

1、OHOS_STL參數,其類型可以是c++_shared和c++_static,默認是c++_shared。

 #創作者激勵#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎軟件社區

2、OHOS_ARCH參數(設置應用程序二進制接口ABI),其類型是armeabi-v7a、x86_64 ,默認值是arm64-v8a。每一種ABI定義了相應的二進制文件。

  • armeabi-v7a (選擇這個是編譯32位的二進制文件)。
  • arm64-v8a (選擇這個是編譯64位的二進制文件)。
  • x86_64 (現在不使用,OpenHarmony現在在適配x86的芯片)。

3、OHOS_PLATFORM參數,其類型為OHOS(只能選擇OHOS平臺)。

4、 CMAKE_TOOLCHAIN_FILE參數指向的是工具鏈文件所在的位置,就是ohos.toolchain.cmake的路徑(對于編譯不同平臺二進制文件是很重要的)。

  • build目錄中的工具鏈文件ohos.toolchain.cmake,cmake編譯時需要讀取該文件中的默認值,比如編譯器的選擇、編譯平臺,例如ohos.toolchain.cmake文件中,
# Common default settings
39:if(NOT DEFINED OHOS_PLATFORM_LEVEL)
set(OHOS_PLATFORM_LEVEL 1)
endif()
43:if(NOT DEFINED OHOS_TOOLCHAIN)
set(OHOS_TOOLCHAIN clang)
endif()
47:if(NOT DEFINED OHOS_STL)
set(OHOS_STL c++_shared)
endif()
51:if(NOT DEFINED OHOS_PIE)
set(OHOS_PIE TRUE)
endif()
55:if(NOT DEFINED OHOS_ARM_NEON)
set(OHOS_ARM_NEON thumb)
endif()
60:if(NOT DEFINED OHOS_ARCH)
set(OHOS_ARCH arm64-v8a)
endif()
  • 在編譯時需要指出該文件的所在路徑,以便于cmake在編譯時定位到該文件。在編譯的時候需要為cmake指定參數來控制編譯目標的屬性。

(4)使用CMake進行構建,并傳遞工具鏈文件及cmake參數

# dmeo目錄下創建build目錄,用來放置cmake構建時產生的中間文件。
mkdir build && cd build

# 傳遞OHOS_STL(可選,默認就是c++_shared)、OHOS_ARCH、OHOS_PLATFORM、工具鏈文件
# CMAKE_TOOLCHAIN_FILE是ohos.toolchain.cmake具體放置的路徑
# 這一步會檢查CMakeLists.txt是否有語法錯誤
# 不要忘記在ohos.toolchain.cmake路徑后面加上 ..
cmake -D OHOS_STL=c++_shared -D OHOS_ARCH=armeabi-v7a -D OHOS_PLATFORM=OHOS -D CMAKE_TOOLCHAIN_FILE=/xxx/build/cmake/ohos.toolchain.cmake ..

cmake --build .

1、執行如下過程如下:

 #創作者激勵#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎軟件社區

2、可以注意到執行cmake --build .時會有warning: -Wunused-command-line-argument,通過在內部的CMakeLists.txt中添加如下語句消除warning。

set(CMAKE_CXX_FLAGS "-Wno-unused-command-line-argument")

 #創作者激勵#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎軟件社區

  • 注意:.c文件時是使用CMAKE_C_FLAGS,.cpp文件時是使用CMAKE_CXX_FLAGS。

3、編譯結果如下:

生成可執行文件和動態庫。

 #創作者激勵#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎軟件社區

4、要編譯靜態庫及其可執行文件,內部的CMakeLists.txt中添加如下語句

############################################################
# Create a library
############################################################

#Generate the static library from the library sources
ADD_LIBRARY(hello_static_library STATIC
Hello.cpp
)

TARGET_INCLUDE_DIRECTORIES(hello_static_library
PUBLIC
${PROJECT_SOURCE_DIR}/include
)

############################################################
# Create an executable
############################################################

# Add an executable with the above sources
ADD_EXECUTABLE(hello_static_binary
main.cpp
)

# link the new hello_library target with the hello_binary target
TARGET_LINK_LIBRARIES( hello_static_binary
PRIVATE
hello_static_library
)

編譯結果如下,生成靜態庫及其可執行文件。

 #創作者激勵#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎軟件社區

5、編譯64位的庫文件和可執行文件,OHOS_ARCH參數選擇arm64-v8a或者編譯時不傳遞該參數。

(5)使用CMake進行構建,選擇ninja生成器并生成編譯流程圖

1、執行cmake -G查看linux環境下的生成器,ndk中自帶的生成器是Ninja。

 #創作者激勵#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎軟件社區

2、使用CMake進行構建時添加上-G “Ninja”。

 #創作者激勵#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎軟件社區

第一步:mkdir build && cd build

第二步:cmake -G "Ninja" -D OHOS_STL=c++_shared -D OHOS_ARCH=armeabi-v7a -D OHOS_PLATFORM=OHOS -D CMAKE_TOOLCHAIN_FILE=/xxx/build/cmake/ohos.toolchain.cmake ..

第三步:cmake --build .或者ninja -f build.ninja

執行完第二步后,build目錄下會生成build.ninja,有了build.ninja可以使用ninja生成程序的編譯流程圖。

3、使用ninja工具生成庫文件和可執行文件的編譯流程圖。

# 將libhello_shared_library.so動態庫的編譯流程轉為dot
ninja -t graph libhello_shared_library.so > xxx.dot

# 將dot格式轉化為png格式的流程圖
dot -T png xxx.dot -o libhello_shared_library.so.png
# 將dot格式轉化為svg格式的流程圖
dot -T svg xxx.dot -o libhello_shared_library.so.svg

 #創作者激勵#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎軟件社區

如果生成圖片格式太小的話,可以生成svg格式到瀏覽器打開,這一點很重要,請參考該 issue。

(6)使用NDK中的cmake-gui進行圖形化操作編譯

1、native/build-tools/cmake/bin目錄有cmake-gui,可以用它圖形化傳入編譯參數進行編譯。

 #創作者激勵#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎軟件社區

2、首先點擊Where is source code行的Browser Source,加載工程所在目錄。再點擊Where to build the binarys行的Browser Source,加載點擊“Where is source code”行的Browser Source,加載源碼所在目錄。點擊“Where to build the binarys行的Browser Source,加載工程所在目錄下的build目錄(沒有就創建一個)。

3、點擊Add Entry傳入cmake 參數。勾選把旁邊的Grouped選項。

 #創作者激勵#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎軟件社區

4、點擊Configure選擇Current Generator生成器為Unix Makefiles。

5、最后打開Where to build the binarys加載構建目錄終端,執行make -j 8命令。

make -j n含義是 讓make最多允許n個編譯命令同時執行,這樣可以更有效的利用CPU資源。假設系統cpu是12核,在不影響其他工作的情況下,我們可以make -j 12將cpu資源充分利用起來,一般來說,最大并行任務數為cpu_num * 2。

 #創作者激勵#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎軟件社區

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2023-03-16 15:37:48

像素密度觸覺智能

2023-03-03 21:36:02

鴻蒙操作系統

2022-04-25 09:10:50

RK3568鴻蒙

2023-02-10 15:34:45

Node.jsN-API組件

2023-03-07 15:54:45

鴻蒙Mesa庫

2023-11-24 09:48:29

C++鴻蒙

2023-08-18 14:34:09

HDF驅動框架

2023-03-13 11:58:03

拓撲架構模塊

2023-08-08 14:26:59

開源開發板鴻蒙

2024-05-14 08:33:57

Native API鴻蒙工具

2021-09-08 15:23:51

鴻蒙HarmonyOS應用

2023-05-15 15:27:20

鴻蒙智能開發套件

2023-05-26 16:01:32

驅動開發鴻蒙

2023-05-08 15:48:13

智能音箱鴻蒙

2022-05-23 10:45:34

DAYU200鴻蒙

2024-03-04 15:06:38

鴻蒙智能教室應用開發

2022-03-17 15:55:19

播放數字音頻解碼鴻蒙

2023-01-13 16:54:38

2022-10-08 16:19:40

智能喂食器鴻蒙

2022-01-26 15:07:04

bytrace工具OpenHarmon
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人午夜影院 | 日韩毛片免费视频 | 亚洲精品乱码久久久久久黑人 | www.中文字幕.com | 爱爱免费视频 | 久久精品一级 | 中文字幕亚洲专区 | 婷婷去俺也去 | 国产精品高清在线 | 亚洲va在线va天堂va狼色在线 | 亚洲视频在线观看一区二区三区 | 久久国产一区二区 | 亚洲国产一区二区三区在线观看 | 久久综合欧美 | 射欧美 | 国产精品视频一二三区 | 国产成人一区在线 | 欧美一级电影免费 | 欧美日韩国产中文 | 视频精品一区二区三区 | 一区中文字幕 | av手机在线免费观看 | 天天操夜夜操 | 91在线免费视频 | 精品免费国产一区二区三区四区介绍 | 免费黄色录像视频 | 天天拍天天插 | 日本免费黄色一级片 | 亚洲成人黄色 | 免费观看a级毛片在线播放 黄网站免费入口 | 美国av毛片 | 欧美国产精品一区二区三区 | 日日夜夜精品免费视频 | 欧美一区二区三区在线视频 | 国产激情毛片 | 午夜小视频在线播放 | 日本三级网址 | 成人免费视频观看视频 | 伊人狠狠| 欧美精品一区二区在线观看 | 国产精品亚洲精品日韩已方 |