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大。
- android源码环境下动态链接库so的隐式调用
- Android下动态链接库.so调用的简单例子
- Android下动态链接库.so调用的简单例子
- Android下动态链接库.so调用的简单例子
- linux下动态链接库(.so)的显式调用和隐式调用
- linux下动态链接库(.so)的显式调用和隐式调用
- linux下动态链接库(.so)的显式调用和隐式调用
- linux下动态链接库(.so)的显式调用和隐式调用
- linux下动态链接库(.so)的显式调用和隐式调用
- linux下动态链接库(.so)的显式调用和隐式调用
- Ubuntu环境下使用Unity3D调用C++编写的Linux so动态链接库
- Android下使用dlopen函数动态调用.so链接库
- Android下使用dlopen函数动态调用.so链接库
- Android下使用dlopen函数动态调用.so链接库
- Android studio下的Android JNI调用以及动态链接库.so的生成
- ndroid下动态链接库.so调用的简单…
- ndroid下动态链接库.so调用的简单…
- android 中调用 so 动态链接库
- feof()和EOF的用法—— C中文件结尾的判断
- Linux多线程编程小结
- Android学习记录五(活动、服务、内容提供者、广播接收者)
- 第六周项目三:平面坐标点类
- 第六周项目六----工资类
- android源码环境下动态链接库so的隐式调用
- Java 读文件的几种方法
- Python开发:关于Else语句的总体理解
- 栈
- 富士通收购法国云服务初创公司RunMyProcess
- Linux 下各个目录的作用
- 读懂岁月
- 输入一个整数,判断该整数是否是回文!
- OA JBPM中的公文(发文、收文)流程