1,加载一些动态库:
#include <dlfcn.h>
#ifndef ANDROID_SYM_S_LOCK
# define ANDROID_SYM_S_LOCK "_ZN7android7Surface4lockEPNS0_11SurfaceInfoEb"
#endif
#ifndef ANDROID_SYM_S_LOCK2
# define ANDROID_SYM_S_LOCK2 "_ZN7android7Surface4lockEPNS0_11SurfaceInfoEPNS_6RegionE"
#endif
#ifndef ANDROID_SYM_S_UNLOCK
# define ANDROID_SYM_S_UNLOCK "_ZN7android7Surface13unlockAndPostEv"
#endif
需要事先知道定义这个:
// _ZN7android7Surface4lockEPNS0_11SurfaceInfoEb
typedef void (*Surface_lock)(void *, void *, int);
// _ZN7android7Surface4lockEPNS0_11SurfaceInfoEPNS_6RegionE
typedef void (*Surface_lock2)(void *, void *, void *);
// _ZN7android7Surface13unlockAndPostEv
typedef void (*Surface_unlockAndPost)(void *); 这样这些动态库以指针的形式加载.............
static void *InitLibrary(vout_display_sys_t *sys)
{
static const char *libs[] = {
"libsurfaceflinger_client.so",
"libgui.so",
"libui.so"
};
for (size_t i = 0; i < sizeof(libs) / sizeof(*libs); i++) {
void *lib = LoadSurface(libs[i], sys);
if (lib)
return lib;
}
return NULL;
}
static inline void *LoadSurface(const char *psz_lib, vout_display_sys_t *sys)
{
void *p_library = dlopen(psz_lib, RTLD_NOW);
if (!p_library)
return NULL;
sys->s_lock = (Surface_lock)(dlsym(p_library, ANDROID_SYM_S_LOCK));
sys->s_lock2 = (Surface_lock2)(dlsym(p_library, ANDROID_SYM_S_LOCK2));
sys->s_unlockAndPost =
(Surface_unlockAndPost)(dlsym(p_library, ANDROID_SYM_S_UNLOCK));
if ((sys->s_lock || sys->s_lock2) && sys->s_unlockAndPost)
return p_library;
dlclose(p_library);
return NULL;
}
说明: 打开动态库的函数时dlopen, 调用其中一个函数是dlsym,需要主意的是 要知道这个函数的名字. 上面的名字是_ZN7android7Surface4lockEPNS0_11SurfaceInfoEb