openharmony napi调试笔记

一、动态库的编译

第一种openharmony交叉编译链配置方法

使用的编译环境是ubuntu20.04

1、使用vscode配置openharmony sdk交叉编译环境

首先下载openharmony的sdk,如native-linux-x64-4.1.7.5-Release.zip

解压后native目录下就是交叉编译用的sdk

  1. 在要编译的源代码目录下新建.vscode目录,进入该目录新建settings.json文件文件内容如下,根据自己的sdk目录修改cmake的路径

{

"cmake.cmakePath":"/home/xxx/native/build-tools/cmake/bin/cmake"

}

2、在vscode中也需要安装cmake插件

3、在插件中配置交叉编译器

打开cmake-tools-kits.json文件:

vim .local/share/CMakeTools/cmake-tools-kits.json

这个文件的作用就是:告诉VSCode当前系统中都有哪些编译器可供使用,一般是CMakeTools插件自动获取到的,但是CMakeTools插件无法自动获取到我们的交叉编译器。

所以我们手动将交叉编译器添加到cmake-tools-kits.json文件中(必须添加到文件末尾),因为我们使用的是CMake,所以只需将toolchain.cmake文件的路径配置进去就可以了:

{

"name": "arm_corss_compiler",

"toolchainFile": "/home/fhc/myWorkspace/cmake_project/cmake_cross_complie_base/toolchain.cmake"

}

4、Ctrl+Shift+p打开VSCode的指令面板,然后输入cmake:q,VSCode会根据输入自动提示,然后选择

CMake: Quick Start

5、然后选择我们自己配置的交叉编译器

6、编写cmake文件

cmake_minimum_required(VERSION 3.5.0)

project(TESTLIB VERSION 0.1.0 LANGUAGES C CXX)

set(ROOTDIR ..) #设置变量

set(SRCDIR ${ROOTDIR}/src)

include_directories(${SRCDIR} ${SRCDIR}/..) #设置头文件搜索路径

aux_source_directory(${SRCDIR}/src CPP_SRC)

aux_source_directory(${SRCDIR}/others CPP_SRC) #将目录下的所有源文件包含变量CPP_SRC

add_library(TESTLIB SHARED ${CPP_SRC}) #设置库名称位TESTLIB 包含的源文件:CPP_SRC

set(LIBRARY_OUTPUT_PATH ${ROOTDIR}/../Lib/linuxLib) #设置库的导出目录

target_link_libraries(TESTLIB PUBLIC ${PROJECT_BINARY_DIR}/../../Lib/linuxLib/libusb_shared.z.so) #设置需要依赖的库

7、点击左下脚的build按钮

第二种、vscode安装及openharmony交叉编译链配置方法

sudo apt update

sudo snap install --classic code

安装cmake插件

安装cmake tools插件

mkdir .vscode

cd .vscode

vi setting.json

输入

{

"cmake.cmakePath":"/home/{你的用户名}/native/build-tools/cmake/bin/cmake"

"cmake.configureArgs": [

"-DOHOS_ARCH=armeabi-v7a",

"-DCMAKE_TOOLCHAIN_FILE=/home/{你的用户名}/native/build/cmake/ohos.toolchain.cmake",

]

}

其中的目录使用自己的工具链保存目录

进入工程所在目录

打开控制台

输入code . 打开vscode

在vscode中按下键盘的 ctrl+shift+p

在指令窗口输入cmake

选择quick statrt

根据提示输入工程名称和等设置

点击vscode界面左侧的extensions按钮,找到安装好的CMake Tools,点击右下角的齿轮设置按钮,在下拉菜单中选择settings在弹出的窗口中添加Additional compiler search dirs和Additional kits路径设置为鸿蒙sdk目录下的 native/llvm/bin 这样CMakeTools就可以搜索到sdk的交叉编译联工具了。

在vscode中按下键盘的 ctrl+shift+p 在命令窗口中输入cmake 选择select a kit

如果下面没有native下的交叉编译链就点击第一个多扫描几次。

刚才的CMake插件的quickstatrt已经创建好了cmake文件,在cmake文件中按需修改配置,点击左下角的build按钮即可完成编译

二、openharnony应用调用动态库

1、安装 deveco studio 4.1或5.0,5.0目前编译的时候不能只编译32位版本,不知道为什么,如果编译一个需要在cmake中做条件编译和依赖。比如:

复制代码
if(OHOS_ARCH STREQUAL armeabi-v7a)
复制代码
add_library(entry SHARED napi_init.cpp)

else()

add_library(entry SHARED napi_init_64.cpp)

endif()

2、修改 build-profile.json5 文件中的products目录,以下是5.0版本的

复制代码
"products": [
  {
    "name": "default",
    "signingConfig": "default",
    "compileSdkVersion": 11,
    "compatibleSdkVersion": 11,
    "runtimeOS": "OpenHarmony",
    "buildOption": {
      "externalNativeOptions": {
        "abiFilters": [
          "armeabi-v7a",
          "arm64-v8a"
        ]
      },
      "strictMode": {
        "caseSensitiveCheck": true,
      }
    }
  }
],

3、按官网的教程把so库和头文件放入相应的目录。

4、最后应用打开以后一调用napi可能会闪退,检查日志看是否有依赖的库没有放到目录中,可以使用needed by进行关键字筛选。

5、如果打开应用后界面显示不正常,只有应用图标,检查日志看是否有其他问题。可能需要修改动态库的源码,重新编译动态库。

6、如果涉及到一些硬件操作可能会打不开设备,需要修改设备的操作权限,比如usb设备可以使用下面的指令

chmod -R 777 /dev/bus/usb/

7、添加日志

在cmake文件中添加hilog的依赖库

复制代码
target_link_libraries(entry PUBLIC libace_napi.z.so  libhilog_ndk.z.so)

在cpp文件中添加头文件

复制代码
#include "hilog/log.h"

日志函数用法

复制代码
OH_LOG_Print(LOG_APP,LOG_INFO, LOG_PRINT_DOMAIN,"Init","uvc open fail%{public}d",res);

8、智能指针

如果代码中用到智能指针编译可能有如下报错

ld.lld: error: undefined symbol: std::__n1::__shared_weak_count::__release_weak() >>> referenced by shared_ptr.h:216 (G:/RK3568/openharmony/SDK/11/native/llvm/bin/../include/libcxx-ohos/include/c++/v1/__memory/shared_ptr.h:216) >>> CMakeFiles/entry.dir/napi_init.cpp.o:(std::__n1::__shared_weak_count::__release_shared[abi:v15004]())

解决方法:在cmake中添加依赖库 libc++_shared.so

复制代码
target_link_libraries(entry PUBLIC ${NATIVERENDER_ROOT_PATH}/../../../libs/${OHOS_ARCH}/libc++_shared.so)

9、添加编译参数

在项目的entry目录下的build-profile.json5中有相关的内容

复制代码
"buildOption": {
  "externalNativeOptions": {
    "abiFilters": [
      "armeabi-v7a",
      "arm64-v8a"
    ],
    "path": "./src/main/cpp/CMakeLists.txt",
    "arguments": "",            //cmake参数
    "cppFlags": "-std=c++11"    //编译器参数
  }
},
相关推荐
Lostgreen12 分钟前
分布式查询处理优化之数据分片
大数据·笔记·分布式
hillstream313 分钟前
gitlab工作笔记
笔记·gitlab
芯纪元34 分钟前
Perl编程语言简介
笔记·perl
咔叽布吉35 分钟前
【前端学习笔记】AJAX、axios、fetch、跨域
前端·笔记·学习
谢白羽2 小时前
深度神经网络模型压缩学习笔记三:在线量化算法和工具、实现原理和细节
笔记·学习·dnn
宇寒风暖2 小时前
软件工程——UML简介
笔记·学习·软件工程
@曲终3 小时前
C语言学习 12(指针学习1)
c语言·经验分享·笔记·学习
SRC_BLUE_173 小时前
[网安靶场] [更新中] UPLOAD LABS —— 靶场笔记合集
笔记
YuanLiu_2273 小时前
代码随想录算法训练营第十三天(递归遍历;迭代遍历;统一迭代;层序遍历)
java·数据结构·笔记·算法·leetcode