我们遇到了一个不寻常的问题,我们的JNI lib在加载时崩溃。 我们使用CentOS 5.4/G ++和VS2005进行开发。JNI lib崩溃,未包含在Makefile中的.c文件发生更改
场景: 我们目前正在对我们的产品进行改进,并希望使用JNI将新信息传回给Java服务器代码。我们的C/C++代码工作正常,我们已经在我们的开发环境中运行了大约6个小时左右来测试它。我们已经更新了两个结果结构(已经存在),每个结果结构都有一个很长的值,以传递我们新增强的结果。
当我们更新JNI代码以将结果传递给Java代码时,我们发现Java服务器在加载JNI时崩溃,我们进行调试并发现JNI lib崩溃,甚至当我们没有我们的更改时JNI库代码库。在我们的进一步调试中,我们发现,JNI Makefile包含一个.c文件(aa.c),它对我们的新增强做了一些修改;我们开始在这个aa.c文件中逐一评论我们的变化,发现只有当我们有BBB.cpp :: method1()调用(我们已经添加,作为我们新增强的一部分)时,崩溃才会发生。
不常见的部分是,这个.c文件(aa.c)在JNI库中是不需要的,我们没有任何从JNI lib调用的aa.c方法; 现在我们已经从JNI Makefile中移除了aa.c,并且编译得很好,但是当我们有BBB.cpp :: method1()调用时仍然崩溃,如果我们移除这个method1()调用,那么它工作正常。
我们不确定,为什么/它如何链接到未包含的文件,在Makefile和崩溃中。
这是错误日志中,我们看到
AgentServer#0开始:OK 12750 [连接#CNX:#0.0.1026:0 - 会话#c0s1] ERROR com.xx.xxx.xxxx - 无法加载JNI BBBController库 java.lang.UnsatisfiedLinkError:/opt/XXXXX/lib/libjnixxx.so:无法在IA 32位平台上加载IA 32位.so,在java.lang.ClassLoader $ NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1676) at j ava.lang.Runtime.loadLibrary0(Runtime.java:822) 在java.lang.System.loadLibrary(System.java:993)
请建议,任何想法的,将不胜感激。
由于提前,
Aqura
不,你已经检查http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6515362疑问。什么是Java版本? –
这个错误通常意味着你缺少一个依赖的共享库,而不是你有32/64位的差异。在你的.so上运行ldd,看看它列出的内容是否在LD_LIBRARY_PATH中。 – bmargulies
@Alan Stokes,我正在使用jdk 1.5_22 – Vikas