У меня есть «доказательство концепции» работы, которая пересекает какую-то незнакомую территорию. Мне поручено подключить машину EFTPOS к приложению, запущенному как апплет в браузере в нашей интрасети.Вызов DLL из апплета через JNI
Я проигнорировал dll EFTPOS на данный момент и создал простую JNI-декорированную DLL на моем выбранном языке (Delphi), который просто записывает строку в текстовый файл в c: \, и я могу успешно ее вызвать из локальное приложение Java.
Однако, когда я создаю апплет, чтобы сделать то же самое, скомпилируйте его в .JAR, подпишите JAR & попробуйте вызвать метод в апплете через Javascript на веб-странице, с которой он не работает.
Старший Java-парень, с которым я работаю, не думает, что это возможно, чтобы заставить его работать, потому что по своей сути «зло» позволяет апплету это делать.
В файл java.policy можно вставить запись, чтобы разрешить loadLibrary. а также allPermission & Я пробовал целый ряд вариаций вдоль этих линий все безрезультатно, производящих следующий след ошибки в Java Console:
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)
Ключ линии, кажется, «Вызванной: Java. security.AccessControlException: доступ запрещен (java.lang.RuntimePermission loadLibrary.DLoggerImpl) ", что подразумевает проблему с разрешениями. Возможно, я ошибаюсь в неправильном файле политики или неправильном подписи, или что-то вроде этого, или может быть, что Java жестко не разрешает подобные разрешения для апплета из-за угрозы безопасности.
Мой вопрос: я трачу свое время? Это можно сделать & если да, то как?
Благодаря в ожидании
Майк
Я думаю, что стоит упомянуть, что с помощью нашего java-аплета, который загружает библиотеки DLL, большой процент (95%) клиентов может без проблем запускать апплет. Поэтому должно быть какое-то другое объяснение этого поведения, какая-то комбинация браузера/JVM/OS, которая вызывает этот эффект. – davidecr