Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库

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的方式要简单一些(除了命令比较长之外.),新的方式的掌握还是要靠官方文档以及自行尝试,一些关键点突破了之后就没有那么难了。

参考文档

  1. Android CMake(https://developer.android.com/ndk/guides/cmake?hl=zh_cn)
  2. 脱离AS在windows下使用CMake交叉编译for Android(https://blog.csdn.net/LLJJYY001/article/details/77866049)

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

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

相关文章

Python语言基础学习大纲(由某大模型生成)

自从上次经丙察察游了一次滇藏线&#xff0c;已有3个没写一篇了。今天利用由某大模型生成的上面这张思维导图&#xff0c;配合这个大模型生成的6000多字拼凑出一篇博文聊以交差。 Python语言概述 一、语言特点 1.语法简单明了 Python的语法简洁易懂&#xff0c;使得编写代码…

12.5作业

1. #include <iostream>using namespace std;class Animal { private:string name; public:Animal(){}Animal(string name):name(name){cout << "animal" << endl;}virtual void perfrom(){cout << "实现不同表演行为" << …

Windows下安装Git和Git小乌龟

目录 Git简介 Git安装 Git小乌龟简介 Git小乌龟安装 Git简介 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地进行从很小到非常大的项目的版本管理。Git支持将本地仓库与远程仓库进行关联&#xff0c;实现多人协作开发。由于具有分布式版本控制、高效性、灵…

C++12.5

想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一位讲解员&#xff0c;他会为每种动物表演做简单的介绍。 在这个场景中&#xff0c;我们可以将动物比作是不同的类&#xff0c;而每种动物表演则…

【数据结构】链表OJ题(顺序表)(C语言实现)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

握这些员工管理技巧,助你打造高效团队!

人力资源是一个组织中至关重要的一环&#xff0c;而员工管理是确保团队高效运转的关键因素之一。一个优秀的经理需要具备多方面的技巧和能力&#xff0c;以便激发员工的潜力&#xff0c;促进合作和增加团队的效率。在这里&#xff0c;我将分享一些实用的员工管理技巧&#xff0…

Hadoop学习笔记(HDP)-Part.12 安装HDFS

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

RAR文件的密码保护如何设置和取消?

RAR文件是压缩包一种常用的压缩文件格式&#xff0c;对于这种文件&#xff0c;我们如何设置和取消密码保护呢&#xff1f; 首先我们要下载适用于RAR文件的WinRAR解压缩软件&#xff0c;然后在压缩文件的时候&#xff0c;就可以同步设置密码&#xff0c;选中需要压缩的文件&…

在外包公司干测试半年,提升的只有我的年龄···

有一说一&#xff0c;外包没有给很高的薪资&#xff0c;是真不能干呀&#xff01; 先说一下自己的情况&#xff0c;本科生&#xff0c;年初通过校招进入深圳某软件公司&#xff0c;干了接近半年的功能测试&#xff0c;直到最近遇到了瓶颈&#xff0c;感觉自己不能够在这样下去了…

分享5款小伙伴们推荐的好用软件

​ 转眼间2023年已经只剩下一个月了&#xff0c;最近陆陆续续收到好多小伙伴的咨询&#xff0c;这边也是抓紧整理出几个好用的软件&#xff0c;希望可以帮到大家。 1.文件格式转换——Convertio ​ Convertio是一款在线文件格式转换软件&#xff0c;可以让用户在不同的文件格…

Python sorted函数及用法以及如何用json模块存储数据

Python sorted函数及用法 sorted() 函数与 reversed() 函数类似&#xff0c;该函数接收一个可迭代对象作为参数&#xff0c;返回一个对元素排序的列表。 在交互式解释器中测试该函数&#xff0c;可以看到如下运行过程&#xff1a; >>> a [20, 30, -1.2, 3.5, 90, 3.…

Linux系统---图书管理中的同步问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、问题描述 &#xff08;1&#xff09;图书馆阅览室最多能够容纳N&#xff08;N5&#xff09;名学生&#xff0c;若有更多学生想…

跨境代采怎么实现(代采网站)

中国代购作为一种新型的业务形式&#xff0c;此类服务能够帮助消费者购买来自全球的商品&#xff0c;同时也为商家提供了在线销售机会。代购行业的兴起&#xff0c;有助于打破传统的地域和跨境限制&#xff0c;促进了国际贸易和经济发展。 一、中国代购的定义和特点 代购可以被…

冬季吃得过饱?羊大师教你几招消食的小妙招!

冬季吃得过饱&#xff1f;羊大师教你几招消食的小妙招&#xff01; 冬季是人们容易吃得过饱的季节&#xff0c;美食诱惑频出&#xff0c;很容易导致胃口过大&#xff0c;饭量过多&#xff0c;造成消化不良甚至影响身体健康。所以&#xff0c;如何消食&#xff0c;让胃得到缓解…

long转int类型转换问题

在业务代码中排序时需要根据日期排序&#xff0c;写了如下代码 sorted((o1, o2) -> {String str1 null;String str2 null;try {Field field getField(fieldMap, configBO.getCodeName());str1 String.valueOf(field.get(o1));str2 String.valueOf(field.get(o2));} ca…

【Qt开发流程】之对象模型1:信号和槽

Qt对象模型 标准c对象模型为对象范型提供了非常有效的运行时支持。但是它的静态特性在某些问题领域是不灵活的。图形用户界面编程是一个既需要运行时效率又需要高度灵活性的领域。Qt通过结合c的速度和Qt对象模型的灵活性提供了这一点。 Qt将这些特性添加到c中: 一个非常强大的…

基于Go语言实现简易Web应用

目录 前言Go语言特点写在使用Go语言实现Web应用前面创建Web服务器声明一个结构体操作加入中间件的使用使用静态文件服务器最后 前言 在编程语言中&#xff0c;近几年问世的几个新语言都是非常不错的&#xff0c;比如Go、Python、 Rust等等。其中&#xff0c;Go语言(Golang)作…

CookieSession Redis 到JWT会话管理历史

单应用时期&#xff0c;通常使用 Cookies 和 Session 进行会话管理。 用户登录后&#xff0c;服务器创建一个唯一的会话标识符&#xff08;Session ID&#xff09;&#xff0c;将其存储在浏览器的 Cookies 中&#xff0c;并在服务端维护一个关联该标识符的会话对象。 这种方…

全国停车位收费标准接口API

1) 请求地址 接口地址https://psbg.jparking.cn/cw-gateway/cwzg/v1/near_park 2) 调用方式&#xff1a;HTTP post 3) 接口描述&#xff1a; 数据来源捷停车 不可用于商用 概不负责 4) 请求参数: {"latitude": "29.563009", //坐标"longitude&quo…

Verilog基础:编译指令`timescale

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 timescale编译指令用于指定指令后模块的时间单位和时间精度。时间单位是时间值的度量单位&#xff0c;例如延迟值和仿真时间&#xff1b;而仿真精度决定了最小可分…