一万年太久,只争朝夕
分类: Android平台
2015-02-10 19:07:47
打开库路径,调用对应的函数的方法:
库路径:system\lib\hw\camera.xx.so
首先调用以下函数:
Char *libname= “system\lib\hw\camera.xx.so”;
void *handle_camera_dl = dlopen(libname,RTLD_NOW);
typedef int (*p_camera_test)(int id); //定义一个函数指针
p_camera_test camera_preview=
(p_camera_test)dlsym(handle_camera_dl,“camera_preview”);
if(camera_preview)
{
If(camera_preview(1))
{
Printf(“preview fail!!”);
}
}
这个小程序有以下几个需要注意的地方:
1、 首先一个知识点是函数指针的定义问题,常见的函数指针定义有两种方式:
一种是普通模式:
int (*ptest)(int a,int b);
ptest = test;
第二种是采用typedef来实现:
typedef int (*ptest)(int a,int b);
ptest testp = test;
2、 dlopen函数的解析:
void *dlopen(const char* pathname,int mode);
打开方式一般选择解析模式:
RTLD_LAZY:不解析动态库中未定义的符号
RTLD_NOW:在dlopen返回前解析出所有的未定义符号
dlsym函数的解析:
void*dlsym(void*handle,constchar*symbol);
此函数根据操作句柄handle_camera_dl和符号,返回符号对应的地址,从而执行相应的函数。
3、 so库的生成方法和解析
一条编译生成的命令便可以生成一个so库:
gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
在linux可以用readelf命令来查看该so库里面都有哪些符号,也即可用的函数或者变量。
readelf –s camera.xx.so
camera_preview是一个函数指针,根据此函数指针来判断库路径中是否搜索到字串“camera_preview”所表示的函数,然后调用该函数来实现camera预览功能。
注:so库的使用还需对应的头文件