Android JNI系列详解之CMake编译工具的使用

一、CMake工具的介绍

如图所示,CMake工具的主要作用是,将C/C++编写的native源文件编译打包生成库文件(包含动态库或者静态库文件),集成到Android中使用。

二、CMake编译工具的使用

 使用主要是配置两个文件:CMakeList.txt和build.gradle

1、CMakeList.txt介绍

文件路径如下:

 文件默认的内容如下:(没加#号的都是配置)

cmake_minimum_required(VERSION 3.22.1)# Declares and names the project.project("testnative")# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.add_library( # Sets the name of the library.testnative# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).native-lib.cpp)# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.find_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log)# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.target_link_libraries( # Specifies the target library.testnative# Links the target library to the log library# included in the NDK.${log-lib})

1.cmake_minimum_required(VERSION 3.22.1)

表示项目支持的最低cmake工具版本是3.22.1

2.

add_library( # Sets the name of the library.testnative# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).native-lib.cpp)

表示的是添加库,定义生成的库的名称、类型、指定的源码

testnative就是指定库的名称;

SHARED就是指定生成库的类型:动态|静态;

native-lib.cpp就是要编译的源码的相对CMakeList.txt的路径,相对路径;

3.

find_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log)

表示引入库,这里是指定了ndk里面的log库,并将库的路径赋值给了log-lib变量,相当于java中定义了一个变量log-lib,值是log。

4.

target_link_libraries( # Specifies the target library.testnative# Links the target library to the log library# included in the NDK.${log-lib})

就是链接库。将特定库链接到目标库,这是是将上面定义的log-lib链接到我们的testnative,这里的${log-lib}就是将log-lib的值取出来,链接到我们的testnative,这样我们就可以使用log库了。

2、module下的build.gradle配置了CMake的介绍

文件路径如下:

 打开文件看下如下配置:

 CMake在android{}闭包中做了如下配置:

externalNativeBuild {cmake {path file('src/main/cpp/CMakeLists.txt')version '3.22.1'}}

这里这个配置,配置了CMakeList.txt文件的路径(路径是相对于项目的)和编译使用的cmake的版本。

另外我们还可以在defaultConfig闭包下配置其他信息(C/C++标准库的支持版本),如下:

 上面这个配置可以不写,使用默认的就行。以下是一个配置样例:

这里配置的C++标准库是动态类型(静态库就不需要指定),这样编译后会在build中生成一个标准库文件。

加之前的是:

加之后的是:

 这里顺便介绍一下C++标准库是什么:

 三、Android中如何生成的so库

 以上代码就能将so库加载到程序中,然后就可以调用相关的native的api,从而就基于JNI来调用so库里面的功能。

编写相关的代码:

在Java端,我们编写一个native的方法:

 对应到C/C++中的代码就是:

 Java端通过调用stringFromJNI()就能调用到C/C++端的这段代码,这就是JNI的使用。

效果:Android界面显示了C++函数中的字符串。

 

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

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

相关文章

Ansible学习笔记12

playbook: playbook(剧本):是ansible用于配置、部署和管理被控节点的剧本,用于Ansible操作的编排。 使用的是yaml格式,(saltstack、elk、docker、docker-compose、k8s都会使用到yaml格式。&am…

js对url进行编码解码(三种方式)

第一种:escape 和 unescape escape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值 它的具体规则是,除了ASCII字母、数字、标点符号" * _ - . /"以外,对其他所有字符进行编码。在u0000到u00ff之间…

【模拟】算法实战

文章目录 一、算法原理二、算法实战1. leetcode1576 替换所有的问号2. leetcode495 提莫攻击3. leetcode6 N字形变换4. leetcode38 外观数列5. leetcode1419 数青蛙 三、总结 一、算法原理 模拟就是用计算机来模拟题目中要求的操作,模拟题目通常具有代码量大、操作…

Java稀疏数组

目录 1.稀疏数组 2.稀疏数组的使用 2.1 二维数组转换为稀疏数组 2.2 稀疏数组转换为二维数组 1.稀疏数组 稀疏数组(Sparse Array):当一个数组中的大部分元素为相同的值,可使用稀疏数组来保存该数组,可以将稀疏数组…

记录--怎么实现一个3d翻书效果

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本篇主要讨论以下两种翻书动画的实现: 第一种是整页翻转的效果: 这种整页翻转的效果主要是做rotateY的动画,并结合一些CSS的3d属性实现。 第二种折线翻转的效果&…

北京筑龙受邀出席中物联“采购供应链中国行—走进雄安”活动

日前,“采购供应链中国行—走进雄安”活动在河北雄安新区成功举办,来自30家相关单位的50余名领导和代表参加了本次活动。活动由中国物流与采购联合会公共采购分会主办,中国物流与采购联合会采购委、中国雄安集团有限公司、河北雄安新区招标投…

【数据结构】二叉数的存储与基本操作的实现

文章目录 🍀二叉树的存储🌳二叉树的基本操作🐱‍👤二叉树的创建🐱‍👓二叉树的遍历🎡前中后序遍历📌前序遍历📌中序遍历📌后续遍历 🛫层序遍历&am…

商家必读:影响快递物流速度的这几个关键因素

在这个迅速发展的数字时代,消费者对于快速、高效的购物体验有着越来越高的期望。而作为商家,能否满足顾客对快递速度的要求将直接影响到商家的竞争力和业务发展。今天就和大家聊聊一个在电商行业中至关重要的话题——快递的物流速度对商家的重要性。 首…

Linux——socket网络通信

一、什么是socket Socket套接字 由远景研究规划局(Advanced Research Projects Agency, ARPA)资助加里福尼亚大学伯克利分校的一个研究组研发。其目的是将 TCP/IP 协议相关软件移植到UNIX类系统中。设计者开发了一个接口,以便应用程序能简单地…

【RuoYi移动端】uniApp导入和引用uView2.0插件

一、打开uiew官网 安装 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架uView UI,是 uni-app 生态最优秀的 UI 框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水https://uviewui.com/components/install.html 也可直…

hadoop大数据集群中更换磁盘,balance的速度缓慢问题(解决)

hadoop大数据集群中更换磁盘,balance的速度缓慢问题(解决) 看现象只有4个bloucks在执行的 调整参数: 增大配置参数,观察重新负载的速度 修改配置文件 hdfs-site.xml dfs.datanode.balance.max.concurrent.moves100 …

​iOS上架审核宝典:如何避免被拒一次提交成功

Xcode 摘要:本文整理了iOS上架需要注意的事项,以帮助从事iOS开发和App运营的朋友们避免审核被拒的困扰。通过遵循这些指南,我们可以在一次提交中成功地将应用上架,并节省宝贵的时间和精力。 引言: 从事iOS开发和App运…

【SpringBoot】最基础的项目架构(SpringBoot+Mybatis-plus+lombok+knife4j+hutool)

汝之观览,吾之幸也! 从本文开始讲下项目中用到的一些框架和技术,最基本的框架使用的是SpringBoot(2.5.10)Mybatis-plus(3.5.3.2)lombok(1.18.28)knife4j(3.0.3)hutool(5.8.21),可以做到代码自动生成,满足最基本的增删查改。 一、新…

java+ssm+mysql农场信息管理系统

项目介绍: 本系统为基于jspssmmysql的农场信息管理系统,功能如下: 用户:注册登录系统,菜地信息管理,农作物信息管理,种植信息管理,客户信息管理,商家信息管理&#xff…

一个简单的vim例子

一.欢迎来到我的酒馆 在本章节介绍vim工具。 目录 一.欢迎来到我的酒馆二.什么是vim 二.什么是vim 2.1什么是vim vim是一种Linux命令行类型 的文本编辑器。vim指的是"vi improved",意思是vi工具的升级版。vim是基于vi实现的,它提供了…

电工-照明电路施工图

照明电路施工图 上面介绍的电气照明基本电路用作施工的依据是不够的,这是因为图上并没有注明电气元件的规格、型号、安装要求、线路敷设方式以及其他一些特征。作为实际电路安装的依据,必须是根据国家颁布的有关电器技术标准和统一符号绘制的施工图。照…

文本匹配实战系列

引言 本系列文章开始介绍深度学习在文本匹配领域的应用,并且会尝试得到各种模型在给定的数据集上的表现。 深度文本匹配发展比较久,积累了很多文本匹配方法。也有很多的分类方式,一种分类方式是表示型和交互型。 表示型方法 表示型(repre…

kafka架构和原理详解

Apache Kafka 是一个分布式流数据平台,用于高吞吐量、持久性、可扩展的发布和订阅消息。它具有高度的可靠性,被广泛用于构建实时数据流处理、日志收集和数据管道等应用。 基本架构 1. 主题(Topic): 主题是消息的逻辑分类生产者将消息发布到特定的主题中,而消费者可以订阅…

LAMP 配置与应用

LAMP 架构的组成 LAM(M)P: L:linux A:apache (httpd) M:mysql, mariadb P:php, perl, python apache的功能: 第一:处理http的请求、构建响应报文等自身服务; 第二&#xff1a…