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++函数中的字符串。

相关文章:
Android JNI系列详解之CMake编译工具的使用
一、CMake工具的介绍 如图所示,CMake工具的主要作用是,将C/C编写的native源文件编译打包生成库文件(包含动态库或者静态库文件),集成到Android中使用。 二、CMake编译工具的使用 使用主要是配置两个文件:CM…...
springboot中关于继承WebMvcConfigurationSupport后自定义的全局Jackson失效解决方法,localdate返回数组问题
一般情况下我们在config里增加jackson的全局配置文件就能满足基本的序列化需求,比如前后端传参的问题。 Configuration public class JacksonConfig {public static final String LOCAL_TIME_PATTERN "HH:mm:ss";public static final String LOCAL_DATE…...
LeetCode 面试题 02.03. 删除中间节点
文章目录 一、题目二、C# 题解 一、题目 若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。 假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。 例如&#x…...
Redis知识点总结
概述 Redis诞生于2009年,全称是Remote Dictionarty Server(远程词典服务器) 只支持单线程 非关联:主要指的是表中没有主外键等概念 Redis是一款内存数据库,主要存储键值对类型的数据 基本用法 注意:该操作是在cli中进行的 键名…...
(四)k8s实战-服务发现
一、Service 1、配置文件 apiVersion: v1 kind: Service metadata:name: nginx-svclabels:app: nginx-svc spec:ports:- name: http # service 端口配置的名称protocol: TCP # 端口绑定的协议,支持 TCP、UDP、SCTP,默认为 TCPport: 80 # service 自己的…...
AxureRP制作静态站点发布互联网,内网穿透实现公网访问
AxureRP制作静态站点发布互联网,内网穿透实现公网访问 文章目录 AxureRP制作静态站点发布互联网,内网穿透实现公网访问前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4…...
[Go版]算法通关村第十四关白银——堆高效解决的经典问题(在数组找第K大的元素、堆排序、合并K个排序链表)
目录 题目:在数组中找第K大的元素解法1:维护长度为k的最小堆,遍历n-k个元素,逐一和堆顶值对比后,和堆顶交换,最后返回堆顶复杂度:时间复杂度 O ( k ( n − k ) l o g k ) O(k(n-k)logk) O(k(n−…...
『FastGithub』一款.Net开源的稳定可靠Github加速神器,轻松解决GitHub访问难题
📣读完这篇文章里你能收获到 如何使用FastGithub解决Github无法访问问题了解FastGithub的工作原理 文章目录 一、前言二、项目介绍三、访问加速原理四、FastGithub安装1. 项目下载2. 解压双击运行3. 运行效果4. GitHub访问效果 一、前言 作为开发者,会…...
软件开发的201个原则 阅读笔记 第172-201个原则
目录 原则172 做项目总结 第8章 产品保证原则 原则173 产品保证并不是奢侈品 原则 174 尽早建立软件配置管理过程 原则175 使软件配置管理适应软件过程 原则176 组织SCM 独立于项目管理 原则 177 轮换人员到产品保证组织 给所有中间产品一个名称和版本 原则179 控制基准 原则…...
vue 后台管理系统登录 记住密码 功能(Cookies实现)
安装插件 import Cookies from js-cookie 组件引入 import Cookies from js-cookie; 存值: Cookies.set(username, state.account, { expires: 30 }); // username 存的值的名字,state.account 存的值 expires 存储的时间,30天Cookies…...
elementUI moment 年月日转时间戳 时间限制
changeStartTime(val){debuggerthis.startT val// this.startTime parseInt(val.split(-).join())this.startTime moment(val).unix() * 1000 //开始时间毫秒if(this.endTime){this.endTime moment(this.endT).unix() * 1000 //结束时间毫秒if(this.startTime - this.endTi…...
用AI + Milvus Cloud搭建着装搭配推荐系统教程
以下函数定义了如何将图像转换为向量并插入到 Milvus Cloud 向量数据库中。代码会循环遍历所有图像。(注意:如果需要开启 Milvus Cloud 全新特性动态 Schema,需要修改代码。) 查询向量数据库 以下代码演示了如何使用输入图像查询 Milvus Cloud 向量数据库,以检索和上传…...
大数据领域都有什么发展方向
近年来越来越多的人选择大数据行业,大数据行业前景不错薪资待遇好,各大名企对于大数据人才需求不断上涨。 大数据从业领域很宽广,不管是科技领域还是食品产业,零售业等都是需要大数据人才进行大数据的处理,以提供更好…...
NSSCTF——Web题目1
目录 一、[LitCTF 2023]PHP是世界上最好的语言!! 二、[LitCTF 2023]Ping 三、[SWPUCTF 2021 新生赛]easyupload1.0 四、[SWPUCTF 2021 新生赛]easyupload2.0 五、[SWPUCTF 2021 新生赛]caidao 一、[LitCTF 2023]PHP是世界上最好的语言!&a…...
VScode中写Verilog时,iverilog语法自动纠错功能不起作用
VScode中编写Verilog时,iverilog语法自动纠错功能不起作用 问题:按照教程搭建vscode下Verilog编译环境,发现语法纠错功能一直无效,检查了扩展Verilog-HDL/SystemVerilog/Bluespec SystemVerilog的配置也没有任何问题。 错误原因&a…...
thinkphp6.0 配合shell 脚本 定时任务
1. 执行命令,生成自定义命令 php think make:command Custom<?php declare (strict_types 1);namespace app\command;use app\facade\AdmUser; use think\console\Command; use think\console\Input; use think\console\input\Argument; use think\console\i…...
18-使用钩子函数判断用户登录权限-登录前缀
钩子函数的两种应用: (1). 应用在app上 before_first_request before_request after_request teardown_request (2). 应用在蓝图上 before_app_first_request #只会在第一次请求执行,往后就不执行, (待定,此属性没调试通过) before_app_request # 每次请求都会执行一次(重点…...
关闭win11启动界面搜索推荐
环境:win11 最近win11更新了某些功能,附带加上了搜索推荐的功能。对于启动菜单的搜索功能,我只想搜索我自己的安装的程序,快速打开,不希望看到搜索推荐,更不希望多点击一下,偶尔还会打开浏览器看…...
中文乱码处理
😀前言 中文乱码处理 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 在csdn获奖荣誉: Ἴ…...
JAVA坦克大战游戏v3
JAVA坦克大战游戏v3 素材 bomb_3.gif bomb_2.gif bomb_1.gif 项目结构 游戏演示 MyTankGame3.java /*** 功能:坦克游戏的5.0[]* 1.画出坦克.* 2.我的坦克可以上下左右移动* 3.可以发射子弹,子弹连发(最多5)* 4.当我的坦克击中敌人坦克时,敌人就消失(爆炸的效…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
