如何动态加载自己的库并在其中调用方法?

jstrom:

我想编写一些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

我尝试过的事情:

  1. 我看过'uselib'的手册页,该手册页似乎很有用,但是我不确定一旦加载该库后该怎么做。

  2. 谷歌搜索返回http://dyncall.org/,但这并不是我真正需要的-这个项目仍然需要一个函数指针来进行函数调用。

我将不胜感激,希望得到任何指向下一步的指针,即使没有具体答案。谢谢!

Linuxios:

Linux为此提供了非常完整的API。dlopen(3)API。

首先,dlopen使用文件名进行调用以获取共享库句柄:

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

然后,在此库中获取函数的函数指针:

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

根据需要使用此指针。

最后,完成后:

dlclose(lib)

注意:记住要进行错误检查!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何动态加载DLL并在其中使用类(实现已知接口)[C#]

如何查找调用了哪些 Method 方法并在其中声明了变量

我想遍历hashmap并在其中调用对象的方法

C#将类作为参数传递给方法,并在其中调用静态方法

ExtJs:如何创建窗口并在其中加载A.aspx页面

如何使html表变灰并在其中显示加载器?

Angular 2-如何访问指令并在其中调用成员函数

如何使用os库获取当前工作目录并在其中写入.txt文件?

我如何获得 ObservableList 的对象,我可以在其中编写自己的方法?

Progress-4GL:如何在表单中动态添加填充并在其中接收用户输入?

如何使用 for 循环在多个 goroutines 之间进行通信,并在其中一个阻塞函数调用

如何创建dl标签并在其中显示数据

如何绘制矩形并在其中放置文本

如何获取当前的shell并在其中执行命令?

如何映射列表并在其中实现异步?

Haskell MTL:如何退出monad并在其中获取价值?

如何访问模板元素并在其中填充模型数据

如何从C ++代码打开新终端并在其中编写

如何打开新的cmd窗口并在其中执行for循环?

如何选择特定工作表并在其中显示数据?

如何制作自适应块并在其中添加块?

如何读取 SVG 文件并在其中绘制内容?

共享库(.so)如何调用在其加载程序中实现的函数?

如何将方法传递为泛型,并在其中传递类和字符串?

如何在动态加载的按钮上调用 jquery off 方法

如何从C ++函数/ Qt方法按需加载动态库

创建动态元素并在其中移动其他元素

在其中插入动态值

多维数据库...数据如何存储在其中?