前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入理解使用ndk-build编译NDK程序

深入理解使用ndk-build编译NDK程序

作者头像
音视频_李超
发布2020-04-01 20:46:04
3.2K0
发布2020-04-01 20:46:04
举报
文章被收录于专栏:音视频直播技术专家

使用 ndk-build 进行 NDK 开发原理

前言

上一篇文章我给大家介绍了如何在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 命令,会看到下面的信息:

代码语言:javascript
复制
Android NDK: NDK installation path auto-detected: 
Android NDK: GNU Make version 3.81 detected
Android NDK: Host OS was auto-detected: darwin
Android NDK: Host operating system detected: darwin
Android NDK: Host CPU was auto-detected: x86
Android NDK: HOST_TAG set to darwin-x86
Android NDK: Host tools prebuilt directory: 
#这里检测到编译器地址
~/Library/Android/sdk/ndk-bundle/prebuilt/darwin-x86_64/bin 
Android NDK: Found platform root directory: 
#这里检测到 platforms 目录地址 
~/Library/Android/sdk/ndk-bundle/platforms 
#下面列出了所有支持的 platform
Android NDK: Found supported platforms: android-12 android-13 android-14 android-15 android-16 android-17 android-18 android-19 android-21 android-22 android-23 android-24 android-26 android-9 
#列出支持的目标环境 
Android NDK: PLATFORM android-12 supports: arm mips x86 
#下面是每个目标环境的的环境树
Android NDK:   ABI arm sysroot is: /Users/lichao/Library/Android/sdk/ndk-bundle/platforms/android-12/arch-arm
Android NDK:   ABI mips sysroot is: /Users/lichao/Library/Android/sdk/ndk-bundle/platforms/android-12/arch-mips
Android NDK:   ABI x86 sysroot is: /Users/lichao/Library/Android/sdk/ndk-bundle/platforms/android-12/arch-x86 

通过上面的分析我们应该已经很清楚 ndk-build 主要作什么事情了。既然 Google已经给我们提供了这么方便的交叉编译工具,那作为开发者我们还需要做哪些事情呢?

作为开发者的我们还需要做下面两件事儿:

  1. 编写 C/C++ 代码。
  2. 编写 Android.mk 和 Application.mk 两个 Makefile 片段。

Android.mk 与 Application.mk

下面我们就来看一下两个Makefile片段 Android.mk 和 Application.mk 是做什么用的。

  1. Android.mk: 目的是用于向构建系统描述源文件和共享库,它位于 $PROJECT/ni/目录中。
  2. Application.mk: 目的是描述在你的应用程序中所需要的模块(即静态库或动态库),它也位于 $PROJECT/jni/ 目录中。

下面我们分别来详细的介绍一下它们。

Android.mk

首先我们先来看一下 Android.mk的例子:

代码语言:javascript
复制
LOCAL_PATH       :=  $(call my-dir)
include              $(CLEAR_VARS)
LOCAL_MODULE     :=  hello_jni
LOCAL_SRC_FILES  :=  hello_jni.c
include              $(BUILD_SHARED_LIBRARY)

下面我们来分别解释一下每行语句的作用:

LOCAL_PATH

代码语言:javascript
复制
>>在Android.mk中必须首先定义 LOCAL_PATH 变量,此变量表示源文件在开发树中的位置。构建系统提供的宏函数 my-dir 将返回当前目录(包含 Android.mk 文件本身的目录)的路径。

>```
CLEAR_VARS 

CLEAR_VARS 变量指向特殊 GNU Makefile,可为您清除许多 LOCAL_XXX 变量,例如 LOCAL_MODULE、LOCAL_SRC_FILES 和 LOCAL_STATIC_LIBRARIES。 请注意,它不会清除 LOCAL_PATH。此变量必须保留其值,因为系统在单一 GNU Make 执行环境(其中所有变量都是全局的)中解析所有构建控制文件。 在描述每个模块之前,必须声明(重新声明)此变量。

LOCAL_MODULE

代码语言:javascript
复制
>> LOCAL_MODULE 变量将存储您要构建的模块的名称

>```
LOCAL_SRC_FILES

LOCAL_SRC_FILES 枚举源文件,以空格分隔多个文件。LOCAL_SRC_FILES 变量必须包含要构建到模块中的 C 和/或 C++ 源文件列表。

BUILD_SHARED_LIBRARY

代码语言:javascript
复制
>> 这一行帮助系统将所有内容连接到一起。


### Application.mk
我们再来看一下Application.mk的例子:

APP_PLATFORM := android-9

APP_STL := gnustl_static

APP_CFLAGS := -Wno-error=format-security

APP_ABI := armeabi armeabi-v7a arm64-v8a

APP_OPTION := release

代码语言:javascript
复制
下面我们分别解释一下每行的作用:
>```
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

代码语言:javascript
复制
>>默认情况下,NDK 构建系统为 Android 系统提供的最小 C++ 运行时库 (system/lib/libstdc++.so) 。 该指令可以让您在自己的应用中使用或链接的替代 C++ 实现。

>```
APP_CFLAGS

构建系统在仅构建 C++ 源文件时传递到编译器的一组 C++ 编译器标志。

APP_ABI

代码语言:javascript
复制
>> 您可以使用 APP_ABI 选择编译出不同的 ABI 目标环境代码。

>```
APP_OPTION

可定义变量为 release 或 debug。在构建应用的模块时可使用它来更改优化级别。

小结

通过上面的分析,我们可以知道 Google 为了开发者更容易的开发 NDK程序,给我们提供了一套交叉编译的工具,大大降低了我们开发NDK程序的难度。

另外我们也学习了一下如何编写 Android.mk 和 Application.mk 及其语法。


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用 ndk-build 进行 NDK 开发原理
    • 前言
      • NDK-BUILD做了哪些事?
        • Android.mk 与 Application.mk
          • Android.mk
        • 小结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档