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++类库隐藏私有属性和方法的两种方式