鸿蒙Native输出so动态库,并提供给第三方导入使用

前言:

DevEco Studio版本:4.0.0.600

API:9

最近在学习鸿蒙的Native输出so动态库,下面就给大家分享下我的学习心得及在实现过程中遇到的问题。

实现需求:通过so库输出文本内容 “你好,鸿蒙!”

参考资料:OpenHarmony Native API

实现过程:

1、创建Native工程

File-->New-->create Project,选择Native C++项目

正常点击Finish后,在项目中会自动生成一个示例模板代码,hello.cpp

2、创建C++文件,实现需求

我们有两种方式,一个是直接修改模板hell0.cpp,另外一种是自己新建一个.cpp文件。这边以新建方式来实现。

在cpp目录右键新建c++文件

show.cpp代码实现:(C代码能力有限,只能参考hello.cpp写个简单的文本输出!!!)

#include "napi/native_api.h"
#include <string.h>static napi_value show(napi_env env, napi_callback_info info) {char *returnStr = "你好 鸿蒙!";napi_value result;napi_create_string_utf8(env, returnStr, strlen(returnStr), &result);return result;
}EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports) {napi_property_descriptor desc[] = {{"show", NULL, show, NULL, NULL, NULL, napi_default, NULL}};napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);return exports;
}
EXTERN_C_ENDstatic napi_module demoModule = {.nm_version = 1,.nm_flags = 0,.nm_filename = NULL,.nm_register_func = Init,.nm_modname = "cjson",.nm_priv = ((void *)0),.reserved = {0},
};extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }

3、CMakeLists.txt中添加对show.cpp的引用

# the minimum version of CMake.
cmake_minimum_required(VERSION 3.4.1)
project(NativeShow)set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})include_directories(${NATIVERENDER_ROOT_PATH}${NATIVERENDER_ROOT_PATH}/include)#add_library(entry SHARED hello.cpp)
#target_link_libraries(entry PUBLIC libace_napi.z.so)add_library(show SHARED show.cpp)
target_link_libraries(show PUBLIC libace_napi.z.so)

4、编译并导出so库

执行build-->build Hap,进行编译

然后在build--> intermediates --> libs -->default中可以看到arm64-v8a、armeabi-v7a、x86_64这三个默认的架构。

可以在项目的build-profile.json5中添加abiFilters输出的架构

"abiFilters": ['armeabi-v7a','arm64-v8a'
]

重新执行build-->build Hap

5、在第三方应用中引用

新建一个应用,并在entry目录下新建libs目录,将上一步中的so库拷贝到新建的libs中

在index.ets中添加使用

import show from 'libshow.so'@Entry
@Component
struct Index {@State message: string = 'Hello World';aboutToAppear(){this.message = show.show()}build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)}.width('100%')}.height('100%')}
}

效果:

实现中遇到的坑:

1、libc++_shared.so没有导入,引起的‘undefined’错误

libc++_shared是C++运行时库,因此必须要引入。

2、so库架构放置错误,引起的‘undefined’错误

测试中,我在分开测试arm64-v8a、armeabi-v7a时误将v8a的so复制到v7a中进行使用导致。因此在实际使用中,尽量连带着文件夹目录一起拷贝避免出现目录放置错误的情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/601944.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络基础(一)

目录 一.互联网和因特网 二.因特网的发展历程 三.因特网的功能 3.1边缘部分 3.1.1&#xff1a;客户服务器方式&#xff08;C/S方式&#xff09; 3.1.2&#xff1a;对等方式 3.2.核心部分 3.2.1&#xff1a;电路交换 3.2.2.报文交换 3.2.3&#xff1a;分组交换 四.计…

matlab学习001-简单的矩阵输入及绘制信号曲线

目录 1&#xff0c;熟悉简单的矩阵输入 1.1&#xff0c;创建矩阵 1.2&#xff0c;在命令行调用文件中的变量 1.3&#xff0c;ones函数 1.4&#xff0c;who和whos的使用 2&#xff0c;绘制信号曲线 2.1&#xff0c;实指数信号 2.2&#xff0c;频率为50Hz的周期方波信号…

红米K60更换后摄镜片

红米K60更换后摄镜片 拆后盖&#xff1a; 热风枪80加热后盖四周边缘&#xff0c;摸起来烫手即可&#xff0c;用刀片翘起后盖 注意&#xff1a;要从上下边缘翘&#xff0c;不要伤到侧键排线&#xff0c;侧键排线在左侧边缘靠上的位置&#xff08;手机屏幕朝下&#xff09;&…

CKA 基础操作教程(二)

Kubernetes Deployment 理论学习 Kubernetes Deployment &#xff08;部署&#xff09;是一种 Kubernetes 资源对象&#xff0c;用于定义和管理容器化应用程序的部署和更新。Deployment 提供了一种声明性的方式来定义应用程序的期望状态&#xff0c;并负责确保所需数量的 Pod…

【计算机毕业设计】校园论坛系统——后附系统源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

Open CASCADE学习|平面上的PCurve

曲面上的曲线PCurve&#xff0c;字面上理解即为参数曲线(Parametric Curve)。在几何建模中&#xff0c;PCurve通常被描述为附加在参数曲面之间公共边上的数据结构。从更具体的定义来看&#xff0c;当给定一个曲面方程&#xff0c;并且其参数u和v是另一个参数t的函数时&#xff…

第8章 数据集成和互操作

思维导图 8.1 引言 数据集成和互操作(DII)描述了数据在不同数据存储、应用程序和组织这三者内部和之间进行移动和整合的相关过程。数据集成是将数据整合成物理的或虚拟的一致格式。数据互操作是多个系统之间进行通信的能力。数据集成和互操作的解决方案提供了大多数组织所依赖的…

Dubbo 服务发现

Dubbo 服务发现 1、什么是服务发现 **服务发现&#xff08;Service discovery&#xff09;**是自动检测一个计算机网络内的设备及其提供的服务。 2、Dubbo 与 服务发现 Dubbo 提供的是一种 Client-Based 的服务发现机制&#xff0c;依赖第三方注册中心组件来协调服务发现过…

【Web】纯萌新的BUUCTF刷题日记Day1

目录 [RoarCTF 2019]Easy Java [网鼎杯 2018]Fakebook [CISCN2019 华北赛区 Day2 Web1]Hack World [BJDCTF2020]The mystery of ip [网鼎杯 2020 朱雀组]phpweb [BSidesCF 2020]Had a bad day [BJDCTF2020]ZJCTF&#xff0c;不过如此 [BUUCTF 2018]Online Tool [GXYCTF…

面试算法-153-旋转图像

题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,…

20240408在全志H3平台的Nano Pi NEO CORE开发板的eMMC刷Ubuntu Core 16.04

20240408在全志H3平台的Nano Pi NEO CORE开发板的eMMC刷Ubuntu Core 16.04 2024/4/8 20:46 参考资料&#xff1a; https://wiki.friendlyelec.com/wiki/index.php/NanoPi_NEO_Core/zh#.E5.AE.89.E8.A3.85.E7.B3.BB.E7.BB.9F [ OK ] Created slice Slice /system/getty. [ …

还不了解 Dockerfile 的同学不是好测试人

前言&#xff1a;近年来 Docker 非常火&#xff0c;想要玩好 Docker 的话 Dockerfile 是绕不开的&#xff0c;这就好比想要玩好 Linux 服务器绕不开 shell 道理是一样的。 今天我们就来聊一聊 Dockerfile 怎么写&#xff0c;那些指令到底是什么意思。 一、先来看一个简单的 D…