Java - 将jar内的dll文件写入硬盘?

时间:2011-03-31 07:14:11

标签: java dll file-io jar java-native-interface

我有一个已签名的applet,我想写出包含在我启动applet的jar中的dll文件。

我这样做是因为我想在dll上执行System.load,因为显然你无法从applet中的jar内部加载DLL。

第二个问题是你是否可以在applet中添加环境变量 - 例如我想将我的DLL提取到硬盘驱动器的位置并添加环境变量,以便System.load可以找到它。

3 个答案:

答案 0 :(得分:6)

你应该能够通过以下方式实现这一目标:

  1. 将小程序jar中的.dll解压缩到系统临时目录中。
  2. 使用System.load(..)在提取的文件上调用AccessController
  3. 这种方法可以避免设置环境变量。这是一些示例代码:

    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,这可能会解决您的问题

http://jna.java.net/