65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 NDK Build Tools 构建 Android 命令行应用程序

2016年1月14日

CPOL

7分钟阅读

viewsIcon

27326

本文介绍了如何编写一个简单的“Hello World”应用程序,并使用远程 shell 在 Android 设备上运行它。

Intel® Developer Zone 提供用于跨平台应用开发的工具和操作方法信息、平台和技术信息、代码示例以及同行专业知识,以帮助开发人员创新和成功。加入我们的社区,获取 Android物联网Intel® RealSense™ 技术Windows 的工具,访问开发工具包,与志同道合的开发人员分享想法,并参与黑客马拉松、竞赛、路演和本地活动。

引言

通常,库和测试应用程序使用 C/C++ 编写,用于在 Windows* 上测试硬件和软件功能。当这些相同的功能添加到 Android* 平台时,用 Java* 重写这些库和测试是一项艰巨的任务。最好是直接移植现有的 C/C++ 代码,但许多人认为这些库和测试需要作为基于 Java 的 Android 应用程序进行访问。但情况并非总是如此。如果要移植的代码是用 ANSI C/C++ 编写的,并且没有任何特定于操作系统的依赖项,则可以使用 Android NDK 构建工具对其进行重建,并像在 Windows 命令提示符下运行命令行应用程序一样,通过 shell 中的命令行运行它。

本文介绍了如何编写一个简单的“Hello World”应用程序,并使用远程 shell 在 Android 设备上运行它。

设置开发环境

下载并安装 Android NDK

前往 https://developer.android.com.cn/ndk/downloads/index.html 并下载适用于您操作系统的相应 NDK。按照说明将 NDK 解压缩并安装到您的计算机上。

设置构建环境

修改您的路径环境变量以指示 NDK 目录的位置。这允许您在计算机上的任何其他位置运行 NDK 构建工具,而无需指定工具的完整路径。

在 Linux* 上,您可以使用以下命令修改本地 shell 的变量

export PATH=$PATH:/your/new/path/here

如果您希望更改是永久性的,并且每次打开 shell 时都存在,请将以下行添加到您的 ~/.profile 或 /etc/profile

PATH=$PATH:/your/new/path/here

图 1. 修改路径环境变量。

在 Windows 上,您可以通过打开控制面板 > 系统和安全 > 系统 > 高级系统设置 > 环境变量来修改环境变量。在“系统变量”列表中找到您的路径变量,然后单击“编辑”。在最后一个路径的末尾添加一个分号,然后将您的 NDK 路径添加到末尾。在每个对话框上单击“确定”。

图 2. 修改环境变量。

编写代码和构建脚本

创建您的 makefile

要为 Android 构建,您至少需要两个 makefile:Android.mkApplication.mkAndroid.mk 类似于您可能熟悉用于从命令行在 Linux 上构建的 makefile。在此文件中,您可以定义要构建的源文件、头文件包含目录、编译器标志选项、库及其位置、模块名称等等。Application.mk 用于指定 Android 特定的属性,例如目标 Android 平台、SDK 版本和平台架构。

图 3. Android.mk makefile。

Android.mk(图 3)中,您可以看到指定了 LOCAL_PATH 目录。这会初始化为当前目录,以便您可以在构建环境中使用相对于其他文件和目录的路径。

包含 CLEAR_VARS 的行清除可能已从以前的构建或具有多个 makefile 的更复杂构建中设置的现有局部变量。

LOCAL_MODULE 变量指定您正在创建的二进制文件的输出名称。

LOCAL_C_INCLUDES 变量指定您希望预处理器搜索其他包含文件的目录。

LOCAL_SRC_FILES 变量指定您希望为此应用程序/库构建的特定源文件。将您的 .c 或 .cpp 文件放在此处。

最后一行是表示构建可执行文件而不是库的关键部分。大多数原生代码都构建到 Android 应用程序的库中,但将 Android.mk 中的值更改为 $(BUILD_EXECUTABLE) 将生成一个可执行文件。

图 4. Application.mk makefile。

Application.mk(图 4)中,第一行指示为 x86 而不是 ARM 进行构建。这告诉 NDK 使用正确的工具链用于 x86 目标架构。

第二行指定要构建的平台。在本例中,它是版本 21,适用于 Android 5.0,也称为 Lollipop*。

第三行指示使用标准库运行时的静态版本。

最后一行指示此应用程序的主 makefile 的名称。

编写您的应用程序

Android 中的命令行应用程序的编写方式相同,无论平台如何。图 5 显示了一个简单的“Hello World”应用程序示例。cout 函数用于打印到屏幕,myPrint() 在另一个文件中定义。

图 5. 一个简单的“Hello World”应用程序示例。

图 6. 项目和源文件的文件夹结构布局。

构建您的应用程序

要让 ndk-build 脚本构建应用程序,首先创建一个项目文件夹。在该文件夹中,创建一个名为 jni 的文件夹。在 jni 文件夹中,放置 Android.mk 文件、Application.mk 文件和源文件。

然后在终端中导航到项目文件夹并执行 ndk-build。ndk-build 是一个位于 NDK 安装目录根文件夹中的脚本。ndk-build 脚本将解析项目目录及其子文件夹并构建应用程序。

由于此示例是关于构建命令行应用程序的,因此将其构建在 jni 文件夹下的结构意义不大,因为没有 Java 代码或任何与 Java 接口的代码。但是,删除 jni 文件夹会导致构建过程中必须采取另外两个步骤。

第一步是指定 NDK 项目路径。在这里,它被设置为当前工作目录的点号 (.)。

export NDK_PROJECT_PATH=.

然后导航到项目目录并使用 ndk-build 脚本。第二步是指定 Application.mk 文件在哪里。将其放在项目目录中,因此构建命令如下所示

ndk-build NDK_APPLICATION_MK=./Application.mk

这会打印您的编译步骤、可执行文件创建以及它“安装”您的应用程序的位置。在本例中,它在您的项目目录下创建一个 libs 目录。在 libs 目录中,它将创建一个 x86 目录并将您的可执行文件放在其中。

图 7. 构建命令。

下面是包含源代码和构建输出的项目树。

图 8. 包含源代码和构建输出的项目树。

部署应用程序

安装您的应用程序

为了安装您的应用程序,您需要一台主机以及从该主机到 Android 设备的 adb(Android 调试桥)连接。您需要使用 adb 连接到设备。adb 应用程序随 Android SDK 提供,可以作为平台工具包的一部分下载。将您的应用程序移动到您的主机(在本例中为 main.out)。在命令提示符中使用 adb,您可以将文件推送到您的 Android 设备。

adb push /path/to/your/file /data/path/to/desired/folder/

图 9. 在命令提示符中使用 adb。

现在 main.out 可执行文件已在您指定的文件夹中的 Android 设备上。

运行您的应用程序

要运行您的应用程序,首先您需要打开一个 shell 到您的设备。您可以使用 adb shell 命令完成此操作。现在您已经打开了一个类似 Unix* 的 shell。

更改到您存储示例的目录。但是,您还不能执行它。在 Unix 系统上,文件需要标记为可执行文件才能运行。您可以使用 chmod 命令完成此操作。

现在您已准备好运行您的命令行应用程序。通过键入 ./<文件名> 或在本例中为 ./main.out 来执行它。

图 10. 运行应用程序。

恭喜!您现在可以在 Android 设备上构建和运行命令行应用程序。

作者简介

Gideon Eaton 是 Intel® 软件和服务集团的成员,与独立软件供应商合作,帮助他们优化其软件以适应 Intel® Atom™ 处理器。过去,他曾在一个团队中工作,该团队为运行 Android 操作系统的平台编写 Linux* 图形驱动程序。

© . All rights reserved.