jni入门学习 CMakeLists脚本

在 Android Studio 中使用 CMake 可以编译 C/C++ 代码,这为开发者提供了在 Android 应用中嵌入本地代码的能力。下面是关于在 Android Studio 中使用 CMake 编译的详细说明:

1. 创建 CMakeLists.txt 文件:

首先,你需要在项目的根目录或者 JNI 文件夹中创建一个 CMakeLists.txt 文件,用于配置 CMake 编译的规则和选项。

2. 配置 CMakeLists.txt 文件:

CMakeLists.txt 文件中,你可以配置编译规则、源文件、包含目录、链接库等信息。以下是一个简单的示例:

# 这表示要求系统上安装的 CMake 版本至少是 3.10.2
cmake_minimum_required(VERSION 3.10.2)# 这表示项目名称为 MyProject,并且使用 C++ 语言。
project(MyProject LANGUAGES CXX)# 声明一个 C++ 库 常见的库类型有 SHARED、STATIC 等
# 1.STATIC:静态库,编译时会将库的代码和数据复制到生成的可执行文件中,链接时会直接将库的代码和数据链接到可执行文件中。
# 2.SHARED:共享库(动态库),编译时会生成共享库文件(.so 文件),链接时会在运行时动态加载共享库。
# 3.MODULE:模块库,类似于共享库,但是在某些平台上有不同的行为。
# 4.BJECT:目标库,编译时会生成一个对象文件,这个对象文件可以在多个库中共享使用。
add_library( # 设置库的名称native-lib# 设置库的类型,这里选择 SHARED 表示动态库SHARED# 添加库的源文件,可以是多个文件native-lib.cpp )
# 表示将 main.cpp 编译为一个可执行文件 myapp
add_executable(myapp main.cpp)# 表示将 include 目录添加为 native-lib 目标的私有包含目录
target_include_directories(native-lib PRIVATE include)# 表示将 log 库链接到 native-lib 库中
target_link_libraries(native-lib log)# 表示设置 C++ 编译器的标准为 C++11
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")# 这表示查找系统上的 log 库并将其路径存储在 log-lib 变量中
find_library(log-lib log)

3. 在 build.gradle 文件中配置 CMake:

在 app 模块的 build.gradle 文件中,你需要配置 CMake 的路径和版本:

android {...defaultConfig {...externalNativeBuild {cmake {// 指定 CMake 的路径path "CMakeLists.txt"// 指定 CMake 的版本,这个版本必须与你的 CMakeLists.txt 文件中的要求版本一致version "3.10.2"}}}...
}

4. 使用 CMake 编译:

配置完 CMakeLists.txt 文件和 build.gradle 文件后,你可以使用 Android Studio 中的 Build 菜单中的 Build Project 选项来编译你的项目。这将会执行 CMake 编译,生成动态库或静态库文件。

5. 链接本地库到你的 Java 代码:

编译完成后,你需要在 Java 代码中加载你的本地库。你可以在 Java 代码中使用 System.loadLibrary("native-lib"); 来加载你的动态库。

以上是使用 CMake 在 Android Studio 中编译本地代码的基本步骤。你可以根据项目需求在 CMakeLists.txt 文件中添加更多的配置和规则,以满足项目的需求。

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

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

相关文章

ISP技术综述

原文来自技术前沿:ISP芯片终极进化——VP芯片(AI视觉处理器) 目录 1.计算机视觉的定义 2.与计算机视觉密切相关的概念与计算机视觉密切相关的概念有机器视觉,图像处理与分析,图像和视频理解。 3.计算机视觉的应用 …

python进行语音分离和说话人识别

场景: 一段音频中有多个说话人,将不同的人说的话分离出来 已知一些人的语音特征,跟分离出来的片段,分别求特征的余弦距离,余弦距离最小的作为说话的人 安装: pip install pyannote.audio # _*_ coding: utf-8 _*_import torch from pyannote.audio import Model, Pipel…

RIPGeo代码理解(四)model.py( RIPGeo的核心源代码)

​ 代码链接:RIPGeo代码实现 ├── lib # 包含模型(model)实现文件 │ |── layers.py # 注意力机制的代码。 │ |── model.py # TrustGeo的核心源代码。 │ |── sublayers.py # layer.py的支持文件。 │ |── utils.…

六种GPU虚拟化:除了直通、全虚拟化 (vGPU)还有谁?

在大类上计算虚拟化技术有这3种: 软件模拟、直通独占(如网卡独占、显卡独占)、直通共享(如vCPU 、vGPU)。但对于显卡GPU而言我总结细化出至少这6种分类: 第一种、软件模拟(eg sGPU), 又叫半虚拟化。第二种…

RIPGeo代码理解(三)layers.py(注意力机制的代码)

代码链接:RIPGeo代码实现 ├── lib # 包含模型(model)实现文件 │ |── layers.py # 注意力机制的代码。 │ |── model.py # TrustGeo的核心源代码。 │ |── sublayers.py # layer.py的支持文件。 │ |── utils.py #…

uView Badge 徽标数

该组件一般用于图标右上角显示未读的消息数量,提示用户点击,有圆点和圆包含文字两种形式。 #平台差异说明 App(vue)App(nvue)H5小程序√√√√ #基本使用 通过value参数定义徽标内容通过type设置主题。重…

【教你如何制作一个简单的HTML个人网页】

制作一个简单的HTML个人网页 创建一个简单个人的HTML网页很容易,下面是一个基本的示例,其中包含一些常见的元素,比如标题、段落、一张图片和一些链接,请记住,您将需要一个地方来存储您的HTML文件和任何相关资源&#…

电子商务类网站搭建需要注意的几点。

随着电子商务的迅猛发展,越来越多的企业和创业者选择在互联网上开设自己的电商网站。为了确保电商网站能够高效运行,给用户提供良好的体验,选择合适的服务器配置至关重要。 一、硬件配置 1、 CPU(中央处理器) 电商网…

STM32CubeMX学习笔记23---FreeRTOS(任务的挂起与恢复)

1、硬件设置 本实验通过freertos创建两个任务来分别控制LED2和LED3的亮灭,需要用到的硬件资源 LED2和LED3指示灯串口 2、STM32CubeMX设置 根据上一章的步骤创建两个任务:STM32CubeMX学习笔记22---FreeRTOS(任务创建和删除)-CS…

vue01

一、什么是vue.js(单页面应用程序) 用于构建用户界面的渐进式框架,采用自底向上增量开发的设计。核心理念:数据驱动视图,组件化开发前端三大主流框架:Vue.js Angular.js React.js 二、为什么学习流行框架…

1060:均值

【题目描述】 给出一组样本数据,包含n个浮点数,计算其均值,精确到小数点后4位。 【输入】 输入有两行,第一行包含一个整数n(n小于100),代表样本容量;第二行包含n个绝对值不超过10…

FPGA - SPI总线介绍以及通用接口模块设计

一,SPI总线 1,SPI总线概述 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。串行外设接口总线(SPI),是一种高速的,全双工,同步的通信总线,并且在芯片的…

Debian时间和时区配置

1. 时区 1.1. 查看时区 timedatectl输出 Local time: Thu 2024-03-07 13:46:06 CSTUniversal time: Thu 2024-03-07 05:46:06 UTCRTC time: Thu 2024-03-07 05:46:06Time zone: Asia/Shanghai (CST, 0800) System clock synchronized: yesNTP service: activeRTC in local TZ…

面试十一、代理模式

代理模式是一种结构型设计模式,旨在为其他对象提供一种代理或替代方法,以控制对这些对象的访问。在代理模式中,代理对象充当了客户端和目标对象之间的中间人,客户端通过代理访问目标对象,而不直接访问目标对象。 代理模…

【C++】为什么vector的地址与首元素地址不同?

文章目录 一、问题发现:二、结果分析三、问题解析 一、问题发现: &vector和&vector[0]得到的两个地址居然不相同,对数组array取变量名地址和取首元素地址的结果是相同的。这是为啥呢? 使用下面代码进行验证:…

Oracle中全表扫描优化方法

在Oracle数据库中,全表扫描(Full Table Scan, FTS)是指查询执行时扫描表的所有数据块来获取结果集。虽然在某些场景下全表扫描可能是最优选择(例如:当需要访问大部分或全部数据、表很小或者索引访问成本高于全表扫描时…

MKdocs博客中文教程 - 已经整理到知乎专栏

MKdocs博客中文教程 - 知乎 Mkdocs-Wcowin中文主题 通过主题和目录以打开文章 基于Material for MkDocs美化简洁美观,功能多元化简单易上手,小白配置教程详细,清晰易懂

html5cssjs代码 035 课程表

html5&css&js代码 035 课程表 一、代码二、解释基本结构示例代码常用属性样式和装饰响应式表格辅助技术 一个具有亮蓝色背景的网页,其中包含一个样式化的表格用于展示一周课程安排。表格设计了交替行颜色、鼠标悬停效果以及亮色表头,并对单元格设…

C++基础之运算符重载续(十三)

一.函数调用运算符 我们知道,普通函数执行时,有一个特点就是无记忆性,一个普通函数执行完毕,它所在的函数栈空间就会被销毁,所以普通函数执行时的状态信息,是无法保存下来的,这就让它无法应用在…

python实现 linux 执行命令./test启动进程,进程运行中,输入参数s, 再输入参数1, 再输入参数exit, 获取进程运行结果重定向写入到文件

要在 Python 中实现执行 ./test 启动进程,并在进程运行中依次输入参数 s、1,最后输入参数 exit,并将进程的输出结果重定向写入到文件,你可以使用 subprocess 模块。以下是一个示例代码: import subprocess# 启动 test…