System.load(String filename)和System.loadLibrary(String libname)的区别
2015-09-21 20:01
459 查看
前言
之前一篇文章在写Native方法的时候,第一个步骤里面有这么一段代码
其实JDK提供给用户了两个方法用于载入文件,一个是System.load(String filename)方法,另外一个是System.load(String libname)方法,本文主要写一下这两个方法之间的区别。
区别
1、加载的路径不同
System.load(String filename)我们看JDK API的描述是“从作为动态库的本地文件系统中以指定的文件名加载代码文件。文件名参数必须是完整的路径名。”,因此这个方法的参数必须是要加载的文件的完整路径,带文件后缀名。
System.loadLibrary(String libname)我们看JDK API的描述是“加载由libname参数指定的系统库。将库名映射到实际系统库的方法取决于系统”,这里关键问题就是系统库三个字。什么是系统库,做个实验,修改一下static块中的代码,用loadLibrary方法来加载
运行一下,看一下结果
![](http://images2015.cnblogs.com/blog/801753/201509/801753-20150921201753897-92731316.png)
看到报错了,在java.library.path中没有找到Hello,OK,那这样就很简单了,我们知道了系统库指的是java.library.path,用System.getProperty(String key)方法查看一下java.library.path指向的内容
打印的内容太多了,就不放上来了,反正放到任意的一个路径下都可以,注意一下不要带后缀名。至于java.library.path指的是什么,网上很多,就不做复制黏贴的工作了。
2、这个是网上看别人写的才知道的,假如A.dll和B.dll有依赖关系,比如A.dll静态链接到B.dll,那么如果选择System.load("D:/A.dll"),即使B.dll也放在D:/路径下,load方法还是会因为找不到依赖的.dll文件而失败。因为Java虚拟机在载入A.dll的时候,发现它依赖于B.dll,那么会先去java.library.path下载入B.dll,而B.dll并不位于java.library.path下。有两个解决方案:
(1)先System.load("D:/B.dll")再System.load("D:/A.dll")
(2)把A.dll和B.dll都放在java.library.path下,然后调用System.loadLibrary("A")
不过两个dll文件存在依赖关系,A.dll依赖于B.dll,属于别的领域的知识,我也不是很清楚,所以第二点也没有亲身试验过。权当把这个知识点放在这儿,以后万一遇到类似问题了,也有个解决问题的方向。
之前一篇文章在写Native方法的时候,第一个步骤里面有这么一段代码
static { System.load("D:" + File.separator + "Hello.dll"); }
其实JDK提供给用户了两个方法用于载入文件,一个是System.load(String filename)方法,另外一个是System.load(String libname)方法,本文主要写一下这两个方法之间的区别。
区别
1、加载的路径不同
System.load(String filename)我们看JDK API的描述是“从作为动态库的本地文件系统中以指定的文件名加载代码文件。文件名参数必须是完整的路径名。”,因此这个方法的参数必须是要加载的文件的完整路径,带文件后缀名。
System.loadLibrary(String libname)我们看JDK API的描述是“加载由libname参数指定的系统库。将库名映射到实际系统库的方法取决于系统”,这里关键问题就是系统库三个字。什么是系统库,做个实验,修改一下static块中的代码,用loadLibrary方法来加载
static { System.loadLibrary("Hello"); }
运行一下,看一下结果
![](http://images2015.cnblogs.com/blog/801753/201509/801753-20150921201753897-92731316.png)
看到报错了,在java.library.path中没有找到Hello,OK,那这样就很简单了,我们知道了系统库指的是java.library.path,用System.getProperty(String key)方法查看一下java.library.path指向的内容
public static void main(String[] args) { System.out.println(System.getProperty("java.library.path")); }
打印的内容太多了,就不放上来了,反正放到任意的一个路径下都可以,注意一下不要带后缀名。至于java.library.path指的是什么,网上很多,就不做复制黏贴的工作了。
2、这个是网上看别人写的才知道的,假如A.dll和B.dll有依赖关系,比如A.dll静态链接到B.dll,那么如果选择System.load("D:/A.dll"),即使B.dll也放在D:/路径下,load方法还是会因为找不到依赖的.dll文件而失败。因为Java虚拟机在载入A.dll的时候,发现它依赖于B.dll,那么会先去java.library.path下载入B.dll,而B.dll并不位于java.library.path下。有两个解决方案:
(1)先System.load("D:/B.dll")再System.load("D:/A.dll")
(2)把A.dll和B.dll都放在java.library.path下,然后调用System.loadLibrary("A")
不过两个dll文件存在依赖关系,A.dll依赖于B.dll,属于别的领域的知识,我也不是很清楚,所以第二点也没有亲身试验过。权当把这个知识点放在这儿,以后万一遇到类似问题了,也有个解决问题的方向。
相关文章推荐
- ExtJS4 Ext.onReady、Ext.define、Ext.create的区别与联系 http://blog.sina.com.cn/s/blog_48d7f92901011cfn.html
- POJ 3013 Big Christmas Tree (spfa)
- 第三周项目1、项目2: 顺序表的基本运算、建立“顺序表”算法库
- 百度编辑器ueditor上传图片及文件路径配置
- Android开发之对话框
- How to disable compiler optimization for a piece of code
- YII框架分析笔记8:CDataProvider
- MYSQL数据库学习----MYSQL函数
- C++全局变量的声明和定义
- YII框架分析笔记6:视图
- YII框架分析笔记5:控制器和动作
- Findbugs 缺陷详解与英文代号的对照表
- 素数定理
- 03-Block的使用场景
- MVC导入
- OCP-V13-600
- hpple 简单使用
- extjs组件添加事件监听的三种方式 http://blog.sina.com.cn/s/blog_48d7f92901011cfn.html
- YII框架分析笔记4:ar模型和db
- YII框架分析笔记3:表单模型和验证