Ich habe eine "Proof of Concept" Arbeit, die in ein unbekanntes Gebiet übergeht. Ich habe die Aufgabe, einen EFTPOS-Computer mit einer Anwendung zu verbinden, die als Applet in einem Browser in unserem Intranet ausgeführt wird.Aufruf einer DLL von einem Applet über JNI
Ich habe die EFTPOS DLL für den Moment ignoriert und eine einfache JNI verzierte DLL in meiner Sprache der Wahl (Delphi) erstellt, die nur eine Zeichenfolge in eine Textdatei in c: \ protokolliert und ich kann sie erfolgreich von a aufrufen lokale Java-Anwendung.
Wenn ich jedoch ein Applet erstellen, um die gleiche Sache zu tun, kompilieren Sie es in .JAR, signieren Sie die JAR & versuchen, die Methode im Applet über Javascript auf einer Webseite aufzurufen es schlägt fehl.
Ein älterer Java-Typ, mit dem ich arbeite, glaubt nicht, dass es möglich sein wird, dies zum Laufen zu bringen, weil es von Natur aus "böse" ist, einem Applet dies zu ermöglichen.
Es gibt einen Eintrag, den Sie in eine java.policy-Datei einfügen können, um loadLibrary zuzulassen. sowie AllPermission & Ich habe alles ohne Erfolg in diese Richtung eine ganze Reihe von Variationen versucht, die folgenden Fehler Spur in der Java-Konsole produzieren:
java.lang.ExceptionInInitializerError
at app.TestApplet.LogAString(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.plugin.javascript.JSInvoke.invoke(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
at sun.plugin.com.MethodDispatcher.invoke(Unknown Source)
at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source)
at sun.plugin.com.DispatchImpl$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.com.DispatchImpl.invoke(Unknown Source)
Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission loadLibrary.DLoggerImpl)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkLink(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at app.DLogger.<clinit>(Unknown Source)
... 16 more
java.lang.Exception: java.lang.ExceptionInInitializerError
at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source)
at sun.plugin.com.DispatchImpl$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.com.DispatchImpl.invoke(Unknown Source)
Der Schlüssel Linie scheint „von verursacht werden: java. security.AccessControlException: Zugriff verweigert (java.lang.RuntimePermission loadLibrary.DLoggerImpl) "was ein Berechtigungsproblem impliziert. Es könnte sein, dass ich die Policy-Datei falsch - oder die Signierung falsch - oder ähnliches bekomme, oder es könnte sein, dass Java fest damit verbunden ist, solche Berechtigungen für ein Applet wegen des Sicherheitsrisikos nicht zuzulassen.
Meine Frage ist verschwende ich meine Zeit? Kann es getan werden & wenn ja, wie?
Dank im Vorgriff
Mike
Ich denke, es war erwähnenswert, dass mit unserem Java-Applet, das DLLs lädt, ein großer Prozentsatz (95%) der Clients das Applet ohne Probleme ausführen kann. Es muss also eine andere Erklärung für dieses Verhalten geben, eine Art Browser/JVM/OS-Kombination, die diesen Effekt verursacht. – davidecr