"这篇资源提供了解决Java工程中导入和使用DLL文件的方法,特别是当遇到'no dll文件 in java.library.path'错误时。通过将DLL放入项目源码目录,并使用提供的Java代码动态加载到JDK的bin目录下,避免了手动复制到system32目录或添加额外库依赖的需求。主要涉及的技术点包括Java对本地库的调用、DLL动态加载以及系统环境变量的使用。" 在Java开发中,有时我们需要调用本地库,例如C++编译的DLL文件,以便利用其提供的功能。Java通过JNI(Java Native Interface)机制实现了对本地库的调用。当将包含JNI调用的Java项目打包成jar文件并在另一台机器上运行时,可能会遇到找不到DLL文件的问题,因为系统无法在`java.library.path`指定的路径中找到所需的DLL。 本资源提供了一种解决方案,首先确保目标机器已安装了JDK。然后,将DLL文件放置在项目的src目录下,这样它会随着源码一起被编译和打包。接下来,需要在主类中添加一段Java代码来动态加载DLL。这段代码首先通过`System.getProperty("os.name")`获取操作系统类型,然后根据系统类型决定使用.dll还是.so作为库的扩展名。接着,获取JDK的安装路径,通常是`java.home`系统属性所指的路径,然后在该路径下的bin目录创建一个新的文件,用于存放动态加载的DLL。 加载DLL的关键步骤在于使用`getResourceAsStream`方法从类路径加载DLL文件。由于DLL文件在运行时需要位于可执行文件的搜索路径中,因此这里将其写入到JDK的bin目录下。通过`BufferedInputStream`和`FileOutputStream`读写文件内容,完成DLL的复制。这样,即使没有手动将DLL复制到system32目录,或者没有在系统环境中添加新的库路径,Java程序也能找到并加载所需的DLL。 此方法适用于那些需要在不同环境中运行且避免手动配置的Java应用,尤其是当应用需要跨平台运行时。需要注意的是,这种方法只解决了DLL的加载问题,如果DLL本身依赖其他库或有特定的环境要求,还需要确保目标系统满足这些条件。同时,这种方法可能不适合那些对安全性有严格要求的环境,因为它涉及到在JDK的bin目录下写入文件。
首先,将dll文件放在项目根目录src文件夹下。
将以下函数代码加到主类中,将代码中的ZhuLeiMing替换为你的主类的名称。
//libFullName是你的dll文件名称(不包括.dll)
public synchronized static void loadLib(String libName) throws IOException {
String systemType = System.getProperty("os.name");
String libExtension = (systemType.toLowerCase().indexOf("win") != -1) ? ".dll" : ".so";
String libFullName = libName + libExtension;
String nativeJDKDir = System.getProperty("java.home"); //获取程序运行环境的jdk目录路径
InputStream in = null;
BufferedInputStream reader = null;
FileOutputStream writer = null;
File extractedLibFile = new File(nativeJDKDir +"\\bin\\"+ File.separator + libFullName); //jdk路径里的bin目录。File.separator是创建文件的意思。l
if (!extractedLibFile.exists()) {
try {
in =ZhuLeiMing.class.getResourceAsStream("/" + libFullName); // ZhuLeiMing替换为你的主类的名称。
if (in == null)
in = ZhuLeiMing.class.getResourceAsStream(libFullName);
ZhuLeiMing.class.getResource(libFullName);
reader = new BufferedInputStream(in);
writer = new FileOutputStream(extractedLibFile);
byte[] buffer = new byte[1024];
while (reader.read(buffer) > 0) {
writer.write(buffer);
buffer = new byte[1024];
}
} catch (IOException e) {
e.printStackTrace();
} finally {
下载后可阅读完整内容,剩余1页未读,立即下载
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- OptiX传输试题与SDH基础知识
- C++Builder函数详解与应用
- Linux shell (bash) 文件与字符串比较运算符详解
- Adam Gawne-Cain解读英文版WKT格式与常见投影标准
- dos命令详解:基础操作与网络测试必备
- Windows 蓝屏代码解析与处理指南
- PSoC CY8C24533在电动自行车控制器设计中的应用
- PHP整合FCKeditor网页编辑器教程
- Java Swing计算器源码示例:初学者入门教程
- Eclipse平台上的可视化开发:使用VEP与SWT
- 软件工程CASE工具实践指南
- AIX LVM详解:网络存储架构与管理
- 递归算法解析:文件系统、XML与树图
- 使用Struts2与MySQL构建Web登录验证教程
- PHP5 CLI模式:用PHP编写Shell脚本教程
- MyBatis与Spring完美整合:1.0.0-RC3详解