加载JNI时会因未定义的符号而崩溃

Loading JNI crashes with undefined symbols

本文关键字:符号 崩溃 未定义 JNI 加载      更新时间:2023-10-16

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

我用g++编译了这个共享库,就像其他的共享库一样。

这是我第一次尝试JNI,我不知道如何让一切正确链接。

您可以使用c++filt可执行文件,随您的工具链来要求缺失的符号。接下来的问题是找出你的代码的哪一部分没有做它应该做的事情。

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

过去我对这个错误的原因基本上是:

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

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