最新写了一个关于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.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());方式加载。
相关推荐
标题“Java加载dll,导致Java进程内存泄露”涉及到的是Java平台与本地库(DLL)交互时可能出现的问题。在Java中,通过Java Native Interface (JNI) 可以调用C/C++编写的动态链接库(DLL),实现Java代码与本地代码的...
4. **加载DLL和调用方法**: 在Java代码中,使用`System.loadLibrary`加载本地库,然后可以调用`DesUtil.encrypt`和`DesUtil.decrypt`进行DES加密解密。 ```java public class Main { public static void main...
java 加载dll 异常,包含调试运行和打jar 可以参考https://blog.csdn.net/ADdhtfdhdg/article/details/108754087
3. **加载DLL**:使用`LibraryLoader`或自定义`NativeLibrary`实例加载DLL文件。 4. **调用DLL函数**:通过接口实例调用DLL中的函数,传递必要的参数,包括回调函数接口实例。 5. **处理回调**:在定义的回调函数...
### Windows环境下Java加载DLL #### 一、概述 在Windows环境下使用Java程序调用本地动态链接库(Dynamic Link Library,简称DLL)是一项常见的需求。Java提供了多种方式来加载DLL文件,以便实现与本地代码的交互。...
- **加载DLL**:使用JNative库提供的API,如`JLibrary.loadLibrary()`,加载DLL文件。确保DLL文件与Java应用程序在同一目录下,或者指定正确的路径。 - **定义本地方法**:在DLL的C/C++代码中,实现与Java中声明的...
5. 在Java程序中编译并运行,Java会自动加载DLL并调用native方法。 除了JNI,还可以使用JNA库来调用DLL。JNA是一种更高级、更易用的接口,它允许Java直接映射到DLL中的函数,而无需编写本地代码。使用JNA时,你只...
3. **加载DLL**:使用`Native.loadLibrary`方法加载DLL库,传入DLL的名称和定义接口的类。 4. **调用函数**:现在你可以像调用Java方法一样调用DLL中的函数了。 示例代码: ```java public interface MyDLL ...
总结来说,Java调用DLL文件主要依赖于JNative库,通过定义Java接口、加载DLL、获取函数句柄、创建代理对象以及调用函数等步骤实现。这种方法使得Java开发者能够充分利用C/C++库的功能,同时也保持了Java的跨平台特性...
### JAVA调用DLL方法 在跨平台开发领域中,Java作为一种强大的编程语言,因其具有良好的移植性和跨平台性而被广泛使用。然而,在某些特定情况下,我们可能需要调用本地库(例如DLL文件)来实现特定功能或提高性能。...
**msjava.dll 文件详解** msjava.dll 是一个关键的动态链接库(DLL)文件,它在微软的操作系统中起着核心作用。...了解并掌握关于msjava.dll的知识,有助于我们更好地理解和处理系统中的Java相关问题。
- `System.loadLibrary()`:这是Java中加载DLL的主要方法,它会查找系统路径下的相应DLL文件。如果DLL不在系统路径中,需要手动指定完整路径。 2. **创建DLL** - 使用C++ IDE(如Visual Studio)或命令行工具(如...
创建一个Java类,声明native方法,并使用`System.loadLibrary`加载DLL。 ```java public class DllCall { static { System.loadLibrary("myDll"); } public native int add(int a, int b); public ...
3. **加载DLL**:使用`Library`接口的`Util.loadLibrary`方法加载DLL。例如,对于名为`myDll`的DLL,可以写成`LibraryLoader.loadLibrary("myDll")`。 4. **实现DLL接口**:JNA会自动将Java接口映射到DLL中的相应...
总结来说,Java调用DLL主要涉及JNI的使用,包括在Java中声明native方法,生成JNI头文件,编写C++代码实现接口,编译链接DLL,以及在Java中加载和调用DLL。这个过程允许Java开发者充分利用C++的高性能特性,同时保持...
在Java编程环境中,有时我们需要与操作系统底层功能进行交互,例如调用C语言编写的动态链接库(DLL)函数。在这种情况下,Java Native Access (JNA) 提供了一个强大的解决方案。JNA 是一个Java库,允许Java代码直接...