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. CrossWalk - Android 动态加载so库文件
  2. Unexpected namespace prefix "xmlns" found for tag LinearLayo
  3. Android下使用TinyXml读取xml配置文件(Cocos2d-x游戏开发)
  4. Android创建文件夹
  5. android 数据库技术 | 文件系统,SDCARD访问,CONTENT PROVIDER,SQLIT
  6. Android studio 使用心得(六)---android studio 如何加载.so文件

随机推荐

  1. golang gopath如何设置
  2. docker为什么用golang开发
  3. Go安装各种第三方库、包的命令
  4. golang gin可以做什么
  5. go语言函数介绍
  6. go语言一些使用经验(精选)
  7. golang flag是什么
  8. go语言的init函数详解
  9. go语言​中的包引入、函数、变量使用
  10. golang defer什么时候执行