这是关于Android下C开发的资料,基于Linux系统。 1.软件准备(可参见【搭建Android系统入门】) (1)操作系统ubuntu安装 在windows系统中使用wubi安装ubuntu-deskt-i386系统(版本8.04及以上)。 (2)系统软件下载 打开ubuntu终端,输入sudo apt-get install命令来通过ubuntu服务器在线安装需要 使用的软件,这里不需要选择软件版本,ubuntu服务器会做自动的版本匹配。待安装的软 件有flex,bison,gperf,libsdl- dev,libesd0-dev,libwxgtk2.6-dev,build-essen tial,python,valgrind,curl,git(ubuntu10.04及以上版本安装git-core)。执行命 令后使用 which命令验证是否安装成功,注意,如果缺少部分软件,或者安装没有成功, 编译通常都会遇到问题,无法完成。 (3)下载安装JDK1.5(只能是1.5版本) 将下载的jdk_1.5.0_22.bin安装到/usr目录下, # cp $JDK$/jdk_1.5.0_22.bin /usr 其中$JDK$为下载的jdk_1.5.0_22.bin所在目录。然后进入/usr目录。 # cd /usr 执行一下命令安装jdk_1.5.0_22 # ./ jdk_1.5.0_22.bin 出现提示后输入yes进行安装,安装完成后,使用一下命令设置java环境变量。 # export JAVA_HOME=/usr/jdk1.5.0_22 # export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar # export PATH=$PATH:$JAVA_HOME/bin 然后输入java –version查看jdk是否安装成功,若出现java版本信息,表明安装成功 。 以上在终端设置的java环境变量只是暂时有效,若要使jdk长期有效,需修改系统配置 文件bashrc执行 # gedit /etc/bash.bashrc (或vim /etc/bash.bashrc) 在打开的bash.bashrc文件末尾添加 export JAVA_HOME=/usr/jdk1.5.0_22 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin 然后保存修改。 (4)准备android源文件 在/home目录下创建android目录,并在创建的android目录下创建bin目录。通过执行 一下命令完成: # mkdir /home/android # mkdir /home/android/bin 将android_2.2.tar.gz文件放入 /home/android,假定android_2.2.tar.gz所在目录 为$android_2.2.tar$,执行下列命令 # cp $android_2.2.tar$/android_2.2.tar.gz /home/android 在ubuntu中将该文件加压,发现/home/android目录下多出android_2.2目录,将该目 录中的所有文件移动至/home/android目录下 # mv –r /home/android/android_2.2/* /home/android # rm –r /home/android/android_2.2 2.android编译环境搭建 (1)android源码编译 将android安装在/home/android/目录下后,进入 /home/android # cd /home/android 使用make命令编译android源码 # make 编译源码大约持续1个多小时(双核CPU可用命令 #make -j2,四核CPU用命令#make - j4提高编译速度)。 (2)设置android的image路径 编译完成后应该可以看到/home/android/out/target/product/generic/目录下面有s ystem.img以及ramdisk.img两个镜像文件,android模拟器运行时要加载这两个文件。设置 环境变量,在终端执行 # export ANDROID_PRODUCT_OUT=/home/android/out/target/product/generic 若要使环境变量永久有效,在/etc/bash.bashec文件末尾加上 export ANDROID_PRODUCT_OUT=/home/android/out/target/product/generic (3)调出模拟器(emulator) 环境搭建好之后,可以调出模拟器 # cd /home/android/out/host/linux-x86/bin # ./emulator 出现模拟器界面后先不要关闭,下面的helloworld会在模拟器中测试。 (4)设置模拟器环境变量 为了在每次调用模拟器(或其他命令,如adb)时不进入模拟器所在目录,需要设置环 境变量,使用下列命令 # export PATH=$PATH:/home/android/out/host/linux-x86/bin 若要使环境变量永久有效,需要在/etc/bash.bashrc末尾添加 export PATH=$PATH:/home/android/out/host/linux-x86/bin 这样每次启动shell终端后可直接运行emulator命令启动模拟器。 3.helloworld测试 (1)设置mm命令 要编译一个单独的模块,需要使用mm命令。开启另一个终端(可使用Ctrl+Shift+N键 ),执行如下命令,否则mm命令可能无法执行。 # source build/envsetup.sh 若要设置mm永久有效,需要在/etc/bash.bashrc末尾添加source / home/android/build/envsetup.sh。 (2)创建helloworld源程序以及make文件 在/home/development/目录下创建hello目录 # cd /home/android/development # mkdir hello 通过一下命令更改hello目录的权限,便于访问或创建文件。 # chmod 755 ./hello 在创建的hello目录下创建hello.c和Android.mk两个文件。 编写hello.c程序: #include <stdio.h> int main() { printf("Hello World!/n"); return 0; } 编写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查到。 另外,Android.mk文件中由LOCAL_MODULE指定的模块名helloworld即为目标文件。 (3)编译hello.c文件 首先进入/home/android/development/hello目录,然后使用mm命令编译hell.c文件 # cd /home/android/development/hello # mm 如果输出“Install: out/target/product/generic/system/bin/helloworld”表示编 译完成,生成的目标文件helloworld 在/home/android/out/target/product/generic/s ystem下面。 (4)登陆模拟器运行helloworld 要运行编译生成的helloworld文件,需将Linux系统下的helloworld文件拷贝到andro id模拟器下。这里先使用adb shell登录模拟器,在模拟器中创建一个目录存放编译生成的 helloworld文件。adb位于Linux系统/home/android/out/host/linux-x86/bin目录下,如 果已经设置好了模拟器环境变量,则可直接在终端执行adb shell命令登陆模拟器;若尚未 设置好模拟器环境变量,则进入/home/android/out/host/linux-x86/bin目录调用adb登录 模拟器 # cd /home/android/out/host/linux-x86/bin 运行adb shell登录模拟器 # ./adb shell 登录模拟器需等待模拟器初始化完成(之前已使用./emulator启动),否则会出现如 下错误: * daemon not running. starting it now * * daemon started successfully * error: device offline 当终端上出现#时, 表明adb登录成功。 模拟器根目录下有一个dev目录,在该目录下创建如下project,再在project目录下创 建hello目录。 #mkdir /dev/project #mkdir /dev/project/hello 创建完成之使用exit命令后返回linux系统终端。然后用adb push命令将位于Linux系 统中的helloworld文件拷贝到android模拟器中。 # ./adb push /home/android/out/target/peoduct/generic/system/bin/helloworl d /dev/project/hello 注:可以使用adb pull ,push 命令将文件复制到一个模拟器/设备实例的数据文件或 是从数据文件中复制。install 命令只将一个.apk文件复制到一个特定的位置,与其不同 的是,pull 和 push 命令可令你复制任意的目录和文件到一个模拟器/设备实例的任何位 置。 从模拟器或者设备中复制文件或目录,使用(如下命): adb pull <remote> <local> 将文件或目录复制到模拟器或者设备,使用(如下命令) adb push <local> <remote> 在这些命令中, <local> 和<remote> 分别指通向自己的发展机(本地)和模拟器/设 备实例(远程)上的目标文件/目录的路径 然后再登录模拟器,进入模拟器下的/dev/project/hello目录,运行helloworld。 # ./adb shell #cd /dev/project/hello #./helloworld 若输出 Hello World!说明运行成功。