自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

??想了解更多關(guān)于開源的內(nèi)容,請?jiān)L問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

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

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

一、OpenHarmony NDK

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

二、獲取NDK的方式

1、從每日構(gòu)建中獲取

每日構(gòu)建地址: http://ci.openharmony.cn/dailys/dailybuilds。

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

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

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

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

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

安裝編譯SDK需要的依賴包(編譯鏡像的時(shí)候是不依賴這些包的)
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

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

 #創(chuàng)作者激勵(lì)#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎(chǔ)軟件社區(qū)

二、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 內(nèi)部的已經(jīng)包含的庫和對應(yīng)的頭文件
├── ndk_system_capability.json ---->NDK自帶so庫能力描述文件
├── nativeapi_syscap_config.json ---->調(diào)用NDK自帶so庫能力相關(guān)頭文件
├── docs ---->調(diào)用NDK自帶so庫能力相關(guān)文檔
└── 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編譯庫文件和可執(zhí)行文件

1、使用NDK編譯一個(gè)簡單demo

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

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

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

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

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

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

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

# 使用指定的源文件main.cpp創(chuàng)建出一個(gè)可執(zhí)行文件hello_shared_binary
ADD_EXECUTABLE(hello_shared_binary
main.cpp
)

#TARGET_LINK_LIBRARIES指令的作用為將目標(biāo)文件與庫文件進(jìn)行鏈接
#將可執(zhí)行文件hello_shared_binary與庫文件hello::library進(jìn)行鏈接
TARGET_LINK_LIBRARIES( hello_shared_binary
PRIVATE
hello::library
)

3、進(jìn)行cmake編譯

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

1、第一種方法:

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

2、第二種方法:

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

3、查看環(huán)境變量添加是否成功。

cmake -version

 #創(chuàng)作者激勵(lì)#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎(chǔ)軟件社區(qū)

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

(2)安裝make

如果沒有安裝make會(huì)出現(xiàn)以下報(bào)錯(cuò),則執(zhí)行sudo apt-get install make。(如果已經(jīng)安裝make,請忽略)。

(3)cmake的幾個(gè)參數(shù)

1、OHOS_STL參數(shù),其類型可以是c++_shared和c++_static,默認(rèn)是c++_shared。

 #創(chuàng)作者激勵(lì)#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎(chǔ)軟件社區(qū)

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

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

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

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

  • build目錄中的工具鏈文件ohos.toolchain.cmake,cmake編譯時(shí)需要讀取該文件中的默認(rèn)值,比如編譯器的選擇、編譯平臺(tái),例如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()
  • 在編譯時(shí)需要指出該文件的所在路徑,以便于cmake在編譯時(shí)定位到該文件。在編譯的時(shí)候需要為cmake指定參數(shù)來控制編譯目標(biāo)的屬性。

(4)使用CMake進(jìn)行構(gòu)建,并傳遞工具鏈文件及cmake參數(shù)

# dmeo目錄下創(chuàng)建build目錄,用來放置cmake構(gòu)建時(shí)產(chǎn)生的中間文件。
mkdir build && cd build

# 傳遞OHOS_STL(可選,默認(rèn)就是c++_shared)、OHOS_ARCH、OHOS_PLATFORM、工具鏈文件
# CMAKE_TOOLCHAIN_FILE是ohos.toolchain.cmake具體放置的路徑
# 這一步會(huì)檢查CMakeLists.txt是否有語法錯(cuò)誤
# 不要忘記在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、執(zhí)行如下過程如下:

 #創(chuàng)作者激勵(lì)#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎(chǔ)軟件社區(qū)

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

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

 #創(chuàng)作者激勵(lì)#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎(chǔ)軟件社區(qū)

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

3、編譯結(jié)果如下:

生成可執(zhí)行文件和動(dòng)態(tài)庫。

 #創(chuàng)作者激勵(lì)#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎(chǔ)軟件社區(qū)

4、要編譯靜態(tài)庫及其可執(zhí)行文件,內(nèi)部的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
)

編譯結(jié)果如下,生成靜態(tài)庫及其可執(zhí)行文件。

 #創(chuàng)作者激勵(lì)#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎(chǔ)軟件社區(qū)

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

(5)使用CMake進(jìn)行構(gòu)建,選擇ninja生成器并生成編譯流程圖

1、執(zhí)行cmake -G查看linux環(huán)境下的生成器,ndk中自帶的生成器是Ninja。

 #創(chuàng)作者激勵(lì)#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎(chǔ)軟件社區(qū)

2、使用CMake進(jìn)行構(gòu)建時(shí)添加上-G “Ninja”。

 #創(chuàng)作者激勵(lì)#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎(chǔ)軟件社區(qū)

第一步: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

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

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

# 將libhello_shared_library.so動(dòng)態(tài)庫的編譯流程轉(zhuǎn)為dot
ninja -t graph libhello_shared_library.so > xxx.dot

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

 #創(chuàng)作者激勵(lì)#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎(chǔ)軟件社區(qū)

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

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

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

 #創(chuàng)作者激勵(lì)#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎(chǔ)軟件社區(qū)

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

3、點(diǎn)擊Add Entry傳入cmake 參數(shù)。勾選把旁邊的Grouped選項(xiàng)。

 #創(chuàng)作者激勵(lì)#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎(chǔ)軟件社區(qū)

4、點(diǎn)擊Configure選擇Current Generator生成器為Unix Makefiles。

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

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

 #創(chuàng)作者激勵(lì)#[觸覺智能RK3568]OpenHarmony NDK工具(上)-開源基礎(chǔ)軟件社區(qū)

??想了解更多關(guān)于開源的內(nèi)容,請?jiān)L問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

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

責(zé)任編輯:jianghua 來源: 51CTO 開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2023-03-16 15:37:48

像素密度觸覺智能

2023-03-03 21:36:02

鴻蒙操作系統(tǒng)

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驅(qū)動(dòng)框架

2023-03-13 11:58:03

拓?fù)?/a>架構(gòu)模塊

2023-08-08 14:26:59

開源開發(fā)板鴻蒙

2024-05-14 08:33:57

Native API鴻蒙工具

2021-09-08 15:23:51

鴻蒙HarmonyOS應(yīng)用

2023-05-15 15:27:20

鴻蒙智能開發(fā)套件

2022-05-23 10:45:34

DAYU200鴻蒙

2023-05-26 16:01:32

驅(qū)動(dòng)開發(fā)鴻蒙

2023-05-08 15:48:13

智能音箱鴻蒙

2024-03-04 15:06:38

鴻蒙智能教室應(yīng)用開發(fā)

2022-03-17 15:55:19

播放數(shù)字音頻解碼鴻蒙

2022-01-26 15:07:04

bytrace工具OpenHarmon

2023-02-20 15:29:14

分布式相機(jī)鴻蒙

2022-10-08 16:19:40

智能喂食器鴻蒙
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號