Android开发实践:Android.mk模板

在这里插入图片描述

关于Android NDK开发的文章已经比较多了,我的博客中也分享了很多NDK开发相关经验和技巧,今天简单写了一个 Android.mk 的示例模板,供初学者参考。

本模板主要给大家示例 Android NDK 开发中的如下几个问题:

  1. 如何自动添加需要编译的源文件列表
  2. 如何添加第三方静态库、动态库的依赖
  3. 如何构造一个完整的NDK工程框架

假设我们的项目依赖 libmath.a, libjson.a, libffmpeg.so 这几个第三方库文件,项目包含如下几个模块:algorithm,core,network,utils,tests,每个模块都有若干个.c/.h文件,我们要把整个工程编译为动态库,并通过 native_sdk.c 中的函数向Java层提供调用接口。

那么,我们可以对 Android 工程的 jni 目录,做如下划分:

img

对应的 Android.mk 文件的写法示例如下

LOCAL\_PATH := $(call my-dir)
3RD\_INC\_DIR = $(LOCAL\_PATH)/3rd/inc
3RD\_LIB\_DIR = $(LOCAL\_PATH)/3rd/libs# Prebuild the 3rd libraries include $(CLEAR\_VARS)
LOCAL\_MODULE := math
LOCAL\_SRC\_FILES := $(3RD\_LIB\_DIR)/libmath.a
include $(PREBUILT\_STATIC\_LIBRARY)include $(CLEAR\_VARS)
LOCAL\_MODULE := json
LOCAL\_SRC\_FILES := $(3RD\_LIB\_DIR)/libjson.a
include $(PREBUILT\_STATIC\_LIBRARY)include $(CLEAR\_VARS)
LOCAL\_MODULE := ffmpeg
LOCAL\_SRC\_FILES := $(3RD\_LIB\_DIR)/libffmpeg.so
include $(PREBUILT\_SHARED\_LIBRARY)# Build native sdk include $(CLEAR\_VARS)    LOCAL\_MODULE := native\_sdkLOCAL\_SRC\_FILES := \\$(subst $(LOCAL\_PATH)/,,$(wildcard $(LOCAL\_PATH)/src/algorithm/\*.c))  \\$(subst $(LOCAL\_PATH)/,,$(wildcard $(LOCAL\_PATH)/src/core/\*.c))  \\$(subst $(LOCAL\_PATH)/,,$(wildcard $(LOCAL\_PATH)/src/network/\*.c)) \\$(subst $(LOCAL\_PATH)/,,$(wildcard $(LOCAL\_PATH)/src/utils/\*.c)) \\$(subst $(LOCAL\_PATH)/,,$(wildcard $(LOCAL\_PATH)/src/\*.c))  LOCAL\_C\_INCLUDES := $(3RD\_INC\_DIR)
LOCAL\_C\_INCLUDES := $(LOCAL\_PATH)/src 
LOCAL\_C\_INCLUDES := $(LOCAL\_PATH)/src/algorithm
LOCAL\_C\_INCLUDES += $(LOCAL\_PATH)/src/core
LOCAL\_C\_INCLUDES += $(LOCAL\_PATH)/src/network
LOCAL\_C\_INCLUDES += $(LOCAL\_PATH)/src/utilsLOCAL\_CFLAGS := -DANDROID                                      
LOCAL\_LDLIBS := -llog LOCAL\_STATIC\_LIBRARIES := math json
LOCAL\_SHARED\_LIBRARIES := ffmpeginclude $(BUILD\_SHARED\_LIBRARY)# Build testsinclude $(CLEAR\_VARS)    
LOCAL\_MODULE := test.out
LOCAL\_SRC\_FILES := $(subst $(LOCAL\_PATH)/,,$(wildcard $(LOCAL\_PATH)/tests/\*.c)) 
LOCAL\_CFLAGS := -DANDROID 
LOCAL\_C\_INCLUDES := $(LOCAL\_PATH)/src 
LOCAL\_LDLIBS := -llog -fPIE -pie
LOCAL\_SHARED\_LIBRARIES:= native\_sdk
include $(BUILD\_EXECUTABLE)

对于 Android.mk 而言,如果要依赖第三方库文件,则必须添加 PREBUILT_XXXX_LIBRARY 进行预编译,LOCAL_SRC_FILES 宏给出了需要编译的源文件列表,这里我通过 subst和wildcard 这两个函数,实现了自动扫描指定目录下的源文件,最后,通过 BUILD_EXECUTABLE 编译出可以运行于adb shell命令行的可执行程序,用于做代码的单元测试。

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

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

相关文章

vb+SQL车辆管理系统设计与实现

摘 要 随着信息时代的到来,信息高速公路的兴起,全球信息化进入了一个新的发展时期。人们越来越认识到计算机强大的信息模块处理功能,使之成为信息产业的基础和支柱。 我国经济的快速发展,汽车已经成为人们不可缺少的交通工具。对于拥有大量车辆的机关企事业来说,车辆的…

15_基于Flink将pulsar数据写入到ClickHouse

3.8.基于Flink将数据写入到ClickHouse 编写Flink完成数据写入到ClickHouse操作, 后续基于CK完成指标统计操作 3.8.1.ClickHouse基本介绍 ClickHouse 是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C语言编写,主要用…

K最近邻算法:简单高效的分类和回归方法(三)

文章目录 🍀引言🍀训练集和测试集🍀sklearn中封装好的train_test_split🍀超参数 🍀引言 本节以KNN算法为主,简单介绍一下训练集和测试集、超参数 🍀训练集和测试集 训练集和测试集是机器学习和深…

【LeetCode】数据结构题解(11)[用队列实现栈]

用队列实现栈 😉 1.题目来源👀2.题目描述🤔3.解题思路🥳4.代码展示 所属专栏:玩转数据结构题型❤️ 🚀 >博主首页:初阳785❤️ 🚀 >代码托管:chuyang785❤️ &…

C语言文件操作基本方法

1、文件的分类 ANSI C 的缓冲文件系统 缓冲文件系统 缓冲文件系统是指,系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。 从内存向磁盘输出数据时,必须首先输出到缓冲区中。待缓冲区装满后,再一起输出到磁盘文件中。 从磁盘文件向内…

云原生周刊:KubeCon China 2023 详细议程公布 | 2023.8.7

开源项目推荐 Spiderpool Spiderpool 是一个 Kubernetes 底层网络解决方案。它提供丰富的 IPAM 功能和 CNI 集成能力,为开源社区的 CNI 项目提供支持,允许多个 CNI 有效协作。它能让底层 CNI 在裸机、虚拟机和任何公共云等环境中完美运行。 Preevy P…

Python爬虫的Selenium(学习于b站尚硅谷)

目录 一、Selenium  1.为什么要学习Selenium  (1)什么是Selenium  (2)为什么使用selenium?  (3)代码演示 2. selenium的基本使用  (1)如何安装selenium  (2…

探析STM32标准库与HAL库之间的差异与优劣

引言: 在嵌入式开发领域,STMicroelectronics的STM32系列芯片广受欢迎。STM32提供了两种主要的软件库,即标准库和HAL库,用于开发各种应用。本文将探讨这两种库之间的差异,比较它们的优劣,并分析在选择库时需…

数仓架构模型设计参考

1、数据技术架构 1.1、技术架构 1.2、数据分层 将数据仓库分为三层,自下而上为:数据引入层(ODS,Operation Data Store)、数据公共层(CDM,Common Data Model)和数据应用层&#xff…

Android 数据库之GreenDAO

GreenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到 SQLite 数据库中,我们操作数据库的时候,不再需要编写复杂的 SQL语句, 在性能方面,greenDAO 针对 Android 进行了高度优化,…

IPWorks S3 Delphi Edition Crack

IPWorks S3 Delphi Edition Crack IPWorksS3使集成基于云的文件存储变得容易。易于使用的组件可用于与任何S3兼容的存储提供商集成,如Amazon S3、Digital Ocean Spaces、Wasabi、Backblaze B2、IBM Cloud Object storage、Oracle Cloud、Linode等。强大的客户端加密…

springboot+vue智能化网络电子相册图片管理系统_84ds3

随着计算机技术发展,计算机系统的应用已延伸到社会的各个领域,大量基于网络的广泛应用给生活带来了十分的便利。所以把智能化电子相册与现在网络相结合,利用计算机搭建智能化电子相册系统,实现智能化电子相册的信息化。则对于进一…

01_什么是ansible、基本架构、ansible工作机制、Ansible安装、配置主机清单、设置SSH无密码登录等

1.什么是ansible 1.1.基本介绍 1.2.基本架构 1.3.基本特征 1.4.优点 1.5.ansible工作机制 2.Ansible安装 2.1.机器准备 2.2.安装ansible 2.2.1.安装epel源 2.2.2.安装ansible 2.2.3.查看ansible版本 2.2.4.树状结构展示文件夹 2.2.4.1.其中ansible.cfg的内容如下 2.2.4.2.host的…

springboot调用webservice简便方式

此方法不建议在需要高并发或者是批量调用webservice接口时使用,比较吃内存。仅在管理系统后台中,或者是用户量少时可以采用此取巧方案。 直接上核心代码: package com.dhc.minboot.api;import org.slf4j.Logger; import org.slf4j.LoggerFa…

SQL笔记-正态分布函数(二)

在Oracle数据库中,并没有直接提供计算正态分布函数(累积分布函数)的内置函数。不过,你可以使用PL/SQL编程语言来实现一个自定义的正态分布函数。下面是一个简单的示例: CREATE OR REPLACE FUNCTION normdist(x NUMBER…

jmeter 二次开发详解

目录 背景: 自定义 BeanShell 功能 自定义请求编写(Java Sampler) 实现 Java Sampler 功能的两种方式 案例:使用 JavaSampler 重写 HTTP 的 POST 请求 自定义函数助手 背景: JMeter 是一个功能强大的性能测试工具…

The ‘kotlin-android-extensions‘ Gradle plugin is no longer supported.

Android使用kotlin开发,运行报错 The kotlin-android-extensions Gradle plugin is no longer supported. Please use this migration guide (https://goo.gle/kotlin-android-extensions-deprecation) to start working with View Binding (https://developer.an…

linux umask 详解

1. umask 定义 在 linux 系统中,umask 被定义在 /etc/profile 配置文件中,有一段 shell 脚本对 umask 是这么定义的。在 shell 会话输入命令: $ cat /etc/profile # 查看 /etc/profile 配置文件的内容 if [ $UID -gt 199 ] &&…

Codeforces の 动态规划

Codeforces Round 785 (Div. 2) - C. Palindrome Basis dp(9/100) 题目链接 思路:整数划分基础上加一个判断回文的条件 整数划分思路:背包容量为n,物品有体积为1~n n种,每种无数个,求使背包恰好装满的方案数——完全背…

Vue3中v-model在原生元素和自定义组件上的使用

目录 前言 一、原生元素上的用法 1. 输入框(input) 2. 多行文本域(textarea) 3. 单选按钮(radio) 4. 多选框(checkbox) 5. 下拉选择框(select) 二、自定义组件上的用法 1. 定义一个名为 modelValue 的 props 属性和一个名为 update:modelValue 的事件 2.使用一个可…