Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1080069
  • 博文数量: 226
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 2504
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-21 14:12
文章分类

全部博文(226)

文章存档

2011年(1)

2010年(2)

2009年(68)

2008年(4)

2007年(27)

2006年(124)

我的朋友

分类: LINUX

2009-05-31 21:28:08

在以前的一篇博客中,学习了Android原生(Native)C开发之的环境搭建。

这样就可以在android中编译native c程序了。今天要学习的是如何在android的源文件中增加一个新的模块。

Android编译环境本身比较复杂,且不像普通的编译环境:只有顶层目录下才有Makefile文件,而其他的每个component都使用统一标准的Android.mk. Android.mk文件本身是比较简单的,不过它并不是我们熟悉的Makefile,而是经过了Android自身编译系统的很多处理,因此要真正理清楚其中的联系还比较复杂,不过这种方式的好处在于,编写一个新的Android.mk来给Android增加一个新的Component会比较简单。

下面通过一个小例子来说明,如何在Android 中增加一个只包含一个C程序Hello World的模块:

1. $(YOUR_ANDROID)/ external目录下创建hello目录,其中$(YOUR_ANDROID)Android源代码所在的目录。
- # mkdir $(YOUR_ANDROID)/
external/hello

2. $(YOUR_ANDROID)/external/hello/目录编写helloworld.c文件


#include <stdio.h>

int main()
{
    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:=        \

    helloworld.c

 

LOCAL_MODULE:= helloworld

 

LOCAL_C_INCLUDES := $(KERNEL_HEADERS)

 

LOCAL_CFLAGS :=

 

LOCAL_SHARED_LIBRARIES := libcutils

 

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 <= external/hello/helloworld.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”登录到模拟器终端,就可以执行了



阅读(2821) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~