我的环境:
Ubuntu12.04
Android2.2
这里的C语言程序指的是运行与android系统的Linux内核上程序,目前为止有两种方法:第一种是自动编译,第二种是手动编译。这两种方法适用于不同的情况,自动编译方便快捷,但无法在编译时添加非Android的库;手动编译略显复杂,尤其是在不同的Android系统中会有不同的路径,但可以加入除Android以外的库进行编译。
1 自动编译
(1)在$(yourAndroid)/development目录下,创建一个test目录,其中$(yourAndroidDir)代表你的Android源代码的根目录,下面的同样如此,不再赘述
$ mkdir $(yourAndroidDir)/development/test
(2)在test目录下,编写test.c文件,测试内容如下:
#include
int main()
{
printf("test output/n");
exit(0);
}
(3)在test目录下,创建Android.mk文件,添加内容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.c
include $(BUILD_EXECUTABLE)
其中:
LOCAL_MODULE指定要编译的模块名
LOCAL_SRC_FILES 指定源文件路径
include $(BUILD_EXECUTABLE)指定编译成可执行文件,若改为include $(BUILD_EXECUTABLE),则指定编译成动态链接库
(4)回到Android源代码根目录,开始编译
$ cd $(yourAndroidDir)
$ make test
(5)将代码加入到Android系统中,前提是你需要已经开启了一个Android模拟器
$ adb push test /data
这样一来,编译好的test可执行文件就被拷贝到Android系统的/data路径下了
(6)运行程序,需要进入adb shell,然后输入下面的命令,即可运行程序,会在shell下看到输出结果。
$ cd data
$ ./test
2 手动编译
(1)编译成目标文件,即.o文件
$ $(yourAndroid)/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc -I bionic/libc/arch-arm/include/ -I bionic/libc/include -I bionic/libc/kernel/common -I bionic/libc/kernel/arch-arm -c test.c -o test.o命令类似Linux下的gcc编译格式,当然这其中可以加入你自己编译时需要的非Android库
(2)生成可执行代码
$ $(yourAndroid)/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc -nostdlib -Bdynamic -Wl,-T,build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -o test -Lout/target/product/generic/obj/lib -Wl,-rpath-link=out/target/product/generic/obj/lib -lc test.o -entry=main
(3)将代码加入到Android系统中并运行,和上面的自动编译方法相同,不再重复。
注意,有时候运行了C语言的程序后,会有下面的输出:
[1] + Stopped (signal) ./test
原因是源文件.c文件中会有“return 0”这样的语句,出现这个的原因是return调用造成堆栈下溢
将 “return 0”改为 “exit(0)” 即可解决这个问题。