初級必備的知識: NDK開發在什么時候用?
答::NDK 開發在幫助應用提升性能的情況下使用,比如游戲開發,和硬件交互的場景中。
還有一個公司已經有標準的C或C++庫,不想在開發ArkTS的代碼前提下。
開發NDK必須要了解的基礎知識從低到高一步一步了解
第一:NDK 開發的基礎調用流程。
NDK 開發是基于C/c++ 的開發工程,因此項目中會存在c++/c代碼,因此項目存在entry工程中的ArkTS調用C/c++ 代碼的情況。也有c/c++ 調用ArkTS的情況(進階版本 hap 包里面的C調用hsp/har包中的c/ArkTS)
第二:實現以上的內容需要用到什么技術?
答: 要想實現以上的技術需要使用到Node-API
曾用名NAPI,是HarmonyOS中提供ArkTS/JS與C/C++跨語言調用的接口,是NDK接口中的一部分。該接口是在Node.js提供的Node-API基礎上擴展而來,但與Node.js中的Node-API不完全兼容。
第三:在鴻蒙中如何實現NDK 的開發
hap的創建流程:
如果當前未打開任何工程,可以在DevEco Studio的歡迎頁,選擇Create Project開始創建一個新NDK工程。
如果已經打開了工程,可以在菜單欄選擇File > New > Create Project來創建一個新NDK工程。
根據工程創建向導,選擇Native C++工程模板,然后單擊Next。
hsp/har包的創建需要在創建包含c代碼(NDK開發)的時候,需要在創建頁面,將這個勾選
創建成功以后工程目錄下的nain 下面包含一個cpp目錄,就是用來開發NDK代碼的
第三:如何構建NDK 工程:
答;使用CMake命令的方式(我不會)
可以使用項目中的CMake配置腳本,在上面的圖片中cpp目錄下有一個CMakeLists.txt 這個文件就是配置腳本文件。在NDK 項目創建的時候會有默認的腳本,具體含義如下:
# the minimum version of CMake.
cmake_minimum_required(VERSION 3.5.0)#這個CMake的版本號。2025年7月12默認是3.50
project(MyApplication) #工程的名字,不是庫的名字哦
定義一個變量,并賦值為當前模塊cpp目錄
set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})#如果你需要引入其他的so包,以當前的這個目錄為準,向上找比如:
set(TSE_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}…/…/…/oh_modules/libtest/abc)
添加頭文件.h目錄,包括cpp,cpp/include,告訴cmake去這里找到代碼引入的頭文件
include_directories(${NATIVERENDER_ROOT_PATH}
${NATIVERENDER_ROOT_PATH}/include
${TSE_ROOT_PATH}/include)# 這個是基于剛才加的abc那個目錄下有一個頭文件,所以添加這個變量
聲明一個產物libentry.so,SHARED表示產物為動態庫,hello.cpp為產物的源代碼
add_library(entry SHARED hello.cpp)# 這個地方可以將你要寫的源代碼編譯到對應的庫里面,有多個文件的時候可以這樣添加
add_library(entry SHARED hello.cpp hello1.cpp hello2.cpp)
聲明產物entry鏈接時需要的三方庫libace_napi.z.so
這里直接寫三方庫的名稱是因為它是在ndk中,已在鏈接尋址路徑中,無需額外聲明
target_link_libraries(entry PUBLIC libace_napi.z.so) #這個是鏈接三方庫,如果有多個的情況可以這樣添加,這個了還有幾種情況 1 如果是一個項目中,其他模塊的so庫 2 entry模塊下entry/libs/arm64-v8a/目錄下有so庫
第一個實現方案是:
target_link_libraries(entry PUBLIC libace_napi.z.so 模塊名字:: 編譯的庫名字)
如:target_link_libraries(entry PUBLIC libace_napi.z.so libhsp::libhsp)
第二個實現方案是
target_link_libraries(entry PUBLIC libace_napi.z.so 模塊名字:: 編譯的庫名字)
第四:構建NDK 工程需要在build-profile.json5 中配置什么
externalNativeOptions
模塊級build-profile.json5中externalNativeOptions參數是NDK工程C/C++文件編譯配置的入口,可以通過path指定CMake腳本路徑、arguments配置CMake參數、cppFlags配置C++編譯器參數、abiFilters配置編譯架構等。
“apiType”: “stageMode”,
“buildOption”: {
“arkOptions”: {
},
“externalNativeOptions”: {
“path”: “./src/main/cpp/CMakeLists.txt”,
“arguments”: “”,
“cppFlags”: “”,
“abiFilters”: [
“arm64-v8a”,
“x86_64”
],
}
}