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


原创粉丝点击