2017-05-08 125 views
1

我有一個Java小程序,它允許我訪問遠程服務器中的本地存儲。它在Windows下工作正常(IE 7.0.5730.13,Java SE 1.6.0.05)。根據Java控制檯它下載的Java本地接口的本地庫:使用OpenJDK的1.8發現本機庫時發生Java UnsatisfiedLinkError

local storage devices under Windows

在Linux下:

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

..和我能夠訪問本地存儲設備。 0_121IcedTea項目的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,那麼我可以清楚地看到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

[email protected]:~/IBM/10.10.10.65# strings libibmxrdisk.so.1.0.3 | grep -i GetSupportedDevices 
Java_VirtualDrive_PassThroughCommand_GetSupportedDevices 
GetSupportedDevices 
Java_VirtualDrive_PassThroughCommand_GetSupportedDevices 
[email protected]:~/IBM/10.10.10.65# 

是Linux操作系統專用機庫libibmxrdisk.so.1.0.3可能壞了?它可能與OpenJDK不兼容?如何進一步調試?

+1

是什麼'文件libibmxrdisk.so.1.0.3'說? – omajid

+1

獲取'libibmxrdisk.so.1.0.3'的副本並運行'ldd'來查看它依賴的其他庫。 – alvits

+0

這可能是因爲你的應用程序已經加載了庫,並且應用程序試圖再次加載它,那麼JVM將拋出'UnsatisfiedLinkError'參見https://examples.javacodegeeks.com/java-basics/exceptions/java-lang-unsatisfiedlinkerror-how-to-handle-unsatisfied-link-error/ –

回答

1

這是http://icedtea.classpath.org/bugzilla/enter_bug.cgi?product=IcedTea-Web不是堆棧溢出的問題。作爲ITW開發人員,我需要幫助調試一下。

從痕跡是明確的建築mishmash。我敢打賭你的窗戶是32b,但是linux(肯定)是64b機器。出於某種原因,ITW正在下載32位版本的RemoteDrive庫。 32b庫應該工作在64b系統上,但你也需要32b depnases(並且最有可能的還有32b java)。你有全部嗎?

如果上面是完全正確的,那麼它是我ITW或jdk itlef的bug。但我敢打賭。

所以:嘗試32 JDK,嘗試各種32B depndencies,如果不工作的話,請提交bug到ITW

HTH J.

+0

也許這32位'libibmxrdisk退出。 so.1.0.3'庫是唯一由Web應用程序提供的庫嗎?另外,據我瞭解,這個'libibmxrdisk.so.1.0.3'文件是一個本地Linux可執行文件,即它肯定需要32位依賴項,但爲什麼它需要32位JVM? – Martin

+0

爲什麼32b jvm?因爲進程不能這樣做。在64b系統上,進程可以是32b或64b,但不能組合。一般來說,你不能從64b進程加載32deps(當然反之亦然) – judovana

+0

看到這個例子:https://jvanek.fedorapeople.org/jniTest/:確定你是從你的CWD運行它。我在64b fedora 24上創建它。由javac * .java編譯的Java(這裏沒有魔術),但64b文件夾中的CLibHelloWorld被編譯爲gcc -I/usr/lib/jvm/java/include/-I/usr/lib/jvm/java/include/linux/-Wall -fpic -g -c CLibHelloWorld.c && gcc -shared -o CLibHelloWorld.so CLibHelloWorld.o,但是在32b文件夾中使用-m32(so 32b library)。 – judovana