我们面临一个不寻常的问题,我们的JNI库在加载时崩溃。
我们使用CentOS 5.4 / G++和VS2005进行开发。
场景:
我们目前正在对产品进行增强,并希望使用JNI将新信息传递回Java服务器代码。
我们的C / C++代码可以正常工作,我们已经在开发环境中运行了大约6个小时左右对其进行了测试。我们已经更新了两个结果结构(已经存在),每个都具有一个长值,以传递新增强功能的结果。
当我们更新JNI代码以将结果传递给Java代码时,我们发现Java服务器在加载JNI时崩溃了,我们进行了调试,发现JNI lib崩溃了,即使我们没有在JNI lib代码库中进行更改。
在进一步的调试中,我们发现JNI Makefile包含一个.c文件(aa.c),其中对新增强功能进行了一些更改。我们首先在aa.c文件中一一评论我们的更改,发现只有当我们调用BBB.cpp::method1()时才发生崩溃(作为新增强功能的一部分已添加)。
不寻常的部分是,JNI lib中不需要此.c文件(aa.c),并且我们没有从JNI lib中调用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:无法在IA 32位平台上加载IA 32位.so
在java.lang.ClassLoader $ NativeLibrary.load(本地方法)
在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)
请提出建议,任何想法将不胜感激。
提前致谢,
阿库拉
最佳答案
我建议您在启动应用程序时尝试在ld.so.1中打开调试,看看是否有任何线索。参见http://linux.die.net/man/8/ld-linux中的LD_DEBUG
关于java - JNI lib崩溃,更改了.c文件(未包含在Makefile中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7311602/