网站首页 > 技术文章 正文
前言
上一篇文章我给大家介绍了如何在Linux下进行Android程序的交叉编译(Linux/Mac 交叉编译 Android 程序)。 这种方式比较原始,技术门槛稍高,对之前没有做过嵌入式开发的同学来说难度还是蛮大的。
为了解决这个问题,Google 提供了一系列脚本工具,以方便大家做 Android NDK方面的开发,其中最重要的是 ndk-build 脚本。有了这些脚本,开发者就不必再定义各种环境变量,只需要提供两个 Makefile 片段指明要编译哪些C/C++文件,生成哪个目标环境的程序就好了。 ndk-build脚本工具会自动检测各种环境变量、目标环境编译器等,最终完成交叉编译。
NDK-BUILD做了哪些事?
先让我们来看一下 ndk-build 吧。通过查看ndk-build源码我们可以看到,它执行的是类似于 $GNUMAKE -f <ndk>/build/core/build-local.mk <parameters> 这样的命令,实际就是自动检测并设置环境变量。我执行 ndk-build NDK_LOG=1 命令,会看到下面的信息:
Android NDK: NDK installation path auto-detected:
通过上面的分析我们应该已经很清楚 ndk-build 主要作什么事情了。既然 Google已经给我们提供了这么方便的交叉编译工具,那作为开发者我们还需要做哪些事情呢?
作为开发者的我们还需要做下面两件事儿:
编写 C/C++ 代码。
编写 Android.mk 和 Application.mk 两个 Makefile 片段。
Android.mk 与 Application.mk
下面我们就来看一下两个Makefile片段 Android.mk 和 Application.mk 是做什么用的。
Android.mk: 目的是用于向构建系统描述源文件和共享库,它位于 $PROJECT/ni/目录中。
Application.mk: 目的是描述在你的应用程序中所需要的模块(即静态库或动态库),它也位于 $PROJECT/jni/ 目录中。
下面我们分别来详细的介绍一下它们。
Android.mk
首先我们先来看一下 Android.mk的例子:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := hello_jniLOCAL_SRC_FILES := hello_jni.cinclude $(BUILD_SHARED_LIBRARY)
下面我们来分别解释一下每行语句的作用:
LOCAL_PATH在Android.mk中必须首先定义 LOCAL_PATH 变量,此变量表示源文件在开发树中的位置。构建系统提供的宏函数 my-dir 将返回当前目录(包含 Android.mk 文件本身的目录)的路径。
CLEAR_VARSCLEAR_VARS 变量指向特殊 GNU Makefile,可为您清除许多 LOCAL_XXX 变量,例如 LOCAL_MODULE、LOCAL_SRC_FILES 和 LOCAL_STATIC_LIBRARIES。 请注意,它不会清除 LOCAL_PATH。此变量必须保留其值,因为系统在单一 GNU Make 执行环境(其中所有变量都是全局的)中解析所有构建控制文件。 在描述每个模块之前,必须声明(重新声明)此变量。
LOCAL_MODULELOCAL_MODULE 变量将存储您要构建的模块的名称
LOCAL_SRC_FILESLOCAL_SRC_FILES 枚举源文件,以空格分隔多个文件。LOCAL_SRC_FILES 变量必须包含要构建到模块中的 C 和/或 C++ 源文件列表。
BUILD_SHARED_LIBRARY这一行帮助系统将所有内容连接到一起。
Application.mk
我们再来看一下Application.mk的例子:
APP_PLATFORM := android-9APP_STL := gnustl_static
下面我们分别解释一下每行的作用:
APP_PLATFORM此变量包含目标 Android 平台的名称。NDK API 级别与 Android 版本对照表如下:
NDK 支持的 API 级别 Android 版本 9 2.3 到 3.0.x 12 3.1.x 13 3.2 14 4.0 到 4.0.2 15 4.0.3 和 4.0.4 16 4.1 和 4.1.1 17 4.2 和 4.2.2 18 4.3 19 4.4 21 4.4W 和 5.0 APP_STL默认情况下,NDK 构建系统为 Android 系统提供的最小 C++ 运行时库 (system/lib/libstdc++.so) 。 该指令可以让您在自己的应用中使用或链接的替代 C++ 实现。
APP_CFLAGS构建系统在仅构建 C++ 源文件时传递到编译器的一组 C++ 编译器标志。
APP_ABI您可以使用 APP_ABI 选择编译出不同的 ABI 目标环境代码。
APP_OPTION可定义变量为 release 或 debug。在构建应用的模块时可使用它来更改优化级别。
小结
通过上面的分析,我们可以知道 Google 为了开发者更容易的开发 NDK程序,给我们提供了一套交叉编译的工具,大大降低了我们开发NDK程序的难度。
另外我们也学习了一下如何编写 Android.mk 和 Application.mk 及其语法。
猜你喜欢
- 2024-10-27 NDK开发——FFmpeg视频解码 ffmpeg ndk
- 2024-10-27 Camera基本代码架构 camera calibrator
- 2024-10-27 android 功耗分析方法和优化(1) 功耗app
- 2024-10-27 Cocos Creator v2.3.2 发布了!全新 Launcher 效率飞起!
- 2024-10-27 如何androd动态注册编写计算器 淘宝动态评分计算器在线
- 2024-10-27 高通平台OV8856 Camera的bring up总结
- 2024-10-27 高通平台移植GC2145 Camera驱动 高通驱动安装
- 2024-10-27 《坎公骑冠剑》光炮Android Mk.99技能与背景故事
- 2024-10-27 ubuntu移植libwebp到Android平台 ubuntu移植到arm
- 2024-10-27 步步为营,十分钟学会 Native JNI(附带彩蛋)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)