android源码环境下动态链接库so的隐式调用

来源:互联网 发布:不用网络的好游戏 编辑:程序博客网 时间:2024/06/05 09:38

一、先在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.cLOCAL_PRELINK_MODULE := falseLOCAL_MODULE := libmaxLOCAL_MODULE_TAGS := optional //指在所有方式下都编译include $(BUILD_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_SRC_FILES := testhw.cLOCAL_CFLAGS := -lmaxLOCAL_LDFLAGS := -Lout/target/product/generic/obj/lib  //指明要链接的动态库所在的目录LOCAL_SHARED_LIBRARIES := libmaxLOCAL_MODULE := testhwLOCAL_MODULE_TAGS := optionalinclude $(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=armexport SUBARCH=armexport 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大。

原创粉丝点击