东莞市网站开发/深圳媒体网络推广有哪些
Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库
文章目录
- Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库
- 一、前言
- 二、编译环境
- 三、示例C/CPP程序
- 1、总体工程结构
- 2、示例代码
- 3、CMakeLists.txt(重要)
- 4、build脚本(重要)
- 5、运行测试
- 四、总结
一、前言
之前在Android Studio中编写NDK C/C++相关代码,通过Gradle和CMake编译成动态库,然后再利用JNI的方式进行调用。现在需要编译Android C/C++可执行程序,通过运行程序做一些小实验,而这些小实验都是纯C/C++编写,不包含任何Java代码,那么是否可以利用现成的环境进行开发呢?之前我是一直在虚拟机上安装NDK利用其带有的交叉编译工具链进行编译,但NDK的低版本和高版本变化比较大,比如高版本取消了gcc改为使用clang,因此导致在虚拟机上安装ndk进行编译的方式随着ndk版本的变化有了很多兼容问题,所以学会cmake独立编译方式在现阶段具有一劳永逸的效果。
二、编译环境
通过Android Studio内置的SDK Manager下载NDK和CMake,可参考:下载NDK和构建工具;
三、示例C/CPP程序
1、总体工程结构
由于单独运行camke命令来处理,因此工程结构比较灵活,可以将相关的代码都放到一个目录下,紧凑且方便查找。
2、示例代码
addTest.c:(我这里以加载静态库或动态库的方式做示例,实际场景中链接静态库或动态库更多,最好是使用静态库,拷贝动态库到Android设备上以及设置路径也挺麻烦的)
//
// Created by Administrator on 2023/12/5.
//
#include <stdio.h>
#include "addnum.h"int main()
{int res = addtwo(1, 2);printf("add test res:%d\n", res);return 0;
}
3、CMakeLists.txt(重要)
引入动态库、静态库以及生成可执行文件、静态库、动态库等方法都是很有用的:
# CMake最低版本号要求
cmake_minimum_required(VERSION 3.6)# 项目信息
project (addTest)#引入静态库
add_library(addnum STATIC IMPORTED)
set_target_properties(addnum PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libaddnum.a)
#引入动态库
#add_library(addnum SHARED IMPORTED)
#set_target_properties(addnum PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libaddnum.so)# 设置目标文件的名字
set(TARGET_NAME addTest)# 生成可执行文件
add_executable(${TARGET_NAME} addTest.c)
#生成静态库
#add_library(${TARGET_NAME} STATIC addTest.c)
#生成动态库
#add_executable(${TARGET_NAME} SHARED addTest.c)# 链接库
target_link_libraries(${TARGET_NAME} addnum)
4、build脚本(重要)
在执行cmake命令生成Android可执行文件时需要带上长长的参数,为了简化此步骤,这里编写一个脚本build.bat:
@REM set abi=armeabi-v7a
set abi=arm64-v8a
set ANDROID_SDK_HOME=C:/Users/Administrator/AppData/Local/Android/Sdkif not exist %abi% md %abi%
cd %abi%%ANDROID_SDK_HOME%/cmake/3.10.2.4988404/bin/cmake ^-DANDROID_ABI=%abi% ^-DANDROID_NDK=%ANDROID_SDK_HOME%/ndk-bundle ^-DCMAKE_BUILD_TYPE=Debug ^
@REM -DCMAKE_BUILD_TYPE=Release^-DCMAKE_TOOLCHAIN_FILE=%ANDROID_SDK_HOME%/ndk-bundle/build/cmake/android.toolchain.cmake ^-DANDROID_NATIVE_API_LEVEL=9 ^-DANDROID_TOOLCHAIN=clang -DCMAKE_GENERATOR="Ninja" ^-DCMAKE_MAKE_PROGRAM=%ANDROID_SDK_HOME%/cmake/3.10.2.4988404/bin/ninja ^..%ANDROID_SDK_HOME%/cmake/3.10.2.4988404/bin/ninjacd ..
脚本中的3.10.2.4988404指的是CMake的版本,需要根据实际下载的CMake版本进行修改。
由于使用的是Windows系统,这里给出的是bat脚本,Linux/Mac的shell脚本可根据bat脚本进行相应的修改。
5、运行测试
使用Android手机通过USB数据线连接电脑,或者使用模拟器。将生成的可执行文件通过adb命令push到设备上的/data/local/tmp下即可,该路径具备运行程序的权限:
$ adb push addTest /data/local/tmp
$ adb shell
$ chmod 777 /data/local/tmp/addTest
$ /data/local/tmp/addTest
add test res:3
四、总结
之前一直使用ndk-build结合Android.mk在虚拟机上编译适用于Android的so,目前发现很多兼容问题,使用cmake方式后完美解决了,这里做下总结。此外,之前我们也总结过包含so和Java接口的jar包,都是采用cmake的方式,目前看来cmake方式要比Android.mk的方式要简单一些(除了命令比较长之外.),新的方式的掌握还是要靠官方文档以及自行尝试,一些关键点突破了之后就没有那么难了。
参考文档
- Android CMake(https://developer.android.com/ndk/guides/cmake?hl=zh_cn)
- 脱离AS在windows下使用CMake交叉编译for Android(https://blog.csdn.net/LLJJYY001/article/details/77866049)
相关文章:

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库
Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库 文章目录 Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库一、前言二、编译环境三、示例C/CPP程序1、总体工程结构2、示例代码3、CMakeLists.txt(重要)4、…...

MySQL七 | 存储引擎
目录 存储引擎 存储引擎特点 存储引擎选择 Innodb与MyISAM区别 存储引擎 默认存储引擎:InnoDB show engines;#展示当前数据库支持的存储引擎 存储引擎特点 特点InnoDBMyISAMMemory存储限制64TB有有事务安全支持--锁机制行锁表锁表锁Btree锁支持支持 支持 Hash索引--支…...

网上下载的pdf文件,为什么不能复制文字?
不知道大家有没有到过这种情况?在网上下载的PDF文件打开之后,发现选中文字之后无法复制。甚至其他功能也都无法使用,这是怎么回事?该怎么办? 当我们发现文件打开之后,编辑功能无法使用,很可能是…...

Linux下apisix离线安装教程
Linux下apisix离线安装教程 一、首先需要安装etcd:二、通过rpm离线安装apisix三、启动apisix四、安装apisix-dashboard1、安装2、更改dashboard登录账号名和密码3、运行 一、首先需要安装etcd: 解压缩etcd后执行以下命令: tar -xvf etcd-v3.…...

基于STM32 + DMA介绍,应用和步骤详解(ADC多通道)
前言 本篇博客主要学习了解DMA的工作原理和部分寄存器解析,针对ADC多通道来对代码部分,应用部分作详细讲解,掌握代码编程原理。本篇博客大部分是自己收集和整理,如有侵权请联系我删除。 本次博客开发板使用的是正点原子精英版&am…...

openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断
文章目录 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断144.1 背景信息144.2 前提条件 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断 144.1 背景信息 在SQL语句执行性能不符合预期时,可以查看SQL语句执行信息,便…...

计算机毕业设计springboot+ssm停车场车位预约系统java
管理员不可以注册账号 停车位包括车位所在楼层、车位编号、车位类型(全时间开放/高峰期开放)、预定状态等 用户预约时要求支付预约时间段的停车费用 违规行为:1.停车超过预约时间段 2.预约未使用 于系统的基本要求 (1)功能要求&am…...

打破常规思维:Scrapy处理豆瓣视频下载的方式
概述 Scrapy是一个强大的Python爬虫框架,它可以帮助我们快速地开发和部署各种类型的爬虫项目。Scrapy提供了许多方便的功能,例如请求调度、数据提取、数据存储、中间件、管道、信号等,让我们可以专注于业务逻辑,而不用担心底层的…...

系列学习前端之第 2 章:一文精通 HTML
全套学习 HTMLCSSJavaScript 代码和笔记请下载网盘的资料: 链接: https://pan.baidu.com/s/1-vY2anBdrsBSwDZfALZ6FQ 提取码: 6666 HTML 全称:HyperText Markup Language(超文本标记语言) 1、 HTML 标签 1. 标签又称元素&#…...

SCSS Module 这样处理配置和使用太赞了
SCSS Module 只是Scss和Css Module结合,可以利用SCSS对代码静态处理的能力,使得样式处理更强大一些,并不是什么新的东西,对比css-in-js和scoped,个人偏向喜欢Scss Module做样式隔离,先说一下优点࿱…...

【Unity动画】Unity 2D动画创建流程
本文以2D为案例,讲解Unity 播放动画的流程 准备和导入2D动画资源 外部导入序列帧生成的 Unity内部制作的 外部导入的3D动画 2.创建动画过程 打开时间轴Ctrl6 选中场景中的一个未来需要播放动画的物体 回到时间轴点击Create一个新动画片段 拖动2D动画资源放入…...

【算法每日一练]-图论(保姆级教程篇12 tarjan篇)#POJ3352道路建设 #POJ2553图的底部 #POJ1236校园网络 #缩点
目录: 今天知识点 加边使得无向图图变成双连通图 找出度为0的强连通分量 加边使得有向图变成强连通图 将有向图转成DAG图进行dp POJ3352:道路建设 思路: POJ2553:图的底部 思路: POJ1236校园网络 思路&#x…...

Python数据科学视频讲解:数据挖掘与建模的注意事项
1.7 数据挖掘与建模的注意事项 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.7节内容。本书已正式出版上市,当当、京东、淘宝等平台热销中,搜索书名即可。内容涵盖数据科学应用的全流程,包括…...

unity | 动画模块之循环滚动选项框
一、作者的话 评论区有人问,有没有竖排循环轮播选项框,我就写了一个 二、效果动画 如果不是你们想要的,就省的你们继续往下看了 三、制作思路 把移动分成里面的方块,还有背景(父物体),方块自…...

TinyMPC - CMU (卡耐基梅隆大学)开源的机器人 MPC 控制器
系列文章目录 CasADi - 最优控制开源 Python/MATLAB 库 文章目录 系列文章目录前言一、机器人硬件对比1.1 Teensy 上的微控制器基准测试1.2 机器人硬件1.3 BibTeX 二、求解器三、功能(预期)3.1 高效3.2 鲁棒3.3 可嵌入式3.4 最小依赖性3.5 高效热启动3.…...

C++ 对象的初始化和清理:构造函数和析构函数
目录 构造函数和析构函数 构造函数 析构函数 构造函数的分类及调用 括号法 显示法 隐式转换法 拷贝构造函数的调用时机 使用一个已经创建完毕的对象来初始化一个新对象 值传递的方式给函数参数传值 以值方式返回局部对象 构造函数调用规则 初始化列表 类对象作…...

Tmux中使用Docker报错 - 解决方案
问题 进入Tmux会话后,在其中使用Docker可能会出现如下报错: Got permission denied while trying to connect to the Docker ……解决方案 退出tmux会话: tmux detach在tmux会话外部杀掉tmux进程: pkill -f tmux重新进入tmux:…...

如何在WordPress中批量替换图片路径?
很多站长在使用WordPress博客或者搬家时,需要把WordPress文章中的图片路径进行替换来解决图片不显示的问题。总结一下WordPress图片路径批量替换的过程,方便有此类需求的站长们学习。 什么情况下批量替换图片路径 1、更换了网站域名 有许多网站建设初期…...

el-pagination 纯前端分页
需求:后端把所有数据都返给前端,前端进行分页渲染。 实现思路:先把数据存储到一个大数组中,然后调用方法进行切割。主要使用数组的slice方法 所有代码: html <template><div style"padding: 20px&qu…...

基于springboot的校园二手市场
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

【开源】基于Vue和SpringBoot的在线课程教学系统
项目编号: S 014 ,文末获取源码。 \color{red}{项目编号:S014,文末获取源码。} 项目编号:S014,文末获取源码。 目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2…...

Mysql分布式集群部署---MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上
1.1 目的 部署MysqlCluster集群环境 1.2 MySQL集群Cluster原理 1 数据分片 MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上。这样可以将数据负载分散到多个服务器上,提高系统的性能和可扩展性。 2. 数据同步 MySQL集群Cluster使…...

身份认证技术
身份认证是对系统的用户进行有效性、真实性验证。 1.口令认证方式 使用口令认证方式,用户必须具有一个唯一的系统标识,并且保证口令在系统的使用和存储过程中是安全的,同时口令在传输过程中不能被窃取、替换。另外特别要注意的是在…...

Centos7、Mysql8.0 load_file函数返回为空的终极解决方法--暨selinux的深入理解
零、问题背景 最近想换房,为了方便自己对比感兴趣的房子,因此决定将目标房源的基本信息放在表里,特别是要一目了然的看到众多房子的各种图纸和照片,因此决定要在Mysql8.0.34数据库中以二进制形式保存图片(抛开合理性和…...

基于Spring Boot的水产养殖管理系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring Boot的水产养殖管理系统,jav…...

LCR 090. 打家劫舍 II(leetcode)动态规划
文章目录 前言一、题目分析二、算法原理1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值是什么 三、代码实现总结 前言 在本文章中,我们将要详细介绍一下LeetcodeLCR 090. 打家劫舍 II。采用动态规划解决,这是一道经典的多状态dp问题 一、题目分析…...

【小沐学Python】Python实现语音识别(Whisper)
文章目录 1、简介1.1 whisper简介1.2 whisper模型 2、安装2.1 whisper2.2 pytorch2.3 ffmpeg 3、测试3.1 命令测试3.2 代码测试:识别声音文件3.3 代码测试:实时录音识别 结语 1、简介 https://github.com/openai/whisper 1.1 whisper简介 Whisper 是…...

Nginx负载均衡实战
🎵负载均衡组件 ngx_http_upstream_module https://nginx.org/en/docs/http/ngx_http_upstream_module.html upstream模块允许Nginx定义一组或多组节点服务器组,使用时可以通过多种方式去定义服务器组 样例: upstream backend {server back…...

Redis skiplist源码解析(支持范围查询)
跳表是一个多层的有序链表,在跳表中进行查询操作时,查询代码可以从最高层开始查询。层数越高,结点数越少,同时高层结点的跨度会比较大。因此,在高层查询结点时,查询一个结点可能就已经查到了链表的中间位置…...

MVSNeRF:多视图立体视觉的快速推广辐射场重建(2021年)
MVSNeRF:多视图立体视觉的快速推广辐射场重建(2021年) 摘要1 引言2 相关工作3 MVSNeRF实现方法3.1 构建代价体3.2 辐射场的重建3.3 体渲染和端到端训练 3.4 优化神经编码体 Anpei Chen and Zexiang Xu and Fuqiang Zhao et al. MVSNeRF: Fast…...