如何dynamic加载我自己的库,并调用其中的方法?

我想写一些C代码(好吧,如果它只适用于Linux)dynamic加载一个新的共享库,然后调用一个方法(在运行时确定)。 看来这已经是可能的,因为java可以dynamic加载本地库,然后从它们调用方法。

例如,我想要做一些事情:

int main() { libinfo_t * lib_details = load_shared_library("libfoo.so"); run_method(lib_details, "bar", 7); } 

这将调用参数7的方法“bar”(bar是一个编译到libfoo.so的方法)。

用例细节:

我想编译一个二进制文件,将所有共享库加载到目录中,并在原始程序的内存上下文中运行一些方法。 我希望能够通过添加/删除目录来快速启用或禁用共享库。

概念validation:

看来这应该是可能的,基于javapipe理方式dynamic链接jni代码的方式。 你可以使用System.load(),并加载你select的库。 再加上从内存编译,似乎可以让你从任意一个库运行一个任意的函数。 http://www.java2s.com/Code/Java/JDK-6/CompilingfromMemory.htm

我试过的东西:

  1. 我已经看了'uselib'的manpage,这看起来很有用,但是我不确定一旦我加载了它,该如何处理这个库。

  2. 一些谷歌search返回http://dyncall.org/ ,但这不是我所需要的 – 这个项目仍然需要一个函数指针来进行函数调用。

即使没有具体的答案,我也会很感激下一步要看的地方。 谢谢!

Linux有一个非常完整的API。 这是dlopen(3) API。

首先,你用一个文件名调用dlopen来获得共享库句柄:

 void* lib = dlopen("./lib.so"); 

比在这个库中获取函数的函数指针:

 int (*func)() = dlsym(lib, "thing"); 

请随意使用这个指针。

最后,当你完成时:

 dlclose(lib) 

注意:记得做错误检查!