2011-09-05 32 views
0

我们遇到了一个不寻常的问题,我们的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

+0

不,你已经检查http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6515362疑问。什么是Java版本? –

+0

这个错误通常意味着你缺少一个依赖的共享库,而不是你有32/64位的差异。在你的.so上运行ldd,看看它列出的内容是否在LD_LIBRARY_PATH中。 – bmargulies

+0

@Alan Stokes,我正在使用jdk 1.5_22 – Vikas

回答

0

最后,我们能够解决这个问题。

我们看到了这个问题,因为我们用来构建JNI库的Makefile有很多.o文件,这些文件并不是构建所需要的。 其中一个文件碰巧是我们正在修改的文件,但其他相关文件未包含在Makefile中,并且这导致加载时崩溃,因为它无法解析引用。

找到并解决问题,我们创建了一个简单的Java类,它只是加载libjni.so,这给了我们未定义的方法引用,我们搜索并开始修复不需要的方法。 我知道这是一个粗略的方法,它需要一些时间才能找到并解决原始问题。 这对我们很有用,所以我想我会与其他人分享。

Aqura

0

我建议你尝试启用调试的程序ld.so.1,当你启动应用程序并看看是否给你任何线索。请参见LD_DEBUG中的http://linux.die.net/man/8/ld-linux

+0

我们已经试过这个选项,它对我们没有太大帮助 – Vikas

+0

你有命名冲突吗?你是否检查过你的应用程序的符号表,是否有导致问题的例程,并检查了没有重复?当你使用C++时,名字会发生变化。此外,你有没有尝试重新编译*一切*有/没有例程?你在使用模板吗? –

相关问题