前言

之前一篇文章在写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)的区别相关推荐

  1. java system.load()_System.load()与System.loadLibrary()

    Java load 和 loadlibrary方法的区别 1.  相同点: 两个方法都是用来装载dll文件,不论是JNI库文件还是非JNI库文件.本地方法在被调用时都需要通过这两发方法之一将其加载至内 ...

  2. System.load 和 System.loadLibrary详解

    System.load 和 System.loadLibrary详解 1.它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件.在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI ...

  3. android string.trim,String.Trim 方法 (System) | Microsoft Docs

    移除目前字串開頭和結尾的所有空白字元.Removes all leading and trailing white-space characters from the current string. ...

  4. 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 ...

  5. Could not load file or assembly 'System.Web.Extensions

    今日第一次玩AJAX,在本地我们调试运行AJAX.NET程序完全没有问题,但是一旦搭建网站后就出现 了一个Web.config文件异常: Configuration Error Description ...

  6. 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 ...

  7. so使用原则(要么不支持,要么全部支持) 固定的运行平台 指定目录:System.load(/data/data/package-name/mydir/libmath.so);

    指定目录 System.load("/data/data/<package-name>/mydir/libmath.so"); 你应该尽可能的提供专为每个ABI优化过的 ...

  8. 一文说清linux system load

    简介:双十一压测过程中,常见的问题之一就是load 飙高,通常这个时候业务上都有受影响,比如服务rt飙高,比如机器无法登录,比如机器上执行命令hang住等等.本文就来说说,什么是load,load是怎 ...

  9. 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 ...

最新文章

  1. P1091 合唱队形[单调性+DP]
  2. 将格式化的日期字符串转换为Unix时间戳(php)
  3. CCNET配置文件配置工具
  4. java.lang.ClassNotFoundException: org.apache.log4j.Logger
  5. Nginx设置expires设定页面缓存时间
  6. 基于Python实现RRT与双向RRT算法
  7. oracle、mysql、sqlserver、pg数据库去重实现方案总结
  8. C# sqlsugar依赖引用报错的问题解决
  9. php批量邮件地址,PHP通过phpmailer批量发送邮件功能
  10. oa处理会签流程图_OA-审批流程管理模块
  11. 手写vue3源码——reactive, effect ,scheduler, stop 等
  12. java设计扑克牌比大小_2019-08-09Day10 单例设计模式,扑克牌比大小游戏(Java)
  13. 有哪些比较好用的黄页网站?
  14. 为什么总跳到国内版(cn.bing.com)?New Bing使用全攻略
  15. 关于lua中显示绝对时间和相对时间
  16. bzoj1934【shoi2007】Vote善意的投票
  17. 流媒体之MP4码流解析。
  18. 通告(公告),消息(站内短信),提醒的设计
  19. 2022年中国元宇宙白皮书完整版下载_中国元宇宙白皮书高清无水印
  20. 读书笔记——《2001太空漫游》

热门文章

  1. 吐槽:Lambda表达式
  2. 【计算机网络】简单网络管理协议 SNMP
  3. 在没有插件的情况下为Chrome设置Proxy
  4. (转)WP7 开发学习(2):在WP7中使用网络请求
  5. 开源内容管理系统 php mysql_30 个很棒的PHP开源CMS内容管理系统小结
  6. wireshark协议插件开发--官方文档中文翻译
  7. HBase数据读取流程解析
  8. (39)System Verilog线程停止(disable)
  9. 超级计算机操作系统有什么不同,超级计算机功能强大吗?它与普通计算机不同,但也使用Windows系统...
  10. 27.Qt操作sqlite3数据库