System.load()与System.loadLibrary()
Java load 和 loadlibrary方法的区别
1. 相同点:
两个方法都是用来装载dll文件,不论是JNI库文件还是非JNI库文件。本地方法在被调用时都需要通过这两发方法之一将其加载至内存。
2. 不同点
a. System.load(String filename) ,参数为dll文件的绝对路径,可以是任意路径。
System.load("D:\\java\\Test.dll");
b. System.loadLibrary(String libname) 参数为dll文件名,不包含库文件的扩展名。
例如你可以这样载入一个windows平台下JNI库文件
System. loadLibrary ("Test");
注意:System.loadLibrary(String libname)和java.library.path变量对应的路经相关,此方法加载的文件必须是在java.library.path这一jvm变量所指向的路径中。
可以通过如下方法来获得该变量的值:
System.getProperty("java.library.path");
默认情况下,在Windows平台下,该值包含如下位置:
1)和jre相关的一些目录
2)程序当前目录
3)Windows目录
4)系统目录(system32)
5)系统环境变量path指定目录
3. dll依赖加载方式
如果你要载入的库文件静态链接到其它动态链接库,例如Test.dll 静态链接到dependency.dll, 那么你必须注意:
1)System.load() 方式
System.load("D:\\java\\Test.dll");
那么即使你把dependency.dll同样放在D:\\java\\Test下,load还是会因为找不到依赖的dll而失败。因为jvm在载入Test.dll会先去载入Test.dll所依赖的库文件dependency.dll,而dependency.dll并不位于java.library.path所指定的目录下,所以jvm找不到 dependency.dll。
你有两个方法解决这个问题:
一: D:\\java\\加 入到java.library.path的路径中,例如加入到系统的path中。load()方法会区path路径寻找依赖库。
二: 先加载依赖库,再加载当前库
//先调用
System.load("D:\\java\\dependency.dll");
//让jvm先载入dependency.dll,然后再调用
System.load("D:\\java\\Test.dll");
2)System. loadLibrary() 方式
System. loadLibrary ("Test");
只需要把dependency.dll放在任何java.library.path包含的路径中即可,也包括和Test.dll相同的目录。
System.load()与System.loadLibrary()的更多相关文章
- System.load 和 System.loadLibrary详解
System.load 和 System.loadLibrary详解 1.它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件.在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI ...
- Java调用第三方dll文件的使用方法 System.load()或System.loadLibrary()
Java调用第三方dll文件的使用方法 public class OtherAdapter { static { //System.loadLibrary("Connector") ...
- System.load 与 System.loadLibrary 的使用
相同点 它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件. 在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载. System.load System.load 参 ...
- System.load 与 System.loadLibrary 的区别
相同点 它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件. 在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载. System.load System.load 参 ...
- System.load(String filename)和System.loadLibrary(String libname)的区别
前言 之前一篇文章在写Native方法的时候,第一个步骤里面有这么一段代码 static { System.load("D:" + File.separator + "H ...
- System.load(PWConnector.dll)加载异常 Can't find dependent libraries
System.load(PWConnector.dll)加载异常 Can't find dependent libraries 错误信息:D:\PWAdapter\PWConnector.dll: C ...
- Could not load type 'System.Reflection.AssemblySignatureKeyAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c
错误: Could not load type 'System.Reflection.AssemblySignatureKeyAttribute' from assembly 'mscorlib, V ...
- Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, ...
- Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute'
[TypeLoadException: Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from as ...
随机推荐
- centos磁盘满了,查找大文件并清理
今天发现vps敲入crontab -e 居然提示 “Disk quota exceeded” 无法编辑.于是"df -h"查了查发现系统磁盘空间使用100%了.最后定位到是/var ...
- Maven 基本参数
-h,--help Display help information-am,--also-make ...
- 【Android内存泄漏检测】LeakCanary使用总结
一.什么是LeakCanary? LeakCanary就是用来检测Android端内存泄漏的一个工具.能够检测Activity的泄漏 什么是内存泄漏? Java 对象有时也会”长死不死“,GC 拿它没 ...
- Windows 64 位 mysql 5.7.20 安装教程
mysql 5.7以上版本包解压中没有data目录和my-default.ini和my.ini文件以及服务无法启动的解决办法以及修改初始密码的方法 mysql官网下载地址:https://dev.my ...
- [leetcode]694. Number of Distinct Islands你究竟有几个异小岛?
Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...
- 集成bug统计链接
http://crab.baidu.com/http://bugly.qq.com/ http://bughd.com/ http://www.umeng.com/analyticshttp://tr ...
- PullToRefreshView的样式以及一些问题
首先说 PulltorefreshListView PullToRefreshGridView PullToRefreshWebView PullToRefreshScrollView Pull ...
- ES6对象
--------------------------------------------------------------------- 对象的扩展 let obj = {a: 1, b: 2, c ...
- 如何查看Firefox中保存的登录密码
问:以前使用Firefox浏览器登录一个论坛,并且临时申请了一个账号,在使用Firefox登录时选择让它记住密码了,后来,我忘记了那个论坛的密码,但是可以使用Firefox直接登录.现在能不能查看密码 ...
- node.js中对Event Loop事件循环的理解
javascript是单线程的,所以任务的执行都需要排队,任务分为两种,一种是同步任务,一种是异步任务. 同步任务是进入主线程上排队执行的任务,上一个任务执行完了,下一个任务才会执行. 异步任务是不进 ...