Android编译环境本身比较复杂,且不像普通的编译环境:只有顶层目录下才有Makefile文件,而其他的每个component都使用统一标准的
Android.mk.
Android.mk文件本身是比较简单的,不过它并不是我们熟悉的Makefile,而是经过了
Android自身编译系统的很多处理,因此要真正理清楚其中的联系还比较复杂,不过这种方式的好处在于,编写一个新的
Android.mk来给
Android增加一个新的Component会比较简单。 编译
java程序可以直接采用Eclipse的集成环境来完成,这里就不重复了。我们主要针对C/C++来说明,下面通过一个小例子来说明,如何在
Android 中增加一个C程序的Hello World:
1. 在$(YOUR_
Android)/ development 目录下创建hello目录,其中$(YOUR_
Android)指
Android源代码所在的目录。
- # mkdir $(YOUR_
Android)/development/hello
2. 在$(YOUR_
Android)/external/hello/目录编写hello.c文件,hello.c的内容当然就是经典的HelloWorld程序:
#include <stdio.h>
int main(int argc, char **argv)
{
printf("Hello World!/n");
return 0;
}
3. 在$(YOUR_
Android)/external/hello/目录编写
Android.mk文件。这是
Android Makefile的标准命名,不要更改。
Android.mk文件的格式和内容可以参考其他已有的
Android.mk文件的写法,针对helloworld程序的
Android.mk文件内容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= hello.c
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := helloworld
include $(BUILD_EXECUTABLE)
注意上面LOCAL_SRC_FILES用来指定源文件;,LOCAL_MODULE指定要编译的模块的名字,下一步骤编译时就要用到;include $(BUILD_EXECUTABLE)表示要编译成一个可执行文件,如果想编译成动态库则可用BUILD_SHARED_LIBRARY,这些可以在$(YOUR_
Android)/build/core/config.mk查到。
4. 回到
Android源代码顶层目录进行编译:
# cd $(YOUR_
Android) ;; make helloworld
注意make helloworld中的目标名helloworld就是上面
Android.mk文件中由LOCAL_MODULE指定的模块名。编译结果如下:
target thumb C: helloworld <= development/hello/hello.c
target Executable: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_
intermediates/LINKED/helloworld)
target Non-prelinked: helloworld (out/target/product/generic/symbols/system/bin/helloworld)
target Strip: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/helloworld)
Install: out/target/product/generic/system/bin/helloworld
5.如上面的编译结果所示,编译后的可执行文件存放在out/target/product/generic/system/bin/helloworld目录
启动
Android模拟器,用如下命令将文件push到
Android模拟器上:
注意: 要把SDK目录里的tools目录放到PATH环境变量中.
adb shell mkdir /dev/sample
adb push hello /dev/sample/hello
adb shell chmod 777 /dev/sample/hello
先创建 /dev/sample目录,再将编译好的hello上传上去,最后将hello改成可执行的。
再进入命令行模式,进入
Android的shell环境:
adb shell
#cd /dev/sample
#./hello