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

news2024/11/27 0:34:40

前言:

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_END

static 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.coloradmin.cn/o/1578337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.SpringBoot利用Thymeleaf实现页面的展示

什么是Thymeleaf&#xff1f; Thymeleaf是一个现代服务器端Java模板引擎&#xff0c;适用于Web和独立环境&#xff0c;能够处理HTML&#xff0c;XML&#xff0c;JavaScript&#xff0c;CSS甚至纯文本。 Thymeleaf的主要目标是提供一种优雅且高度可维护的模板创建方式。为实现这…

HarmonyOS4.0模拟器安装

我们也可以利用设备模拟器来查看更真实的效果。不过需要先配置模拟器。 首先&#xff0c;选择主菜单中的Tools&#xff0c;找到其中的Device Manager&#xff0c;即设备管理&#xff1a; 安装设备 设备可以是远端设备&#xff0c;也可以是本地设备&#xff0c;我们可以先安装…

面试总结------2024/04/04---项目

1.面试官提问&#xff1a;你说你在项目中使用springsecurity jwt 实现了登录功能&#xff0c;能简单讲一下怎么实现的吗&#xff1f; 2.使用RabbitMQ实现订单超时取消功能 redis实现的劣势 订单状态定义 首先&#xff0c;我们需要定义订单的不同状态。在这个示例中&#xf…

c++的学习之路:18、容器适配器与反向迭代器

摘要 本文有可能讲的不是特别清楚&#xff0c;我也是初学者有的理解可能有偏差欢迎指出&#xff0c;文章末附上导图。 目录 摘要 一、什么是适配器 二、STL标准库中stack和queue的底层结构 三、deque 1、deque的原理介绍 2、deque的缺陷 四、反向迭代器 五、思维导图…

Java设计模式—策略模式(商场打折)

策略这个词应该怎么理解&#xff0c;打个比方说&#xff0c;我们出门的时候会选择不同的出行方式&#xff0c;比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等&#xff0c;这些出行方式&#xff0c;每一种都是一个策略。 再比如我们去逛商场&#xff0c;商场现在正在搞活动&…

STC89C52学习笔记(二)

STC89C52学习笔记&#xff08;二&#xff09; 综述&#xff1a;本文简要介绍了51单片机以及示例了如何成功创建并运行一个程序&#xff08;点亮一个LED&#xff09;。 一、单片机介绍 单片机简称MCU&#xff0c;MCUCPURAMROM定时器中断系统通讯协议等单片机任务是信息采集、…

Astra深度相机在Ubuntu18.04系统下实现相机标定

问题&#xff1a; 当使用Astra相机的启动的指令启动相机后&#xff0c;使用rviz查看相机所发布的rgb数据时&#xff0c;在终端会出现如下的提示信息&#xff1a; Camera calibration file /home/car/.ros/camera_info/rgb_Astra_Orbbec.yaml not found. Camera calibration fil…

三星:HBM4的16层堆叠技术验证成功

随着人工智能、大数据分析、云计算及高端图形处理等领域对高速、高带宽存储需求的激增&#xff0c;下一代高带宽内存&#xff08;High Bandwidth Memory, HBM&#xff09;——HBM4已成为全球存储芯片巨头三星、SK海力士和美光竞相追逐的技术高地。 随着AI、机器学习以及高性能…

【JavaWeb】Day38.MySQL概述——数据库设计-DQL

数据库设计——DQL 介绍 DQL英文全称是Data Query Language(数据查询语言)&#xff0c;用来查询数据库表中的记录。 查询关键字&#xff1a;SELECT 查询操作是所有SQL语句当中最为常见&#xff0c;也是最为重要的操作。在一个正常的业务系统中&#xff0c;查询操作的使用频次…

植物糖基转移酶数据库-23年-地表最强系列-文献精读-6

pUGTdb: A comprehensive database of plant UDP-dependent glycosyltransferases pUGTdb&#xff1a;植物UDP依赖糖基转移酶的全面数据库 一篇关于植物糖基转移数据库的综述&#xff0c;地表最强&#xff0c;总结的最全面的版本之一&#xff0c;各位看官有推荐请留言评论区~…

ML Kit:通过Mendix 集成人脸识别算法

预训练模型是一种已经使用训练数据集进行训练并包含执行模型所需所有参数的机器学习模型。这类模型常用于计算机视觉领域&#xff0c;比如可以在Mendix Studio Pro中导入ONNX模型后&#xff0c;可以在微流程中执行该模型。 本文讲述如何在Mendix应用程序中集成特定的人脸检测模…

fakebook-攻防世界

题目 先目录扫描一下 dirseach 打开flag.php是空白的 访问robots.txt,访问user.php.bak <?php class UserInfo { public $name ""; public $age 0; public $blog ""; public function __construct($name, $age, $blog) { …

缓存雪崩以及解决思路

缓存雪崩&#xff1a;缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 解决方案&#xff1a; 给不同的Key的TTL添加随机值 利用Redis集群提高服务的可用性 给缓存业务添加降级限流策略 给业务…

6.10物联网RK3399项目开发实录-驱动开发之SPI接口的使用(wulianjishu666)

嵌入式实战开发例程&#xff0c;珍贵资料&#xff0c;开发必备&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1149x7q_Yg6Zb3HN6gBBAVA?pwdhs8b SPI 使用 SPI 简介 SPI 是一种高速的&#xff0c;全双工&#xff0c;同步串行通信接口&#xff0c;用于连接微控制器、…

【CTF】rip--堆栈的简单认识

前言 最近在学二进制&#xff0c;准备拿BUUCTF的pwn试试手&#xff0c;还在摸索的阶段&#xff0c;有什么思路出错的地方还请指出。 解题思路 下载文件到kali&#xff0c;查看文件为 64-bit的ELF&#xff08;ELF为Linux下的可执行文件&#xff0c;相当于Windows的exe&#xff0…

ES6-数组、对象、函数扩展、Symbol

01- let声明变量 块级作用域 var是全局变量&#xff0c;let只作用于块级作用域内 每一次都是让一个新的i的值没有被释放掉不允许重复声明变量不提升&#xff08;声明没有提前&#xff09;暂存性死区不与顶层对象挂钩 02-const常量 常量必须初始化&#xff0c;初始化以后就不…

Linux addr2line介绍

打开linux调试选项 嵌入式 linux 经常要编译 linux 内核&#xff0c;默认情况下编译出的内核镜像是不带调试信息的&#xff0c;这样&#xff0c;当内核 crash 打印 PC 指针和堆栈信息时&#xff0c;我们需要反汇编来确认出错位置&#xff0c;不直观。 如果内核开启了调试选项&…

HarmonyOS实战开发-如何实现跨应用数据共享实例。

介绍 本示例实现了一个跨应用数据共享实例&#xff0c;分为联系人&#xff08;数据提供方&#xff09;和联系人助手&#xff08;数据使用方&#xff09;两部分&#xff1a;联系人支持联系人数据的增、删、改、查等功能&#xff1b;联系人助手支持同步联系人数据&#xff0c;当…

动态支付策略:Go 语言中策略模式的妙用

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 在现代软件架构中&#xff0c;支付功能是不可或缺的一环。无论是在线购物还是虚拟服务&#xff0c;支付策略的选择直接影响用户体…

GitHub教程:最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程)

&#x1f42f; GitHub教程&#xff1a;最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程) &#x1f4c1; 文章目录 &#x1f42f; GitHub教程&#xff1a;最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图…