加载JNI时会因未定义的符号而崩溃
Loading JNI crashes with undefined symbols
我试图将我的本机库链接到java应用程序,但当我尝试运行它时,我得到一个java.lang.UnsatisfiedLinkError
异常抱怨缺少符号(_ZTVN10__cxxabiv117__class_type_infoE
)
我用g++编译了这个共享库,就像其他的共享库一样。
这是我第一次尝试JNI,我不知道如何让一切正确链接。
您可以使用c++filt
可执行文件,随您的工具链来要求缺失的符号。接下来的问题是找出你的代码的哪一部分没有做它应该做的事情。
nm
可用于列出代码中定义的符号。如果您看到一个符号在同一行上有一个U,那么它是未定义的,并可能导致此错误。向gcc/g++传递-E将在预处理步骤之后停止编译器,这可能也很有用。
过去我对这个错误的原因基本上是:
- 没有构建我认为我正在构建的东西(这发生在我们最好的人身上)
- 调用约定以意想不到的方式混淆符号
尝试没有-Wl,-soname,liblzw_compressor.so
选项的重链接。如果它工作,我不能告诉你为什么,除了几个月前,我有一个非常类似的未定义的符号错误(甚至可能是相同的符号),并从我的链接行放弃-Wl
选项修复它。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 程序崩溃并显示"std::out_of_range"错误
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- CoInitialize()在单独的线程上崩溃而不返回
- 使用gcc从静态链接的文件中查找可选符号
- iOS崩溃报告象征无DSYM-二进制中看到的地址之外的符号地址
- 崩溃时间(运算符 new(无符号 int)+22)
- 当程序与符号名称一起崩溃时,输出呼叫堆栈
- 崩溃调查,正在从.so文件中恢复符号
- 程序在没有调试符号的情况下崩溃,运行良好(两种情况下都没有优化或任何内容)
- 加载JNI时会因未定义的符号而崩溃