我正在尝试从jar中加载一个dll文件,以便使用此修补程序处理applet:
我创建文件,将其设置为可写和可执行文件,但是当我用canWrite()/ canExecute()检查它时 它返回false。小程序已签名。
代码:
private static void loadLib() {
URL res = SystemActivityNotifications.class.getResource("/sys-native
/sysactivitynotifications.dll");
InputStream in = res.openStream();
File dll = new File(path + "sysactivitynotifications.dll");
dll.setExecutable(true);
dll.setWritable(true);
logger.info(dll.canWrite() + " " + dll.canExecute());
FileOutputStream fos = new FileOutputStream(dll);
byte[] array = new byte[1024];
try {
for(int i = in.read(array); i != 1; i=in.read(array)) {
fos.write(array, 0, i);
}
} catch (IOException e) { logger.info("Cannot write to file: " + e.getMessage()); }
fos.close();
in.close();
System.load(dll.getAbsolutePath());
}
文件已正确创建,但在尝试写入时会抛出异常。
编辑:它第二次运行applet时写入文件,但如果我删除文件并再次运行,则第一次迭代不起作用。
忘记提及:上面的所有代码都来自System.load.library(dll)之后的一个catch块;抛出异常。
try
{
System.loadLibrary("sysactivitynotifications");
ptr = allocAndInit();
if (ptr == -1)
ptr = 0;
}
catch (Throwable t)
{
if (t instanceof ThreadDeath)
throw (ThreadDeath) t;
else {
loadLib();
}
}
编辑:它抛出了这个错误:
java.lang.UnsatisfiedLinkError: C:\: The process cannot access the file because it is being used by another process
答案 0 :(得分:1)
..尝试从jar加载一个dll文件以使用applet ..
对于部署Java applet,最好的选择通常是使用Java Web Start启动applet。 JWS适用于Windows,OS X& * nix中。
Java Web Start(JWS)是Oracle Corporation用于直接从网络或Internet链接启动富客户端(Swing,Java-FX,AWT,SWT ..)桌面应用程序的技术。它为支持Java的平台提供“一键式”安装。
JWS提供了许多吸引人的功能,包括但不限于启动屏幕,桌面集成,文件关联,自动更新(包括延迟下载和程序控制更新),原生的分区&按平台,体系结构或语言环境下载的其他资源,运行时环境的配置(最低J2SE版本,运行时选项,RAM等),使用扩展轻松管理公共资源..
将原生代码放在(已签名)Jar的根目录中,并在启动文件中添加对该Jar的引用,它们将被放置在应用程序的类路径中。