一、先在android源码目录下的development目录下新建文件夹test123
在该目录中新建3个文件:testhw.c、max.c Android.mk
库源文件max.c内容如下:
int max(int x,int y) { return x>y?x:y; }
主程序文件testhw.c内容如下:
#include<stdio.h> extern max(int,int);//声明是外部函数 int main() { int a=5,b=3,c; c=max(a,b);//隐式调用库函数 printf("%d与%d相比,%d大。/n",a,b,c); return 0; }
Android.mk文件内容如下:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := max.c LOCAL_PRELINK_MODULE := false LOCAL_MODULE := libmax LOCAL_MODULE_TAGS := optional //指在所有方式下都编译 include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_SRC_FILES := testhw.c LOCAL_CFLAGS := -lmax LOCAL_LDFLAGS := -Lout/target/product/generic/obj/lib //指明要链接的动态库所在的目录 LOCAL_SHARED_LIBRARIES := libmax LOCAL_MODULE := testhw LOCAL_MODULE_TAGS := optional include $(BUILD_EXECUTABLE)
注意:每个模块编译时都加了这一句:LOCAL_MODULE_TAGS := optional,是指在各种方式下都编译,如果不加的话会提示: Add "LOCAL_MODULE_TAGS := optional" in the build/core/base_rules.mk:91: * Android.mk for the affected module,编译不能通过.
二、编译
编译前要先设置环境变量:
#交叉编译工具路径 export PATH=$(pwd)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH #设备的体系架构和交叉编译器 export ARCH=arm export SUBARCH=arm export CROSS_COMPILE=arm-eabi- #模拟器emulator路径 export PATH=$PATH:$(pwd)/out/host/linux-x86/bin #ANDROID_PRODUCT_OUT环境变量 export ANDROID_PRODUCT_OUT=$(pwd)/out/target/product/generic
也可以把上述命令放到一个sh文件中运行这个文件就可以,如
~/Android$. ./path.sh
进入到android源码目录下,执行make testhw如下:
/work/androidsrc$ make testhw 注意是make + 模块名,不是文件夹名,此处本来是用test,但由于以前已经有这个模块,编译时报错不能通过,故才改为testhw
为什么在android源码目录下,执行make testhw就会编译这个模块???
development目录是应用程序开发目录,应用程序的编译可能通过这种方式,要android源码单独模块的开发是另外一种方式,可见前面的文章。
三、运行
1、先启动模拟器:/work/androidsrc$ emulator -kernel kernel/goldfish/arch/arm/boot/zImage &
2、把libmax.so库push到模拟器的 system/lib下(必须是该目录下,应用程序才能找到这个库),命令如下:
/work/androidsrc$ adb push out/target/product/generic/system/lib/libmax.so /system/lib
此时可能出现如下错误:failed to copy 'out/target/product/generic/system/lib/libmax.so' to '/system/lib/libmax.so': Read-only file system
解决办法:重新挂载,并修改system文件夹的访问权限
/work/androidsrc$ adb remount
/work/androidsrc$ adb shell
# chmod 777 system
# exit
继续执行push命令,又出现如下错误: Out of memory
解决办法:/work/androidsrc$ emulator -partition-size 1024 -kernel kernel/goldfish/arch/arm/boot/zImage &
3、把testhw push到data目录下,其他的目录也可以哦
/work/androidsrc$ adb push out/target/product/generic/system/bin/testhw /data
4、用adb shell命令进入模拟器的控制台,事先模拟器要先起来。
/work/androidsrc$ adb shell
进入testhw所在目录,运行程序
# cd data
# ./testhw 可以看到结果:5与3相比,5大。