我有一个Java应用程序,它使用JNI与本机代码交互。本机代码在运行时编译文件,并尝试使用 dlopen 调用加载此文件。此调用失败,我收到一条警告
Could not load library (x):(x) undefined symbol: y
但是当我有一个本机应用程序通过JNI启动JVM运行相同的代码时,不会发生此错误并且它按预期运行。我怀疑Java正在做一些花哨的事情,导致已加载的库对于加载 dlopen 的库是不可见的。
我这样做是为了诊断问题:
objdump
gdb
确认此库已加载(通过eclipse - 库已在模块窗格中列出)我一直试图解决这个问题,但我无法弄清楚发生了什么。特别是因为它从本机应用程序加载JVM时可以正常工作。
提前谢谢!
答案 0 :(得分:6)
我终于找到了答案。解决方案是重新编译包含-Wl,--export-dynamic
链接器标志未找到的符号的共享库。
有趣的是我自己没有对该共享库进行编程,我希望默认编译添加标志,因为软件需要它才能正常运行。
无论哪种方式,它都是一个开源项目,所以我可以使用正确的标志设置来编译它。