我有一个已签名的applet,我想写出包含在我启动applet的jar中的dll文件。
我这样做是因为我想在dll上执行System.load,因为显然你无法从applet中的jar内部加载DLL。
第二个问题是你是否可以在applet中添加环境变量 - 例如我想将我的DLL提取到硬盘驱动器的位置并添加环境变量,以便System.load可以找到它。
答案 0 :(得分:6)
你应该能够通过以下方式实现这一目标:
.dll
解压缩到系统临时目录中。System.load(..)
在提取的文件上调用AccessController
。这种方法可以避免设置环境变量。这是一些示例代码:
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
String dllName = "my.dll";
File tmpDir = new File(System.getProperty("java.io.tmpdir"));
File tmpFile = new File(tmpDir, dllName);
try {
InputStream in = getClass().getResourceAsStream(dllName);
OutputStream out = new FileOutputStream(tmpFile);
byte[] buf = new byte[8192];
int len;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
in.close();
out.close();
System.load(tmpFile.getAbsolutePath());
} catch (Exception e) {
// deal with exception
}
return null;
}
});
答案 1 :(得分:0)
如果用户有一个Next Generation插件2 JRE,那么。可以使用Java Web Start嵌入applet。 JWS可以轻松地将本机添加到应用程序或applet的运行时类路径中。
如果用户没有插件2 JRE,您仍然可以使用JWS启动applet(自由浮动)。
如果使用JWS部署,则不需要设置环境变量。
答案 2 :(得分:0)
看看JNA,这可能会解决您的问题