在Java程序中加载Native/Dynamic DLL
来源:互联网 发布:网络推广文案分析 编辑:程序博客网 时间:2024/06/05 05:24
虽然很少或者说Java本身也不推荐用Java去调用Native/Dynamic DLL,但是Java还是提供了该功能,以方便开发人员可以利用Navtive code去更好的实现Java不能实现的功能(比如效率原因或者很多老的代码)。
有好几种方法可以让JAVA在运行过程中找到并加载DLL:
1. Call System.load去加载dll (绝对路径)
import com.chilkatsoft.CkZip;public class Test { static { try { System.load("C:/chilkatJava/chilkat.dll"); } catch (UnsatisfiedLinkError e) { System.err.println("Native code library failed to load.\n" + e); System.exit(1); } } public static void main(String argv[]) { CkZip zip = new CkZip(); System.out.println(zip.version()); }}
2. 复制DLL 到 java.library.path中的任何一个路径当中
首先查看当前的路径有哪些,比如在DOS命令下 echo %PATH%或者利用下面的代码去查看
String property = System.getProperty("java.library.path");StringTokenizer parser = new StringTokenizer(property, ";");while (parser.hasMoreTokens()) { System.err.println(parser.nextToken()); }
Note: Java.library.path的初始化值包含了PATH, 只不过文件夹的先后顺序可能不一样,当然当前路径肯定在Java.library.path里面,但是不一定在PATH里面。
如果要加载的dll在这些目录下的任何一个,则跟方法1比较,不需要绝对路径,
import com.chilkatsoft.CkZip;public class Test { static { try { System.loadLibrary("chilkat"); } catch (UnsatisfiedLinkError e) { System.err.println("Native code library failed to load.\n" + e); System.exit(1); } } public static void main(String argv[]) { CkZip zip = new CkZip(); System.out.println(zip.version());} }
3.修改PATH环境变量,增加DLL所在的目录
修改环境变量的方式有几种,但是并不是所有的方式在Run-Time都是有效的。
通过控制面板修改环境变量是有效的,不过不同的操作系统在修改环境变量的时候界面不一样,
注意: 通过DOS 命令去修改PATH (set PATH=c:\childJava;%PATH%)是无效的,同时通过以下Java程序去修改PATH也是无效的,
static { try { // Adding a directory to java.library.path here will not change anything. // System.loadLibrary will still look in the directories listed in java.library.path // as it existed at the very start of the program. // The extra directory path added to java.library.path will not // be searched by loadLibrary. String libpath = System.getProperty("java.library.path"); libpath = libpath + ";C:/chilkatJava"; System.setProperty("java.library.path",libpath); System.loadLibrary("chilkat"); } catch (UnsatisfiedLinkError e) { System.err.println("Native code library failed to load.\n" + e); System.exit(1); } }
4. 启动java程序的时候通过DOS命令并且利用选项-D 去设置java.library.path.
java -Djava.library.path=c:\chilkatJava TestAPP
5. 如果是Eclipse进行调试则在Eclipse里设置Java.library.path
在Eclipse右键 project,选择properties, 然后选择Run/Debug Settings, 然后选择tab页"Arguments",在该页面中的VM Arguments编辑框中增加
“-Djava.library.path="c:\chilkatJaa;${env_var:PATH}"”,其中 c:\chilkatJava文件夹下包含chilkat.dll
总结:
通过上述的几种方法,实际上都是修改的Java.library.path,由于在启动java程序的时候,对该变量的加载只有一次(具体可以查看JDK 源代码),在启动后修改都是无效的,你会发现所有有效的修改都是在启动java application之前完成的。
原网址https://www.chilkatsoft.com/java-loadlibrary-windows.asp
- 在Java程序中加载Native/Dynamic DLL
- How to Load a Java Native/Dynamic Library (DLL)
- How to Load a Java Native/Dynamic Library (DLL)
- Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API)
- 动态加载类(在程序中调用DLL文件)
- 动态加载类(在程序中调用DLL文件)
- 在java中调用c程序--native方法的学习
- 在java中使用JNA调用加载DLL
- 在C#中动态加载类(在程序中调用DLL文件)
- 如何在托管程序中动态加载dll并且调用其中的函数
- 用#import导入dll和用#pragma comment导入lib还有在程序中LoadLibrary加载dll 区别
- 在 Android Native 程序中输出 LOG
- 在Symbian中动态加载DLL
- 在Symbian中动态加载DLL
- Dll的编写 在unity中加载
- 在C#中动态调用native dll的导出函数
- 在程序中加载控件
- 在Android中使用native程序(非Java)来广播intent
- 好用的一些网站
- 如何使用Echarts 搭建环境及使用
- jQuery核心技术 (一)
- 随机森林原理
- 一文告诉你,NIPS 2017有多火爆 | 附PPT、视频、代码大总结
- 在Java程序中加载Native/Dynamic DLL
- 【VUE】.NET实现Tree组件双向绑定数据(2)
- LeetCode 113. Path Sum II
- mysql5.7的安装与配置(centos7环境)
- 使用ServiceController控制windows服务
- 使用swoole实现异步任务处理
- 《OpenCV3编程入门》第五章core组件进阶学习笔记part2
- <转载>eclipse(4) api显示此元素既未附加源代码也未附加 Javadoc,因此无法找到 Javadoc。
- 皇后问题