有了上面的基础,我们就可以用 NDK 来进行项目开发了。
我们经常会遇到这样的问题,就是将一些现有的,成熟的 C 库移植到 Android 平台上。通过上面我们的介绍,我们已经知道,我们需要用 JNI 来对现有的 C 库包装一下,然后提供 Java 接口,供上层调用。
首先的问题,就是 C 库的编译和测试。其实 Android 底层用的是 Linux 的内核,所以,和其他 Linux 程序开发一样,无法使进行交叉编译。不过, Android 有些特殊的地方,我们需要注意。下面就以一个很简单的例子,讲讲如何应用 NDK ,做一个 C 的应用终端测试程序。
首先,创建 study-hadr/study-hard.c 文件,程序非常简单,就是 Hello World 的 c 程序。
#include <string.h>
#include <stdio.h>
static char s_string[] = "Study hard!";
int main()
{
printf("%s\n", s_string);
return 0;
}
别看程序很简单,不过这个程序的编译可不简单。
若是在 Linux 下,只需要执行:
gcc –o study-hard study-hard.c 就可以生成应用程序 study-hard 了。
在 Android 下就不是这么简单了。在 Window 环境开发环境下,用到的交叉工具链,目录是 \android-ndk-r4\build\prebuilt\windows\arm-eabi-4.4.0 。 在这个目录的 bin 路径下,你会看到 arm-eabi 为前缀的诸多工具,这些就是 Android 用的编译工具。那么 c 库和 c 头文件又在哪里呢?对于 Android ,不同的 Platform ,有不同的库和头文件,需要我们自己选择。比如,现在我们要用 Platform5 ,那么
C 头文件的路径为:
\android-ndk-r4\build\platforms\android-5\arch-arm\usr\include
C 库的路径为:
\android-ndk-r4\build\platforms\android-5\arch-arm\usr\lib
好了,我们知道了 C 的编译工具链,知道了 C 库路径和 C 头文件路径,应该可以编译了。写个简单的 Makefile ,试一下,结果出错了。 crt0.o 没有找到。