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,属于别的领域的知识,我也不是很清楚,所以第二点也没有亲身试验过。权当把这个知识点放在这儿,以后万一遇到类似问题了,也有个解决问题的方向。
转载于:https://www.cnblogs.com/xrq730/p/4827132.html
System.load(String filename)和System.loadLibrary(String libname)的区别相关推荐
- java system.load()_System.load()与System.loadLibrary()
Java load 和 loadlibrary方法的区别 1. 相同点: 两个方法都是用来装载dll文件,不论是JNI库文件还是非JNI库文件.本地方法在被调用时都需要通过这两发方法之一将其加载至内 ...
- System.load 和 System.loadLibrary详解
System.load 和 System.loadLibrary详解 1.它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件.在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI ...
- android string.trim,String.Trim 方法 (System) | Microsoft Docs
移除目前字串開頭和結尾的所有空白字元.Removes all leading and trailing white-space characters from the current string. ...
- Android NDK 【错误】The method loadLibrary(String) is undefined for the type Settings.Syste
[错误]The method loadLibrary(String) is undefined for the type Settings.System [解决方法] 不要加入包import andr ...
- Could not load file or assembly 'System.Web.Extensions
今日第一次玩AJAX,在本地我们调试运行AJAX.NET程序完全没有问题,但是一旦搭建网站后就出现 了一个Web.config文件异常: Configuration Error Description ...
- Could not load file or assembly 'System.Web.Extensions, Version=3.5.0.0
前些天发现这个问题的,本来原有的项目是用VS2005开发的,后来装了VS2008,没想到问题就来了. 原项目是ASP.NET 2.0,用到了Ajax Extension,.NET 2.0用的Ajax ...
- so使用原则(要么不支持,要么全部支持) 固定的运行平台 指定目录:System.load(/data/data/package-name/mydir/libmath.so);
指定目录 System.load("/data/data/<package-name>/mydir/libmath.so"); 你应该尽可能的提供专为每个ABI优化过的 ...
- 一文说清linux system load
简介:双十一压测过程中,常见的问题之一就是load 飙高,通常这个时候业务上都有受影响,比如服务rt飙高,比如机器无法登录,比如机器上执行命令hang住等等.本文就来说说,什么是load,load是怎 ...
- Could not load file or assembly 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5
java 中调外部工具 做word转pdf ,没有生成pdf, log中出现 [开始转换文档... finish [WINWORD] convert. Could not load file or ...
最新文章
- P1091 合唱队形[单调性+DP]
- 将格式化的日期字符串转换为Unix时间戳(php)
- CCNET配置文件配置工具
- java.lang.ClassNotFoundException: org.apache.log4j.Logger
- Nginx设置expires设定页面缓存时间
- 基于Python实现RRT与双向RRT算法
- oracle、mysql、sqlserver、pg数据库去重实现方案总结
- C# sqlsugar依赖引用报错的问题解决
- php批量邮件地址,PHP通过phpmailer批量发送邮件功能
- oa处理会签流程图_OA-审批流程管理模块
- 手写vue3源码——reactive, effect ,scheduler, stop 等
- java设计扑克牌比大小_2019-08-09Day10 单例设计模式,扑克牌比大小游戏(Java)
- 有哪些比较好用的黄页网站?
- 为什么总跳到国内版(cn.bing.com)?New Bing使用全攻略
- 关于lua中显示绝对时间和相对时间
- bzoj1934【shoi2007】Vote善意的投票
- 流媒体之MP4码流解析。
- 通告(公告),消息(站内短信),提醒的设计
- 2022年中国元宇宙白皮书完整版下载_中国元宇宙白皮书高清无水印
- 读书笔记——《2001太空漫游》
热门文章
- 吐槽:Lambda表达式
- 【计算机网络】简单网络管理协议 SNMP
- 在没有插件的情况下为Chrome设置Proxy
- (转)WP7 开发学习(2):在WP7中使用网络请求
- 开源内容管理系统 php mysql_30 个很棒的PHP开源CMS内容管理系统小结
- wireshark协议插件开发--官方文档中文翻译
- HBase数据读取流程解析
- (39)System Verilog线程停止(disable)
- 超级计算机操作系统有什么不同,超级计算机功能强大吗?它与普通计算机不同,但也使用Windows系统...
- 27.Qt操作sqlite3数据库