Java 找到本机库时出现 UnsatisfiedLinkError
Java UnsatisfiedLinkError while native library is found
我有一个 Java 小程序,它允许我访问远程服务器中的本地存储。它在 Windows(IE 7.0.5730.13, Java SE 1.6.0.05) 下运行良好。根据 Java 控制台,它为 Java 本机接口下载本机库:
ClientInterface::downloadLib: downloaded C:\Documents and Settings\user\IBM.10.10.65\remotedrive3d.dll in 1 attempts.
Initializing RemoteDisk v2.2
..我可以访问本地存储设备:
在 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)
..我无法访问本地存储设备:
当我使用 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, "7ELF[=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=]4S[=14=][=14=]04[=14=][=14=][=14=]"..., 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不兼容?如何进一步调试?
这是 http://icedtea.classpath.org/bugzilla/enter_bug.cgi?product=IcedTea-Web 的问题,不是堆栈溢出。作为 ITW 开发人员,我需要帮助调试一下。
从痕迹中可以清楚地看出体系结构大杂烩。我敢打赌你的 windows 是 32b,但 linux 是(肯定的)64b 机器。出于某种原因,ITW 正在下载您的 RemoteDrive 库的 32b 版本。 32b 库 应该 在 64b 系统上工作,但您还需要 32b 依赖项(很可能还需要 32b java)。你都有吗?
如果以上完全正确,那么它就是错误 i ITW,或者 jdk itslef。但我打赌以上。
所以:尝试 32 jdk,尝试各种 32b 依赖项,如果不起作用,请将错误提交给 ITW
HtH
J.
我有一个 Java 小程序,它允许我访问远程服务器中的本地存储。它在 Windows(IE 7.0.5730.13, Java SE 1.6.0.05) 下运行良好。根据 Java 控制台,它为 Java 本机接口下载本机库:
ClientInterface::downloadLib: downloaded C:\Documents and Settings\user\IBM.10.10.65\remotedrive3d.dll in 1 attempts.
Initializing RemoteDisk v2.2
..我可以访问本地存储设备:
在 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)
..我无法访问本地存储设备:
当我使用 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, "7ELF[=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=]4S[=14=][=14=]04[=14=][=14=][=14=]"..., 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不兼容?如何进一步调试?
这是 http://icedtea.classpath.org/bugzilla/enter_bug.cgi?product=IcedTea-Web 的问题,不是堆栈溢出。作为 ITW 开发人员,我需要帮助调试一下。
从痕迹中可以清楚地看出体系结构大杂烩。我敢打赌你的 windows 是 32b,但 linux 是(肯定的)64b 机器。出于某种原因,ITW 正在下载您的 RemoteDrive 库的 32b 版本。 32b 库 应该 在 64b 系统上工作,但您还需要 32b 依赖项(很可能还需要 32b java)。你都有吗?
如果以上完全正确,那么它就是错误 i ITW,或者 jdk itslef。但我打赌以上。
所以:尝试 32 jdk,尝试各种 32b 依赖项,如果不起作用,请将错误提交给 ITW
HtH J.