命令行工具移植为android库,使用 NDK 构建工具构建 Android* 命令行应用

简介

库和测试应用通常使用 C/C++ 编写而成,用于在 Windows* 上测试软硬件的特性。 当这些相同的特性添加至 Android* 平台时,用 Java* 重新编写这些库和测试应用将是一项浩大的工程。 最好能够简单地移植现有 C/C++ 代码,但许多人认为,这些库和测试应用需要以基于 Java 的 Android 应用的形式进行访问。 但这种情况并不多见。 如果待移植的代码使用 ANSI C/C++ 编写而成,不具有任何特定于操作系统的相关性,可以通过 Android NDK 构建工具重新构建,并通过 shell 中的命令行运行,其方式大体类似于通过 Windows 中的命令提示窗口运行命令行应用。

本文将介绍如何编写简单的 “Hello World” 应用,并通过远程 shell 在 Android 设备上运行该应用。

设置开发环境

下载并安装 Android NDK

设置构建环境

修改路径环境变量,以显示 NDK 目录的位置。 这样有利于您从电脑的其他任意位置运行 NDK 构建工具,无需指定工具的完整路径。

在 Linux*上,您可以通过以下命令修改针对本地 shell 的变量:

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

如果希望修改永久保存,并在开机时显示在各 shell 中,将以下命令行添加至您的 ~/.profile 或 /etc/profile 中:

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

25575d1a88cf2e8a20ca7cd32e74387f.jpg

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

在 Windows 上,您可以修改环境变量,具体方法是:打开 Control Panel > System and Security > System > Advanced system settings > Environment Variables。 找到系统变量列表中的路径变量,然后单击 Edit。 在最后一条路径的结尾部分添加一个分号,然后添加 NDK 路径。 在对话框中单击 OK。

f0d8ef260f857b9e7160e3365550c901.jpg

图 2. 修改环境变量。

编写代码并构建脚本

创建 makefile

如欲面向 Android 构建,至少需要两个 makefile: Android.mk 和 Application.mk。 Android.mk 类似于您通过命令行在 Linux 上构建时所熟悉的 makefile。 在该文件中,您可以定义要构建的源文件,标头包括目录、编译器标记选项、库及其位置、模块名称等。 Application.mk 用于指定特定于 Android 的属性,比如目标 Android 平台、SDK 版本和平台架构。

0c1a5b32baba206d358cf1177f1ab177.jpg

图 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),将产生可执行文件。

90e593d71bbe6c0a975945e32ad9b946.jpg

图 4. Application.mk makefile。

在 Application.mk(图 4)中,第一行表示该构建面向 x86,而非 ARM。 这样可以告知 NDK 使用面向 x86 目标架构的相应工具链。

第二行指定构建的目标平台。 在这一行中,它的版本是 21,即面向 Android 5.0(也称为 Lollipop*)。

第三行表示静态版标准库运行时的用途。

最后一行表示该应用主要 makefile 的名称。

编写应用

无论是哪种平台,Android 中的命令行应用采用同样的方法编写。 图 5 显示了简单 “Hello World” 应用示例。 cout 函数用于打印至屏幕,myPrint() 在其他文件中定义。

e54c2e4b7c50d0b87946701ab0c3c324.jpg

图 5. 简单 “Hello World” 应用示例。

图 6 显示了项目和源文件的文件夹结构布局。

fd2e516d6cb4e214d7e258badba07197.jpg

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

构建应用

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

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

由于该示例涉及构建命令行应用,而没有任何 Java 代码或与 Java 相配的其他代码,因此 jni 文件夹下方支持构建的结构几乎没有什么意义。 不过,删除 jni 文件夹后,在构建过程中必须采取其他两个步骤。

第一个步骤是指定 NDK 项目路径。 这里,设置为面向当前工作目录的 dot (.)。

export NDK_PROJECT_PATH=.

然后导航至项目目录,并使用 ndk-build 脚本。 第二个步骤是指定 Application.mk 文件的位置。 将其放入项目目录,那么构建命令将如下所示:

ndk-build NDK_APPLICATION_MK=./Application.mk

这样可打印您的编译步骤、可执行文件的创建,以及应用的“安装”位置。 在本案例中,它在项目目录下方创建库目录。 在该库目录中,它将创建 x86 目录并将可执行文件放在该目录中。

f02530511701b122bcf4ce6ea3482ec3.jpg

图 7. 构建命令。

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

55ddb5f348524e6b9a252653471e2864.jpg

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

部署应用

安装应用

如欲安装应用,您需要一台主机以及 adb(Android 调试桥接器)连接该主机与 Android 设备。 您需要使用 adb 连接设备。 adb 应用附带 Android SDK,能够作为平台工具捆绑的一部分下载。 将应用移至主机(本案例中为 main.out)。 在命令提示窗口中使用 adb,可以将文件推送至您的 Android 设备。

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

a54c9211e02c330efa4462f1ab8ed95f.jpg

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

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

运行应用

如欲运行应用,您首先需要为设备打开 shell。 为此,您可以使用 adb shell 命令。 现在您已打开类似 Unix* 的 shell。

切换至保存示例的目录。 尽管您现在还不能执行它。 在 Unix 系统上,文件需要标记成可执行文件,才能运行。 为此,您可以使用 chmod 命令。

现在,您已准备好运行您的命令行应用。 执行方法为:输入./,在本案例中为: ./main.out。

1cd4df21c9c4773827375c767a4c2ed0.jpg

图 10. 运行应用。

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

作者简介和照片

Gideon Eaton 现供职于英特尔® 软件与服务事业部,负责帮助独立软件厂商优化面向英特尔® 凌动™ 处理器的软件。 他曾经是团队的一名成员,该团队专门为运行 Android 操作系统的平台编写 Linux* 显卡驱动程序。

0d42c2131728d5ae0ccf0065059b4108.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值