Java 加载带有未定义符号的JNI崩溃

Java 加载带有未定义符号的JNI崩溃,java,c++,java-native-interface,Java,C++,Java Native Interface,我正在尝试将我的本机库链接到java应用程序,但当我尝试运行它时,我得到一个java.lang.unsatifiedlinkerror异常,抱怨缺少符号(\u ZTVN10\u cxxabiv117\u class\u type\u infoE) 我用g++编译了共享库,就像其他共享库一样 这是我第一次尝试使用JNI,我不知道如何让所有东西都正确链接。您可以使用工具链附带的c++filt可执行文件来删除缺少的符号。然后就是找出代码的哪一部分没有完成它应该做的事情 nm可用于列出代码中定义的符号。

我正在尝试将我的本机库链接到java应用程序,但当我尝试运行它时,我得到一个
java.lang.unsatifiedlinkerror
异常,抱怨缺少符号(
\u ZTVN10\u cxxabiv117\u class\u type\u infoE

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


这是我第一次尝试使用JNI,我不知道如何让所有东西都正确链接。

您可以使用工具链附带的
c++filt
可执行文件来删除缺少的符号。然后就是找出代码的哪一部分没有完成它应该做的事情

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

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

  • 没有建造我认为我正在建造的东西(这发生在我们中最好的人身上)
  • 调用约定以意外方式损坏符号

    • 尝试在不使用
      -Wl、-soname、liblzw_压缩器的情况下重新链接。因此
      选项。如果它能工作,我不能告诉你为什么,除了几个月前,我有一个非常类似的未定义符号错误(甚至可能是同一个符号),并从我的链接行中删除
      -Wl
      选项修复了它。

      你能发布准确的链接行吗?你能验证libstdc++是否与之链接吗?当然:g++${CFLAGS}-shared-Wl,-soname,liblzw_compressor.so-o liblzw_compression_CompressedInputStream.o compression_CompressedOutputStream.o lzw.o当然,你能尝试在没有
      -Wl,-soname,liblzw_compressor.so
      选项的情况下重新链接吗?几个月前,我遇到了一个非常类似的问题,我想我可以通过删除链接行中的
      -Wl
      选项来修复它。但我可能记错了。实际上,出于某种原因,这似乎已经修复了它,但现在JVM正在崩溃。哦,好吧,至少现在我可以调试代码了!万分感谢!