使用未定义的符号加载JNI崩溃

时间:2011-04-28 22:29:39

标签: java c++ java-native-interface

我正在尝试将我的本机库链接到java应用程序但是当我尝试运行它时,我得到一个java.lang.UnsatisfiedLinkError异常,抱怨缺少符号(_ZTVN10__cxxabiv117__class_type_infoE

我使用g ++编译共享库,就像任何其他共享库一样。

这是我第一次尝试使用JNI,我无法弄清楚如何正确连接所有内容。

2 个答案:

答案 0 :(得分:4)

您可以使用工具链附带的c++filt可执行文件来解码丢失的符号。然后就是要弄清楚代码的哪一部分没有做它应该做的事情。

nm可用于列出代码中定义的符号。如果您看到某个符号在同一行上有一个U,则它是未定义的,并且可能导致此错误。传递-E到gcc / g ++会在预处理步骤之后停止编译器,这可能也很有用。

我过去对此错误的原因主要是:

  • 没有建造我认为我正在建造的东西(它发生在我们最好的人身上)
  • 调用约定以意想不到的方式修改符号

答案 1 :(得分:2)

在没有-Wl,-soname,liblzw_compressor.so选项的情况下尝试重新链接。如果它工作,我不能告诉你为什么,除了几个月前,我有一个非常相似的未定义符号错误(甚至可能是相同的符号)并放弃我的链接线-Wl选项修复它。 / p>