System.loadLibrary适用于OpenJDK但不适用于Oracle

时间:2015-11-13 16:27:36

标签: java c++ linux

我用C ++实现了一个SDK(用C导出的API)。此SDK编译为Windows的DLL和Linux的.so。我还使用JNA实现了Java包装器。这个包装器里面装有.so和DLL,我在运行时检查哪个操作系统正在运行,并在开发人员指定的文件夹中提取它。效果很好。

问题是使用Linux的客户之一(我在Linux上只有几个)表示该库没有加载未定义的符号错误。这是错误:

java.lang.UnsatisfiedLinkError:/usr/lib/libBXSDK.so:/usr/lib/libBXSDK.so: undefined symbol:_ZTVN10__cxxabiv117__class_type_infoE

最初我认为这可能与某些标准有关。因此不存在。然后我给他发了一个非常基本的C ++可执行文件并要求他运行。有效。然后我给他发了一个非常基本的Java应用程序,它不使用SDK,但只调用System.loadLibrary(“BXSDK”)。将libBXSDK.so复制到/ usr / lib后,他运行了基本的Java应用程序,错误是一样的。

然后我决定检查他的Java版本,并意识到他正在使用Oracle JDK最新版本,我在运行CentOS 7的测试环境中看到了这一点(客户运行RHEL 7)我使用的是OpenJDK。我立即在我的测试环境中安装了Oracle JDK,我看到了同样的问题。

所以,我的问题是。 Oracle JRE和OpenJDK(JRE)之间的区别是什么导致了这个问题?我在我的.so上做错了,OpenJDK能够处理但是Oracle JRE不是吗?

由于

1 个答案:

答案 0 :(得分:1)

您是否验证了此文件夹中是否包含此案例:http://ubuntuforums.org/showthread.php?t=1323888

研究员(dontexist)成员的评论总体上非常有效,OpenJDK能够进行调用的事实让我想到了库加载本身是不成功的。

我想,这可能不会回答这个问题 - “Oracle和Open JDK在加载语义方面有什么区别”。不确定我是否可以撤回这篇文章作为答案,但让别人借此机会解释一下。