【发布时间】:2009-11-11 06:20:55
【问题描述】:
我有一个“概念证明”的工作,它跨越了一些不熟悉的领域。 我的任务是将 EFTPOS 机器连接到在我们内部网的浏览器中作为小程序运行的应用程序。
我暂时忽略了 EFTPOS dll,并用我选择的语言 (Delphi) 创建了一个简单的 JNI 修饰 DLL,它只将字符串记录到 c:\ 中的文本文件中,我可以从本地成功调用它Java 应用程序。
但是,当我创建一个小程序来执行相同的操作时,将其编译为 .JAR,签署 JAR 并尝试通过网页上的 Javascript 调用小程序中的方法,但失败了。
与我一起工作的一位高级 Java 人员认为这不可能实现,因为允许小程序执行此操作本质上是“邪恶的”。
您可以在 java.policy 文件中添加一个条目以允许 loadLibrary。以及 allPermission 和我已经尝试了这些方面的一大堆变体,但都无济于事,在 Java 控制台中产生了以下错误跟踪:
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)
关键行似乎是“Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission loadLibrary.DLoggerImpl)”,这意味着权限问题。可能是我弄错了策略文件 - 或签名错误 - 或类似的东西,或者可能是因为安全风险,Java 硬连线不允许 Applet 的此类权限。
我的问题是我在浪费时间吗?可以吗?如果可以,怎么做?
感谢期待
迈克
【问题讨论】:
-
我认为值得一提的是,使用我们加载 DLL 的 java 小程序,很大一部分 (95%) 的客户端可以毫无问题地执行该小程序。因此,这种行为肯定有其他解释,某种浏览器/JVM/OS 组合会导致这种效果。
标签: java applet java-native-interface