Java:从本地小程序调用.dll。。。I';我做错了什么事

Java:从本地小程序调用.dll。。。I';我做错了什么事,java,security,dll,applet,local,Java,Security,Dll,Applet,Local,由于小程序是本地安装的,因此不应有安全限制 但我得到: java.security.AccessControlException:拒绝访问(java.lang.RuntimePermission loadLibrary.jzmq) 当我的应用程序尝试调用 static{ System.loadLibrary("jzmq"); } 有什么好处? 在没有安全问题的情况下(因为它是用户安装的本地小程序,所以应该如此),我缺少什么使它能够顺利工作 顺便说一句,它在Eclipse“Run”中运

由于小程序是本地安装的,因此不应有安全限制

但我得到:

java.security.AccessControlException:拒绝访问(java.lang.RuntimePermission loadLibrary.jzmq)

当我的应用程序尝试调用

static{
     System.loadLibrary("jzmq");
}
有什么好处? 在没有安全问题的情况下(因为它是用户安装的本地小程序,所以应该如此),我缺少什么使它能够顺利工作


顺便说一句,它在Eclipse“Run”中运行良好,只是不在我希望它运行的浏览器中。

通过浏览器插件从本地文件系统(文件://)运行的小程序与从web加载的小程序受到几乎完全相同的安全检查。不同之处在于,从web加载的小程序具有“呼叫总部”的权限,即连接回小程序的源服务器,从文件系统加载的小程序具有访问同一文件夹中文件的权限

默认情况下,沙盒不允许在任何情况下加载本机库

你可以考虑签署小程序。用户必须确定安全对话框。除非您从证书颁发机构购买了代码签名证书,否则该对话框将警告用户该证书未由受信任方签名

我不完全理解您的用例,但是如果您可以在本地机器上运行其他代码,您可以随时更改java安全策略,以便信任某个特定本地位置的.jar文件。这样就不会出现任何安全对话框

为此,您需要修改java策略文件,在使用java 6的windows计算机上,该文件可能位于:

%程序文件%\Java\jre6\lib\security\Java.policy

并添加一个新权限,如下所示:

grant codeBase "file:///path/yourcomponent.jar" {
      permission java.lang.RuntimePermission "loadLibrary.jzmq";
};
编辑:要授予完全权限,您可以添加这样的权限(这是从我刚才成功的测试中复制的):


“本地安装”是什么意思?您是否在
文件上运行它://
?大多数浏览器对这些URL(包括JavaScript)有不同的安全策略。我不确定使用“本地”小程序的动机是什么。通过文件://,是的。我的动机是让硬件用户界面设备与某些web应用程序交互。小程序在所有浏览器中都能启动并正常工作,但在尝试上述调用时除外。我不完全确定,但我认为即使从file:///URL运行它,它仍会在沙箱中运行。你的小程序签名了吗?为了“走出沙箱”(执行特定的不安全操作),必须对小程序进行签名,用户必须信任证书颁发机构(应该弹出对话框)。您的上一个解决方案听起来非常适合我所做的。它似乎不起作用。小程序不必为此进行签名,是吗?你确定它能用吗?编辑文件后是否必须重新启动计算机?或者我必须在编辑文件后重新编译jar或类吗?正确,小程序不需要签名。原理是可行的,我从未使用loadLibrary权限进行过测试,对于调试,您还可以授予AllPermission,这允许小程序执行所有操作。不需要重新编译。根据我的经验,重新启动浏览器(关闭所有浏览器窗口)就足够了。需要注意的是:在路径上首选正斜杠。授权行上的路径必须与.jar的路径匹配,并且applet标记必须使用“archive”参数引用相同的.jar。如果您不使用.jar,而是使用一个或多个松散的.class文件,那么您可能会在授权行中添加类似的内容:grant codeBase“file:///path/where/classes/live/-“(对于递归子目录,在末尾加上减号)太棒了!!你的第一个例子确实有效!!(我只是从jdk lib文件夹而不是“jre6”中选择了错误的java.policy文件)。这些策略在更新Java时是否会更改回默认值,从而使我的更改无效?或者它们在用户的计算机上保持永久性?我可以制作一个Windows“安装”程序,在他们安装我的软件时自动执行这些策略更改吗?我必须用蛮力找到这个“java.policy”文件,还是有一个更简单的命令?很好的问题,不幸的是我没有任何答案。
grant codeBase "file:///C:/component/policytest.jar" {
      permission java.security.AllPermission;
};