Android开发之动态库调用
来源:互联网 发布:2015年双十一销售数据 编辑:程序博客网 时间:2024/06/08 10:33
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!
--
(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!
--
0 0
- Android开发之动态库调用
- Android开发之动态库调用
- Android开发之动态库调用
- android jni开发 调用 第三方 动态链接库
- 简单实现Android NDK编译jni调用动态库开发
- Windows Mobile开发之动态调用WebServcie
- android JNI学习之二 调用第三方动态库
- Android开发之权限调用
- Android学习之动态调用碎片
- delphi 之动态库调用
- android + JNI 调用动态库
- Android HAL开发之Java应用程序直接调用JNI库
- 开发:随笔记录之 CXF 动态调用Webservice
- android NDK开发及调用标准linux动态库.so文件
- android NDK开发及调用标准linux动态库.so文件
- android NDK开发及调用标准linux动态库.so文件
- Android Studio下的NDK开发(四):调用动态链接库中的函数
- Android开发之如何调用WebService
- hdu 1863 畅通工程 kruskal || prim
- ubuntu下svn、vpn客户端的配置使用
- 浅析Mysql Join语法以及性能优化
- [leetcode-160]Intersection of Two Linked Lists(c)
- 解决lists标签中,加上where后其他条件失效的问题
- Android开发之动态库调用
- 数据挖掘该怎样的学习路线?
- xml理论学习总结
- 机器学习降维算法二:LDA(Linear Discriminant Analysis)
- SQL专场
- POJ 1434 Fill the Cisterns!(二分)
- JDK的下载
- Spring嵌套事务控制
- 对于数据库值为 1 2 3 在页面上需要根据值判断显示登陆账号类型