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)/development/hello/
目
录编写hello.c
文件,hello.c的内容当然就是经典的HelloWorld程序:
|
#
include
<
stdio.
h>
int
main(
)
{
printf
(
"Hello World!/n"
)
;
return
0;
}
|
3.在$(YOUR_ANDROID)/development/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
:
=
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
,
通过”adb push”将它传送到模拟器上,再通过”adb shell”登录到模拟器终端,就可以执行了
原文地址:http://blog.youkuaiyun.com/swt914/archive/2010/05/07/5568004.aspx