C_C++____________动态库操作________.so_________
来源:互联网 发布:python教程百度云盘 编辑:程序博客网 时间:2024/05/17 08:49
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_11SurfaceInfoEbtypedef void (*Surface_lock)(void *, void *, int);// _ZN7android7Surface4lockEPNS0_11SurfaceInfoEPNS_6RegionEtypedef void (*Surface_lock2)(void *, void *, void *);// _ZN7android7Surface13unlockAndPostEvtypedef 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