在native代码运行时加载另一个so,可以使用dlopen方法来动态地载入运行库。以下简述简单的使用方法。
dlopen方法定义在dlfcn.h头文件中,使用前需要先引入。
加载库:1
void* handler=dlopen("/system/lib/libdvm.so",RTLD_LAZY);
方法的作用是打开一个库,并返回一个句柄,第一个参数是需要加载的库,第二个是加载的模式。
解析方式
- RTLD_LAZY:对于动态库中的未定义符号不执行解析
- RTLD_NOW:对动态库中的符号执行解析,如果存在未定义符号,dlopen会返回NULL
作用范围
- RTLD_GLOBAL:动态库中定义的符号可被其后打开的其它库解析
- RTLD_LOCAL:与RTLD_GLOBAL相反,默认
作用方式
- RTLD_NODELETE:在dlclose期间不卸载库,重新dlopen时不初始化库中的静态变量
- RTLD_NOLOAD:不加载库,用于测试库是否已被加载,返回NULL为未加载
- RTLD_DEEPBIND:在搜索全局符号前先搜索库内的符号,避免同名符号冲突
以上三种都可以互相组合。
通过dlopen获取到一个句柄后,就可以调用链接库中的函数了。
假设动态库中有一个函数:1
2
3
4int count(int num)
{
return num%2;
}
那获取的函数的方法就可以为:1
2int (*count_fun)(int);
count_fun=(int)dlsym(handler,"count");
第一个参数为dlopen返回的句柄,第二个参数为需要调用的方法,获取到的函数返回类型需要强转。比如说handler指向的动态库中定义了一个count的方法(如上),它的返回值为int,那执行上面的代码后就可以拿到count函数的指针,就可以调用count函数了。
调用方式:1
printf("number:%d\n",(*count_fun)(5));
就可以执行coun函数。
在使用完后需要使用dlclose进行释放句柄
1 | int result=dlclose(handler); |
参考:http://tldp.org/HOWTO/Program-Library-HOWTO/dl-libraries.html