【发布时间】:2023-03-25 02:43:01
【问题描述】:
我们面临一个不寻常的问题,我们的 JNI 库在加载时崩溃。 我们使用 CentOS 5.4/G++ 和 VS2005 进行开发。
场景: 我们目前正在改进我们的产品,并希望使用 JNI 将新信息传递回 Java 服务器代码。 我们的 C/C++ 代码运行良好,我们在开发环境中运行了大约 6 个小时左右对其进行了测试。我们更新了两个结果结构(已经存在),每个结构都有一个长值,以传递我们新增强的结果。
当我们更新 JNI 代码以将结果传递给 Java 代码时,我们发现 Java 服务器在加载 JNI 时崩溃,我们进行了调试,发现 JNI 库崩溃了,即使我们没有对 JNI 进行更改lib 代码库。
在我们进一步的调试中,我们发现 JNI Makefile 包含一个 .c 文件(aa.c),其中包含我们对新增强功能的一些更改;我们开始一一评论我们在这个 aa.c 文件中的更改,发现只有当我们调用 BBB.cpp::method1() 时才会发生崩溃(我们已添加,作为我们新增强功能的一部分)。
不寻常的是,这个 .c 文件(aa.c)在 JNI 库中是不需要的,而且我们没有从 JNI 库中调用 aa.c 的任何方法; 现在我们已经从 JNI Makefile 中删除了 aa.c 并且编译得很好,但是当我们调用 BBB.cpp::method1() 时仍然会崩溃,如果我们删除这个 method1() 调用,那么它就可以正常工作了。
我们不确定它为什么/如何链接到 Makefile 中未包含的文件并崩溃。
这是我们看到的错误日志
AgentServer#0 已启动:好的 12750 [Connection#Cnx:#0.0.1026:0 - Session#c0s1] 错误 com.xx.xxx.xxxx - 无法加载 JNI BBBController 库 java.lang.UnsatisfiedLinkError: /opt/XXXXX/lib/libjnixxx.so: Can't load IA 32-bit .so on a IA 32-bit platform 在 java.lang.ClassLoader$NativeLibrary.load(Native Method) 在 java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751) 在 java.lang.ClassLoader.loadLibrary(ClassLoader.java:1676) 在 java.lang.Runtime.loadLibrary0(Runtime.java:822) 在 java.lang.System.loadLibrary(System.java:993)
请提出建议,任何想法将不胜感激。
提前致谢,
阿库拉
【问题讨论】:
-
毫无疑问您已经检查过bugs.sun.com/bugdatabase/view_bug.do?bug_id=6515362。什么 Java 版本?
-
该错误通常意味着您缺少一个依赖共享库,而不是您有 32/64 位差异。在您的 .so 上运行 ldd 并查看它列出的所有内容是否都在 LD_LIBRARY_PATH 中。
-
@Alan Stokes,我正在使用 jdk 1.5_22
-
@bmargulies 我在现有的 libjni(工作正常)和我创建的 libjni(导致崩溃)上运行 ldd 都依赖于相同的库,但是 LD_LIB_PATH 没有它们。并且它显示的库
标签: java c++ crash java-native-interface loadlibrary