我想编写一些C代码(如果它仅适用于Linux,则可以)动态加载新的共享库,然后从中调用一个方法(在运行时确定)。看来这已经成为可能,因为Java可以动态加载本机库,然后从中调用方法。
例如,我想做类似的事情:
int main() {
libinfo_t * lib_details = load_shared_library("libfoo.so");
run_method(lib_details, "bar", 7);
}
这将使用参数7调用方法“ bar”(bar是编译到libfoo.so中的方法)。
用例详细信息:
我想编译一个二进制文件,将所有共享库加载到目录中,并在原始程序的内存上下文中从每个共享库运行一些方法。我希望能够通过从目录添加/删除共享库来快速启用或禁用它。
概念证明:
基于java管理与jni代码动态链接的方式,这似乎应该可行。您可以使用System.load()并加载您选择的库。加上从内存进行编译,似乎可以让您从任意库运行任意函数。http://www.java2s.com/Code/Java/JDK-6/CompilingfromMemory.htm
我尝试过的事情:
我看过'uselib'的手册页,该手册页似乎很有用,但是我不确定一旦加载该库后该怎么做。
谷歌搜索返回http://dyncall.org/,但这并不是我真正需要的-这个项目仍然需要一个函数指针来进行函数调用。
我将不胜感激,希望得到任何指向下一步的指针,即使没有具体答案。谢谢!
Linux为此提供了非常完整的API。是dlopen(3)
API。
首先,dlopen
使用文件名进行调用以获取共享库句柄:
void* lib = dlopen("./lib.so");
然后,在此库中获取函数的函数指针:
int (*func)() = dlsym(lib, "thing");
根据需要使用此指针。
最后,完成后:
dlclose(lib)
注意:记住要进行错误检查!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句