函数说明:
http://www.cnblogs.com/Anker/p/3746802.html
DecoderVideo::initVpuCodecContext(VpuCodec** vpu_codec)
{
c->open_codec = (VpuCodecOpenFactory) dlsym(gRkVpuLibHandle, "vpu_open_context");//dlsym通过句柄和连接符名称获取函数名或者变量名
c->close_codec = (VpuCodecCloseFactory) dlsym(gRkVpuLibHandle, "vpu_close_context");
}
static bool getRkVpuLibHandle()
{
if (gRkVpuLibHandle == NULL) {
gRkVpuLibHandle = dlopen(RK_VPU_LIB, RTLD_NOW);//dlopen以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程
}
if (gRkVpuLibHandle == NULL) {
ALOGD("Failed to open RK_VPU_LIB");
return false;
}
if (gRkVpuLibHandle != NULL) {
if ((VpuCodecOpenCtxFactory) dlsym(gRkVpuLibHandle, "vpu_open_context") == NULL)
return false;
if ((VpuCodecCloseCtxFactory) dlsym(gRkVpuLibHandle, "vpu_close_context") == NULL)
return false;
}
return true;
}
tatic const char* RK_VPU_LIB = "libvpu.so";
1.通过dlopen打开动态链接库libvpu.so(由mpp生成),同时返回句柄gRkVpuLibHandle;2.通过dlsym,获得函数vpu_open_context
RTLD_LAZY 暂缓决定,等有需要时再解出符号
RTLD_NOW 立即决定,返回前解除所有未决定的符号。