System.load(String filename)和System.loadLibrary(String libname)的区别
前言
之前一篇文章在写Native方法的时候,第一个步骤里面有这么一段代码
static
{
System.load("D:" + File.separator + "Hello.dll");
}
其实JDK提供给用户了两个方法用于载入文件,一个是System.load(String filename)方法,另外一个是System.loadLibrary(String libname)方法,本文主要写一下这两个方法之间的区别。
区别
1、加载的路径不同
System.load(String filename)我们看JDK API的描述是“从作为动态库的本地文件系统中以指定的文件名加载代码文件。文件名参数必须是完整的路径名。”,因此这个方法的参数必须是要加载的文件的完整路径,带文件后缀名。
System.loadLibrary(String libname)我们看JDK API的描述是“加载由libname参数指定的系统库。将库名映射到实际系统库的方法取决于系统”,这里关键问题就是系统库三个字。什么是系统库,做个实验,修改一下static块中的代码,用loadLibrary方法来加载
static
{
System.loadLibrary("Hello");
}
运行一下,看一下结果

看到报错了,在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,属于别的领域的知识,我也不是很清楚,所以第二点也没有亲身试验过。权当把这个知识点放在这儿,以后万一遇到类似问题了,也有个解决问题的方向。
System.load(String filename)和System.loadLibrary(String libname)的区别的更多相关文章
- System.load()与System.loadLibrary()
Java load 和 loadlibrary方法的区别 1. 相同点: 两个方法都是用来装载dll文件,不论是JNI库文件还是非JNI库文件.本地方法在被调用时都需要通过这两发方法之一将其加载至内 ...
- Java调用第三方dll文件的使用方法 System.load()或System.loadLibrary()
Java调用第三方dll文件的使用方法 public class OtherAdapter { static { //System.loadLibrary("Connector") ...
- 多种下载文件方式 Response.BinaryWrite(byte[] DocContent);Response.WriteFile(System.IO.FileInfo DownloadFile .FullName);Response.Write(string html2Excel);
通过html给xls赋值,并下载xls文件 一.this.Response.Write(sw.ToString());System.IO.StringWriter sw = new System.IO ...
- Web Service接口返回泛型的问题(System.InvalidCastException: 无法将类型为“System.Collections.Generic.List`1[System.String]”的对象强制转换为类型“System.String[]”)
在使用C#写Web Service时遇到了个很奇怪的问题.返回值的类型是泛型(我用的是类似List<string>)的接口,测试时发现总是报什么无法转换为对象的错误,百思不得其解. 后来在 ...
- System.load 与 System.loadLibrary 的使用
相同点 它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件. 在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载. System.load System.load 参 ...
- VS2008,System.Runtime.InteropServices.COMException (0x800401F3): Invalid class string (Exception from HRESULT: 0x800401F3 (CO_E_CLASSSTRING))
在VS2008环境中编译调试运行不报错,但在发布的exe文件运行就报错 System.Runtime.InteropServices.COMException (0x800401F3): Invali ...
- System.load 和 System.loadLibrary详解
System.load 和 System.loadLibrary详解 1.它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件.在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI ...
- Object,String,StringBuffer,StringBuilder,System,Runtime,Date,Math介绍及用法(API)
1 Object对象 面向对象的核心思想:“找合适的对象,做适合的事情”. 合适的对象: 自己描述类,自己创建对象. sun已经描述了好多常用的类,可以使用这些类创建对象. API(App ...
- System.load 与 System.loadLibrary 的区别
相同点 它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件. 在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载. System.load System.load 参 ...
随机推荐
- eclipse配置javaee环境
笔者开发javaee项目时惯用myeclipse,但由于个人笔记本性能较低,myeclipse对内存的消耗极大,所以考虑换成eclipse开发.本文介绍eclipse配置javaee开发环境的一些体会 ...
- 使用cookie实现打印浏览记录的功能
可以用cookie知识来实现打印浏览记录.这里面用到的思路是将浏览记录以字符串的方式保存到cookie中,当浏览记录增加时,再将其转化为数组. $uri=$_SERVER['REQUEST_URI'] ...
- MySQL 5.6 & 5.7最优配置模板
摘自:http://mp.weixin.qq.com/s?__biz=MjM5MjIxNDA4NA==&mid=207854835&idx=1&sn=c998031ae6816 ...
- maven 三个基本插件 clean dependency compiler
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- UITableViewCell的highlighted 和selected 属性1
将UITableViewCell的selectedBackgroundView设置为按下图片的状态,同时不支持多选的情况下,遇到如下问题: 如果默认第一个cell处于selected状态,然后再点击其 ...
- yii安装 /You don't have permission to access on this server
在安装yii的时候 ,当打开了init.bat进行配置的时候小黑本弹出了个小黑框立刻就关闭了, 进入cmd模式再打开init.bat就出现了"You don't have permissi ...
- Tomcat如何配置环境变量
1, JDK:版本为jdk-7-windows-i586.exe 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index ...
- zabbix中文乱码解决方法
将windows下的字体文件Fonts\simkai.ttf上传到zabbix的WEB目录下的fonts目录下 修改zabbix的PHP配置 将原来的DejaVuSans更改成simkai vim / ...
- && 和 ||的区别
如果&&左侧表达式的值为真值,则返回右侧表达式的值:否则返回左侧表达式的值. 如果||左侧表达式的值为真值,则返回左侧表达式的值:否则返回右侧表达式的值. 1 如果第一个操 ...
- poi解析excel 03、07
maven依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</a ...