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_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 查到。每个模块都必须有LOCAL_MODULE_TAGS声明,可选的参数是optional, debug, eng, tests, samples。如果选择optional,此模块在某一产品的所有编译中存在。还需要把LOCAL_MODULE加入产品的PRODUCT_PACKAGES,如果该模块需要加入所有的产品,在build/target/product/core.mk文件中添加。build/target/product/目录下的编译文件指定,产品如何编译,比如包含哪些包和模块。

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” 登录到模拟器终端,就可以执行了。

更多相关文章

  1. (安卓/android)dex2oat与应用安装时间优化
  2. 32位ubuntu10.04编译Android4.0.1内核
  3. android中c/c++程序的调试(eclipse)
  4. 分析Android(安卓)根文件系统启动过程(init守护进程分析)
  5. android recovery模式及ROM制作
  6. Android代码混淆指南
  7. Android架构分析之基于Android系统的C应用程序开发
  8. Android开发指南中文版(二)Application Fundamentals
  9. NPM 和webpack 的基础使用

随机推荐

  1. Mysql最新版8.0.21下载安装配置教程详解
  2. MySQL是如何保证数据的完整性
  3. MySQL忘记root密码错误号码1045的解决办
  4. MySQL数据库查询性能优化策略
  5. mysql免安装版步骤解压后找不到密码处理
  6. mysql8.0.21下载安装详细教程
  7. MySQL8.0.21.0社区版安装教程(图文详解)
  8. 关于mysql自增id,你需要知道的
  9. 简述mysql监控组复制
  10. MySQL查询语法汇总