发信人: yangAlbert (蓝), 信区: Android
标  题: Android开发之动态库调用
发信站: 武汉白云黄鹤站 (2011年02月20日23:20:51 星期天)

1.编写并生成Android下可用的动态库
(1)编写动态库源程序文件
    这里以my_add.c为例。首先进入/home/android/development/,该目录下创建文件夹
lib_test,更爱该目录的权限后进入该目录。依次执行
    # cd /home/android/development
    # mkdir lib_test
    # chmod 777 ./lib_test
    # cd ./lib_test
    在lib_test下创建my_add.c源文件,如下。
/*
my_add.c
*/
#include <stdio.h>
int add(int x, int y)
{    
    int sum = x + y;
    printf("The sum of %d and %d is %d\n", x, y, sum);
    return sum;
}

该程序计算两个整形变量的和并返回该值,同时打印求和信息。

(2)编写Android.mk文件
    在lib_test目录下创建Android.mk文件,内容如下
LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= my_add.c

LOCAL_MODULE:=libmy_add

LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)

(3)编译动态库
    进入lib_test目录,用mm命令编译动态库。
    # cd /home/android/development/lib_test
    # mm
    编译完成之后生成的动态库文件明为$(LOCAL_MODULE).so,即libmy_add.so。该动态
库位于/home/android/out/target/product/generic/system/lib目录下。

2.调用动态库
(1)编写调用动态库的源程序
    在删除之前在lib_test目录下的创建的my_add.c和Android.mk文件,并在该目录下创
建libtest.c文件以及my_add.h文件,内容如下:
/*
libtest.c
*/
#include <stdio.h>
#include "my_add.h"

int main()
{
    add(3,4);
    printf("Done\n");
    return 0;
}

my_add.h头文件:
/*
my_add.h
*/
int add(int x, int y);

(2)编写Android.mk文件
    在lib_test目录下创建Android.mk文件,内容如下。
LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=libtest.c

LOCAL_MODULE:=lib_test

LOCAL_SHARED_LIBRARIES:=libmy_add

include $(BUILD_EXECUTABLE)
注:LOCAL_SHARED_LIBRARIES指明要调用的动态库文件,这里动态库文件为libmy_add.so,
位于/home/android/out/target/product/generic/lib目录下,编译时会自动在这个目录
下寻找该动态库文件。

(3)编译
    进入lib_test目录,使用mm命令进行编译。
    # cd /home/android/development/lib_test
    # mm
    生成的可执行文件lib_test文件位于/home/android/out/target/product/generic/s
ystem/bin目录下。

3.在Android模拟器中使用
(1)启动模拟器
(2)运行程序
    等待模拟器初始化完成后,将lib_test文件push进模拟器,并将libmy_add.so文件pu
sh至模拟器的system/lib目录下。
    由于模拟器下/system/目录为制度目录,需修改权限,使用adb remount 命令。依次
执行:    
    #adb remount
    # adb push /home/android/out/target/product/generic/system/lib/libmy_add.s
o /system/lib
    # adb push /home/android/out/target/product/generic/system/bin/lib_test /d
ata
执行push命令之后登录模拟器,在模拟器终端下调用lib_test执行。
    # adb shell
    #/data/lib_test

4.隐藏动态库函数细节
    可通过选项-fvisibility=hidden将动态库中不必要暴露的函数和全局变量隐藏起来。
从而在调用动态库的时候,只有不被隐藏(开放)的函数可以调用,其他函数和变量这部
能被调用(引用)。在Android.mk文件中的LOCAL_CFLAG中加入该选项即可,及
    LOCAL_CFLAG += -fvisibility=hidden。
    而要开放的函数前只需加上__attribute__ ((visibility ("default")))限定。
    例如生成通过以下mylib.c生成动态库libmylib.so,可编写Android.mk文件为:
#Android.mk file
LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=\
    mylib.c

LOCAL_MODULE:=libmylib

LOCAL_CFLAGS +=-fvisibility=hidden

LOCAL_PRELINK_MODULE := false

include $(BUILD_SHARED_LIBRARY)

/*
mylib.c
*/
#include <stdio.h>

__attribute__ ((visibility ("default")))  int add(int x, int y)
{
    int sum = x + y;
    printf("%d add %d is %d\n", x, y, sum);
    return sum;
}

int sub(int x, int y)
{
    int sub = x - y;

printf("%d sub %d is %d\n", x, y, sub);
    return sub;
}

int mul(int x, int y)
{
    int mul = x*y;

printf("%d multiply %d is %d\n", x, y, mul);

return mul;
}
    这样通过mm命令编译生成的libmylib.so中只有函数int add(int x, int y)是可以被
调用的,而int sub(int x, int y)和int mul(int x, int y)则不能被调用。如过源文件
调用动态库中的sub(或mul)函数,编译该文件是会出现无法找到sub函数的错误。

pdf版下载地址:
http://byhh.net/f/Android/1298215084/Android_lib.pdf

Good luck!
--

Android开发之动态库调用相关推荐

  1. 【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )

    文章目录 I . Android Studio 中使用 Android.mk 配置动态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  2. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  3. android开发 实现动态获得app的cpu占有率并导出文件的两种方法。

    android开发 实现动态获得app的cpu占有率并导出文件的两种方法. 最近在做学校实验室的项目的时候,师兄要求我对app的性能进行评估,主要是从电量.cpu占有率.python模型的响应时间三者 ...

  4. Android开发常用开源库

    Android 开发常用开源库 一.网络请求 二.图片加载 三.数据库 四.通讯 五.注解 六.JSON解析 七.性能优化 八.性能优化之布局分析 九.工具类 十.状态栏 十一.扫码库 十二.播放器 ...

  5. 【Android 逆向】Android 中常用的 so 动态库 ( 拷贝 /system/lib/ 中的 Android 系统 so 动态库 )

    文章目录 一.拷贝 /system/lib/ 中的 Android 系统 so 动态库 一.拷贝 /system/lib/ 中的 Android 系统 so 动态库 将 Android 系统的 /sy ...

  6. C++动态库调用宿主进程中的对象方法《纯虚函数的使用》

    可执行程序加载动态库并调用动态库导出的函数是比较容易的: 导入库对应的头文件 在CPP文件中调用函数 在链接程序时加上动态库作为参数 假设demo.cpp中需要用到动态库libadd.so中的某个函数 ...

  7. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )

    文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.完整代码示例 1.Java 层代码 2.JNI 层代码 3.日志头文件 4.执行结果 四.参考资料 前置博客 ...

  8. 【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态库编译配置 | JNI 头文件导入 | JNI 方法命名规范 )

    文章目录 I . JNI 与 NDK 区别 II . Visual Studio 编译动态库 III. 配置 导入 jni.h 头文件 IV . IntelliJ IDEA Community Edi ...

  9. android ffmpeg编译动态库,最简单的android studio调用ffmpeg动态库

    准备工作: 1.编译好的ffmpeg动态库.so文件,以及ffmpeg的头文件: 2.android studio开发环境,包括NDK等可用环境: 步骤一: 新建一个android studio工程, ...

最新文章

  1. 关于UnimplementedError: Fused conv implementation does not support grouped convolutions for now.报错
  2. 计组—双端口与多模块存储器
  3. (ZT)VC++的链接错误LNK2001
  4. cortex-m3 操作模式 寄存器组 异常类型 堆栈 中断
  5. R沟通|Bookdown中文书稿写作手册(中)
  6. 的文件夹结构_小白指南:WordPress文件及目录结构解析
  7. SAP License:SAP打油诗
  8. 这款Linux 恶意软件正在劫持全球的超级计算机
  9. C语言:判断m是否为素数
  10. 硬盘坏了怎么修复 教你如何修复硬盘坏道
  11. 下载:HD AUDIO For XP SP3修正补丁
  12. qq四国军旗2.1 beat03 builde017记牌器开发思路(二)
  13. python怎么保存代码.py_pycharm的基本操作,创建项目,新建py文件,编写代码及保存...
  14. 【Fiddler】如何使用Fiddler中的Fiddler插件下载钉钉直播回放
  15. Install cf v6
  16. java教程 电子工业出版社_Java程序设计实用教程
  17. Vue中好用的打印组件 vue-print-nb
  18. 限定自身转动轴向的LookAt
  19. 估值超400亿美元的京东物流,已成顺丰最有力的竞争对手
  20. 【计算机网络】REST接口

热门文章

  1. 实现多个标签页之间通信的几种方法
  2. 2.2. php://stdin php://stdout
  3. 深入学习QWidget-1
  4. android之lint警告This Handler class should be static or leaks might occur
  5. 关于SQL查询效率,100w数据,查询只要1秒
  6. oracle之alter学习笔记
  7. 话里话外:论持续跟踪和及时反馈
  8. Windows 服务全攻略(2)
  9. Aspose.Cells设置单元格格式
  10. 驱动阿里云的高性能网络引擎- 飞天洛神