从通过JNI加载的共享库调用dlopen使以前加载的符号不可见

时间:2012-02-27 18:02:21

标签: java java-native-interface dlopen

我有一个Java应用程序,它使用JNI与本机代码交互。本机代码在运行时编译文件,并尝试使用 dlopen 调用加载此文件。此调用失败,我收到一条警告

Could not load library (x):(x) undefined symbol: y

但是当我有一个本机应用程序通过JNI启动JVM运行相同的代码时,不会发生此错误并且它按预期运行。我怀疑Java正在做一些花哨的事情,导致已加载的库对于加载 dlopen 的库是不可见的。

我这样做是为了诊断问题:

  • 使用objdump
  • 确认了哪个共享库中未定义的符号所在的位置
  • 使用gdb确认此库已加载(通过eclipse - 库已在模块窗格中列出)
  • 在dlopen之前打印LD_LIBRARY_PATH并确认Java传递它(它确实添加了Java的lib目录,但原始目录仍在那里)

我一直试图解决这个问题,但我无法弄清楚发生了什么。特别是因为它从本机应用程序加载JVM时可以正常工作。

提前谢谢!

1 个答案:

答案 0 :(得分:6)

我终于找到了答案。解决方案是重新编译包含-Wl,--export-dynamic链接器标志未找到的符号的共享库。

有趣的是我自己没有对该共享库进行编程,我希望默认编译添加标志,因为软件需要它才能正常运行。

无论哪种方式,它都是一个开源项目,所以我可以使用正确的标志设置来编译它。