Chinaunix首页 | 论坛 | 博客
  • 博客访问: 96235
  • 博文数量: 25
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 221
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-08 16:03
个人简介

一万年太久,只争朝夕

文章分类
文章存档

2016年(4)

2015年(19)

2014年(2)

我的朋友

分类: 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库的使用还需对应的头文件

阅读(1168) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~