找到本机库时出现Java UnsatisfiedLinkError

时间:2017-05-08 15:54:28

标签: linux openjdk

我有一个Java applet,它允许我访问远程服务器中的本地存储。它在Windows下工作正常(IE 7.0.5730.13,Java SE 1.6.0.05)。根据Java控制台,它下载了Java Native Interface的本机库:

ClientInterface::downloadLib: downloaded C:\Documents and Settings\user\IBM\10.10.10.65\remotedrive3d.dll in 1 attempts.
Initializing RemoteDisk v2.2

..我可以访问本地存储设备:

local storage devices under Windows

在Linux下使用 OpenJDK 1.8.0_121 IcedTea-Web 1.6.2 ,它还会下载本机库:

ClientInterface::downloadLib: downloaded /root/IBM/10.10.10.65/libibmxrdisk.so.1.0.3 in 1 attempts.

但是,它无法使用UnsatisfiedLinkError错误消息运行:

Initializing RemoteDisk v2.2
OpenJDK 64-Bit Server VM warning: You have loaded library /root/IBM/10.10.10.65/libibmxrdisk.so.1.0.3 which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
java.lang.UnsatisfiedLinkError: VirtualDrive.PassThroughCommand.GetSupportedDevices()LVirtualDrive/SupportedDevices;
        at VirtualDrive.PassThroughCommand.GetSupportedDevices(Native Method)
        at com.ibm.asm.remotedisk.RemoteDisk.buildDriveList(Unknown Source)
        at com.ibm.asm.remotedisk.RemoteDisk.start(Unknown Source)
        at sun.applet.AppletPanel.run(AppletPanel.java:476)
        at sun.applet.AppletViewerPanelAccess.run(AppletViewerPanelAccess.java:84)
        at java.lang.Thread.run(Thread.java:745)

..我无法访问本地存储设备:

local storage devices under Linux

当我使用strace -f启动Firefox时,我可以清楚地看到访问了libibmxrdisk.so.1.0.3文件。例如:

[pid  6741] open("/root/IBM/10.10.10.65/libibmxrdisk.so.1.0.3", O_RDONLY|O_NONBLOCK) = 48
[pid  6741] read(48, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\334S\0\0004\0\0\0"..., 52) = 52
[pid  6741] close(48)

/root/IBM/10.10.10.65/libibmxrdisk.so.1.0.3似乎包含GetSupportedDevices

等字符串
root@s:~/IBM/10.10.10.65# strings libibmxrdisk.so.1.0.3 | grep -i GetSupportedDevices
Java_VirtualDrive_PassThroughCommand_GetSupportedDevices
GetSupportedDevices
Java_VirtualDrive_PassThroughCommand_GetSupportedDevices
root@s:~/IBM/10.10.10.65#

Linux操作系统的专有本机库libibmxrdisk.so.1.0.3可能已损坏吗?它是否可能与OpenJDK不兼容?如何进一步调试?

1 个答案:

答案 0 :(得分:1)

这是http://icedtea.classpath.org/bugzilla/enter_bug.cgi?product=IcedTea-Web没有堆栈溢出的问题。作为ITW开发人员,我需要帮助调试一下。

从痕迹是清晰的架构mishmash。我敢打赌你的窗口是32b,但linux是(肯定的)64b机器。出于某种原因,ITW正在下载32b版本的RemoteDrive库。 32b库在64b系统上工作,但你还需要32b的depndencies(很可能也是32b java)。你有这些吗?

如果上面是完全正确的,那么它就是我的ITW或jdk itslef。但我打赌上面。

所以:尝试32 jdk,尝试各种32b depndencies,如果不工作,那么请向ITW提交bug

HTH   学家