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.rhkb.cn/news/104582.html

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

相关文章

0103水平分片-jdbc-shardingsphere-中间件

文章目录 1 准备服务器1.1 创建server-order0容器1.2 创建server-order1容器 2、基本水平分片2.1、基本配置2.2、数据源配置2.3、标椎分片表配置2.4、行表达式2.5、分片算法配置2.6、分布式序列算法 3、多表关联3.1、创建关联表3.2、创建实体类3.3、创建Mapper3.4、配置关联表3…

Python土力学与基础工程计算.PDF-压水试验

Python 求解代码如下: 1. import math 2. 3. # 输入参数 4. L 2.0 # 试验段长度,m 5. Q 120.0 # 第三阶段计算流量,L/min 6. p 1.5 # 第三阶段试验段压力,MPa 7. r0 0.05 # 钻孔半径,m 8. 9. # 计算透…

kafka--技术文档--spring-boot集成基础简单使用

阿丹: 查阅了很多资料了解到,使用了spring-boot中整合的kafka的使用是被封装好的。也就是说这些使用其实和在linux中的使用kafka代码的使用其实没有太大关系。但是逻辑是一样的。这点要注意! 使用spring-boot整合kafka 1、导入依赖 核心配…

如何安装指定版本node.js,安装旧版本node

1、查看当前是否安装node,如果安装了需要先卸载当前版本node 搜索控制面板 -> 找到程序/卸载程序 -> 在里面找到node -> 然后右击卸载 2、卸载完成后就要安装其他版本得node.js 找到想要安装的对应版本,安装.msi格式的安装包 注&#xff…

权重初始化

常用的权重初始化方法: 随机初始化(Random Initialization) Xavier 初始化(Glorot Initialization) He 初始化(He Initialization)Kaiming 零初始化(Zero Initialization&#x…

【C语言】文件操作 -- 详解

一、什么是文件 磁盘上的文件是文件。 1、为什么要使用文件 举个例子,当我们想实现一个 “通讯录” 程序时,在通讯录中新建联系人、删除联系人等一系列操作,此时的数据存储于内存中,程序退出后所有数据都会随之消失。为了让通讯录…

【TPC开证报错】-出库单数据无法匹配【成品产出单明细】

今天可信平台有个证书无法开证,送审报错。 其实业务逻辑是销售出库的单据,也会有个成品入库单。 成品入库单里面的所有箱码,都需要包装记录。 这个就是MES系统里的包装报工(之前自动化缺失的包装数据,曾经导过一次。…

Spark第三课

1.分区规则 1.分区规则 shuffle 1.打乱顺序 2.重新组合 1.分区的规则 默认与MapReduce的规则一致,都是按照哈希值取余进行分配. 一个分区可以多个组,一个组的数据必须一个分区 2. 分组的分区导致数据倾斜怎么解决? 扩容 让分区变多修改分区规则 3.HashMap扩容为什么必须…

2023年Java核心技术面试第七篇(篇篇万字精讲)

目录 十二 . Java 提供了哪些IO方式?NIO如何实现多路复用? 12.1 典型回答: 12.1.1 传统的java.io包: 12.1.2 Java 1.4中引入NIO(java.nio包): 12.1.2 .1 详细解释: 12.1.2.2 多路复…

抖音seo短视频矩阵系统源代码开发原型--开源

一、系统设计 1.需求分析 抖音SEO矩阵系统的主要功能是提高视频的曝光和排名,因此,其主要需求包括: 1)关键词研究:通过分析用户搜索行为,挖掘出热门关键词,以便制定针对性的SEO策略。 2&…

无涯教程-PHP - IntlChar类

在PHP7中&#xff0c;添加了一个新的 IntlChar 类&#xff0c;该类试图公开其他ICU函数。此类定义了许多静态方法和常量&#xff0c;可用于操作unicode字符。使用此类之前&#xff0c;您需要先安装 Intl 扩展名。 <?phpprintf(%x, IntlChar::CODEPOINT_MAX);print (IntlCh…

java:Tomcat

文章目录 背景服务器web 服务器服务资源的分类服务器软件的分类nginx 和 tomact总结 安装Tomcatbrew安装官网压缩包安装IDEA集成IDEA插件 说明 背景 在讲 Tomcat 是啥之前&#xff0c;我们先来了解一些概念。 服务器 可以理解为一个高性能的电脑&#xff0c;但是这个电脑现在…

数据湖:解锁数据价值的新时代

文章首发地址 数据湖&#xff08;Data Lake&#xff09;是一种数据存储和管理架构&#xff0c;它将不同类型的数据&#xff08;如结构化数据、半结构化数据和非结构化数据&#xff09;以原始形式保存在一个公共存储库中&#xff0c;而不强制执行预定义模式或数据结构。数据湖…

下半场开哨!AIGC+智能汽车,谁在引领市场新风口

“智能汽车已经成为AIGC应用的下一个‘重地’。” 中科创达副总裁、畅行智驾CEO屠科在8月22日于南京举办的《软件赋能汽车智能化转型发展高峰论坛》上发表演讲时表示&#xff1a;在AIGC时代&#xff0c;汽车的“智能属性”将加速释放&#xff0c;智能驾驶也将迎来快速发展。 中…

Smartbi电子表格软件版本更新,首次推出Excel轻应用和语音播放

Smartbi电子表格软件又又又更新啦&#xff01; 此次更新&#xff0c;首次推出了新特性——Excel轻应用和语音播报。另外&#xff0c;还对产品功能、Demo示例、配套文档进行了完善和迭代。 低代码开发Excel轻应用 可实现迅速发布web应用 业务用户的需求往往都处于“解决问题”…

第4篇:vscode+platformio搭建esp32 arduino开发环境

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 1.配置默认安装路径&#xff0c;安装到D盘。 打开环境变量&#xff0c;点击新建 输入变量名PLATFORMIO_CORE_DIR与路径&#xff1a;D:\PLATF…

ModaHub魔搭社区:WinPlan垂直大模型数据采集

WinPlan经营大脑数据手动提交 数据采集模版创建后,用户可手动提交数据 数据批量导入 1、第一步:上传Excel 如何选择Excel本系统的批量导入支持选择任意相关的Excel,映射到数据采集模版的各列,即可实现批量导入;相关Excel可以是自行维护的相关数据、或从其他业务系统导出…

uniapp scroll-view横向滚动无效,scroll-view子元素flex布局不生效

要素排查&#xff1a; 1.scroll-x属性需要开启&#xff0c;官方类型是Boolean&#xff0c;实际字符串也行。 2scroll-view标签需要给予一个固定宽度&#xff0c;可以是百分百也可以是固定宽度或者100vw。 3.子元素需要设置display: inline-block&#xff08;行内块元素&#x…

React组件间数据传递(弹框和高阶组件(HOC)特性实现)

前言 在现代前端开发中&#xff0c;React 已经成为了最受欢迎的 JavaScript 库之一。而在复杂的应用中&#xff0c;不同组件之间的数据传递问题显得尤为关键。在本文中&#xff0c;我们将探讨一种高效的方法&#xff0c;即如何利用弹框和高阶组件特性来实现 React 组件间的数据…