c_cpp 动态调用动态库函数的两种方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 动态调用动态库函数的两种方法相关的知识,希望对你有一定的参考价值。

#include <dlfcn.h>
//dllopen
void *dllhandle_;
char *dllerror_;
typedef HI_S32 (*HI_RUNTIME_Connector_Compute)(HI_RUNTIME_SRC_BLOB_ARRAY_S* pstConnectorSrc, HI_RUNTIME_DST_BLOB_ARRAY_S* pstConnectorDst, HI_U64 u64SrcId, HI_VOID* pParam);
//1.打开动态库
dllhandle_ = dlopen(dllPath.c_str(), RTLD_LAZY);
if (!dllhandle_) {
  fprintf(stderr, "%s\n", dlerror());
  exit(EXIT_FAILURE);
}
//清除之前存在的错误
dlerror();


//2.获取一个函数
HI_RUNTIME_Connector_Compute pFun = (HI_RUNTIME_Connector_Compute)dlsym(dllhandle_, ("Connector_"+modelGroup_.connector(j).name()).c_str());
if ((dllerror_ = dlerror()) != NULL)  {
  fprintf(stderr, "%s\n", dllerror_);
  exit(EXIT_FAILURE);
}

//3.关闭调用动态库句柄
dlclose(handle);     
//全局回调函数map(函数名,函数指针)
typedef std::map<std::string,HI_RUNTIME_Connector_Compute> CallbackMap;
CallbackMap g_callback_map;

//动态库中设置回调函数
void SetCallbackFunction(HI_RUNTIME_Connector_Compute callbackFun,std::string name){
    cout <<"setcallbackFun: "<<name;
    g_callback_map[name] = callbackFun;
    printf(" 0x%x\n",g_callback_map[name]);
}
//另一个动态库或者可执行文件中获取回调函数地址
static HI_RUNTIME_Connector_Compute GetCallbackFunction(const std::string& name) {
    if (g_callback_map.count(name)) {
        cout <<"getcallbackFun: "<<name;
        printf(" 0x%x\n",g_callback_map[name]);
        return g_callback_map[name];
    } else {
        for (CallbackMap::iterator it = g_callback_map.begin();
             it != g_callback_map.end(); ++it) {
            std::cout <<"name: "<< it->first ;
            std::cout <<" addr: 0x"<< hex << g_callback_map[it->first]<< std::endl;
        }
        return NULL;
    }
}

以上是关于c_cpp 动态调用动态库函数的两种方法的主要内容,如果未能解决你的问题,请参考以下文章

C#中如何调用动态链接库DLL

VB中调用Class(类模块)及调用DLL(动态链接库)问题

Android怎么调用第三方SO动态链接库

注册JNI函数的两种方式

vc动态链接库的调用 LoadLibrary()路径问题

C++类库隐藏私有属性和方法的两种方式