现在的位置: 首页 > 综合 > 正文

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

2018年06月10日 ⁄ 综合 ⁄ 共 2260字 ⁄ 字号 评论关闭

一、先在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大。

抱歉!评论已关闭.