2017-05-08 4 views
1

Ich habe ein Java-Applet, mit dem ich auf lokalen Speicher im Remote-Server zugreifen kann. Es funktioniert gut unter Windows (IE 7.0.5730.13, Java SE 1.6.0.05). Nach Java Console lädt es die native Bibliothek für Java Native Interface:Java UnbefriedigterLinkError, während native Bibliothek gefunden wird

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

..und ich bin in der Lage lokale Speichergeräte zuzugreifen:

local storage devices under Windows

unter Linux mit OpenJDK 1.8. 0_121 und IcedTea-Web 1.6.2 es lädt auch die native Bibliothek:

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

Es ist jedoch nicht mit einer UnsatisfiedLinkError Fehlermeldung auszuführen:

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) 

..und ich bin nicht in der Lage lokale Speichergeräte zuzugreifen:

local storage devices under Linux

Wenn ich die Firefox starten mit strace -f, dann kann ich klar sehen, dass libibmxrdisk.so.1.0.3 Datei zugegriffen wird. Zum Beispiel:

[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) 

Diese /root/IBM/10.10.10.65/libibmxrdisk.so.1.0.3 scheint Strings wie GetSupportedDevices zu enthalten:

[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# 

ist die proprietäre native Bibliothek libibmxrdisk.so.1.0.3 für Linux-Betriebssystem wahrscheinlich defekt? Ist es möglich, dass es nicht mit OpenJDK kompatibel ist? Wie debugge ich das weiter?

+1

Was 'file sagen libibmxrdisk.so.1.0.3' nicht ITW? – omajid

+1

Holen Sie sich eine Kopie von 'libibmxrdisk.so.1.0.3' und führen Sie' ldd' aus, um zu sehen, von welchen anderen Bibliotheken es abhängt. – alvits

+0

Dies kann der Fall sein, falls die Bibliothek bereits von Ihrer Anwendung geladen wurde und die Anwendung versucht, sie erneut zu laden, wird der 'UnatisfiedLinkError' von der JVM ausgelöst, siehe https://examples.javacodegeeks.com/java-basics/exceptions/java-lang-unzufriedenerlinkerror-how-to-handle-unzufriedener-link-error/ –

Antwort

1

Dies ist ein Problem für http://icedtea.classpath.org/bugzilla/enter_bug.cgi?product=IcedTea-Web nicht Stapelüberlauf. Als ITW-Entwickler muss ich beim Debuggen ein wenig mithelfen.

Aus der Spur ist klare Architektur Mischmasch. Ich würde wetten, dass Ihre Windows 32b sind, aber Linux ist (sicher) 64b Maschine. Aus irgendeinem Grund lädt ITW die 32b-Version Ihrer RemoteDrive-Bibliothek. 32b Bibliothek sollte auf 64B System arbeiten, aber Sie müssen auch 32b Dependenzen (und höchstwahrscheinlich auch 32b Java). Hast du sie alle?

Wenn oben alles wahr ist, dann ist es Bug i ITW, oder jdk itslef. Aber ich wette für oben.

So: 32 jdk versuchen, verschiedene 32b depndencies versuchen, wenn nicht funktioniert, dann wählen Sie bitte die Fehler

HtH J.

+0

Vielleicht dieses 32-Bit' libibmxrdisk. so.1.0.3' Bibliothek ist die einzige von Web-Anwendung zur Verfügung gestellt? Außerdem, so wie ich es verstanden habe, ist diese 'libibmxrdisk.so.1.0.3' Datei eine native Linux ausführbare Datei, d. H. Sie benötigt definitiv 32 Bit Abhängigkeiten, aber warum sollte sie 32 Bit JVM benötigen? – Martin

+0

Warum 32b jvm? Weil Prozesse das nicht können. Im 64b-System kann der Prozess 32b oder 64b sein, aber nicht kombiniert. Im Allgemeinen können Sie nicht 32deps von 64b Prozess laden (und natürlich umgekehrt) – judovana

+0

Sehen Sie dieses Beispiel: https://jvanek.fedorapeople.org/jniTest/: seien Sie sicher, dass Sie es von Ihrem CWD laufen lassen. Ich erstelle es auf 64b fedora 24. Java kompiliert von javac * .java (also keine Magie hier), aber CLibHelloWorld in 64b Ordner wie 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, aber im 32b-Ordner mit -m32 (also 32b-Bibliothek). – judovana

Verwandte Themen