关于Java 加载dll

   最新写了一个关于Foxbpm设计器插件使用SQLite数据库,有关Foxbpm设计器插件详情请参考github官方https://github.com/FoxBPM/FoxBPM-Designer

   期初在网上下载了一个SQLite的jar和一个dll,发现Foxbpm设计器插件如果要使用SQLite,就要让插件能够加载到该dll,而且根据项目要求该dll最终是要放到插件包中,这样就有遇到一个问题,如何让Eclipse插件加载jar包中dll,后来在网上搜索”关于Eclipse插件加载dll"

(http://hi.baidu.com/eulxzyvuetaluve/item/d8b6901f57c9074be65e065b),发现可以在以相对plugin根目录的指定目录(ws/win32.os/win32/x86,os/win32/,nl/zh/CN,nl/zh/)中放置dll就可以了实现自动加载,但是我们这个Foxbpm设计器插件是要面向多系统的,刚开始在windows下我在Foxbpm设计器插件根目录下创建os/win32,并将dll文件放置该目录通过System.loadLibrary("sqlite_jni");是可以加载成功,但是发现在mac系统上不知道如何在Foxbpm设计器插件根目录的指定相应目录了。

   最后直接到SQLite官方(http://www.sqlite.org/download.html)下载一个包含dll的驱动包sqlite-jdbc4-3.8.2-SNAPSHOT,里面包含windows,mac,liunx系统下的dll文件,从而实现了Foxbpm设计器在mac系统下使用SQLite数据库
    关于Java 加载dll_第1张图片
 

最后自己总结了下java加载dll

1、在java.library.path(加载库时搜索的路径列表)下加载dll

//加载java.library.path下的dll
System.loadLibrary("WindowsCommand");
注意不需要带上文件名后缀

 2、在绝对目录下加载dll

//加载d:\\目录下的dll
System.load("d:\\WindowsCommand.dll");
注意需要带上文件全路径

    3、下面介绍一种,如何加载jar中的dll

	InputStream in = null;
	OutputStream out = null;
	try {
		URL url = TestLoadDll.class.getClassLoader().getResource("WindowsCommand.dll");
		if (null != url) {
			File f = new File(url.toURI());
			String tempPath = System.getProperty("java.io.tmpdir");
			// 将jar包中的dll资源,在默认的临时文件路径下重新生成dll文件
			File tempFile = new File(tempPath + "hello.dll");
			in = url.openStream();
			out = new FileOutputStream(tempFile);
			byte[] bytes = new byte[1024];
			while (in.read(bytes) != -1) {
				out.write(bytes);
			}
			out.flush();
			out.close();
			// System.getProperty("java.io.tmpdir");临时目录下加载dll
			System.load(tempFile.getAbsolutePath());
		}
	} catch (Exception e) {
	} finally {
		if (null != in) {
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		if (null != out) {
			try {
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

 

   以上代码在我本机执行,会在C:\Users\yangguang\AppData\Local\Temp目录下生成hello.dll文件

  上面代码思想是,首先将通过类加载器获取包中dll资源,同时在 java.io.tmpdir临时目录下生成hello.dll文件,然后将获取的dll资源写入生成的临时文件中,最后通过System.load(tempFile.getAbsolutePath());方式加载。

 

 

 

 

 

你可能感兴趣的:(FoxBPM,JAVA,eclipse)