文档章节

System.load(String filename)和System.loadLibrary(String libname)的区别

shzwork
 shzwork
发布于 06/25 22:21
字数 1038
阅读 1
收藏 0

作用:

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

其实JDK提供给用户了两个方法用于载入文件,一个是System.load(String filename)方法,另外一个是System.loadLibrary(String libname)方法。

System.load

System.load 参数必须为库文件的绝对路径,可以是任意路径,例如:
System.load("C:\\Documents and Settings\\TestJNI.dll"); //Windows

System.load("/usr/lib/TestJNI.so"); //Linux

System.loadLibrary
System.loadLibrary 参数为库文件名,不包含库文件的扩展名。

System.loadLibrary ("TestJNI"); //加载Windows下的TestJNI.dll本地库

System.loadLibrary ("TestJNI"); //加载Linux下的libTestJNI.so本地库

注意:TestJNI.dll 或 libTestJNI.so 必须是在JVM属性java.library.path所指向的路径中。

 

区别:

1.加载的路径不同。

System.load(String filename)我们看JDK API的描述是“从作为动态库的本地文件系统中以指定的文件名加载代码文件。文件名参数必须是完整的路径名。”,因此这个方法的参数必须是要加载的文件的完整路径,带文件后缀名。

System.loadLibrary(String libname)我们看JDK API的描述是"加载由libname参数指定的系统库,不带后缀名系统库指的是java.library.path,是映射到本地系统的路径。

用System.getProperty(String key)方法查看一下java.library.path指向的内容

1

2

3

public static void main(String[] args){

    System.out.println(System.getProperty("java.library.path"));

}

1

2

3

C:\Program Files\Java\jdk1.6.0_45\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;

C:\Windows;C:\Program Files (x86)\Common Files\NetSarang;C:\Program Files\Java\jdk1.6.0_45\bin;

C:\Program Files\Java\jdk1.6.0_45\jre\bin;

 

可以看出在window下就是classpath的路径。

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,属于别的领域的知识,我也不是很清楚,所以第二点也没有亲身试验过。权当把这个知识点放在这儿,以后万一遇到类似问题了,也有个解决问题的方向。

 

设置java.library.path的路径

 

1.windows 下

(1): 设置classpath的路径即可,一般的动态链接库是放到c:/window/system32这个目录下。

(2): 也可以修改环境变量,增加动态链接库的地址。

(3): 开发时设置 eclipse的动态库的地址, 具体参见:

http://blog.csdn.net/ty564457881/article/details/7066423

2.linux下

需要设置系统变量LD_LIBRARY_PATH来添加java.library.path。

因为JVM启动时,会使用系统变量LD_LIBRARY_PATH的值来初始化java.library.path属性。

java.library.path默认值
在我的机器上其默认值为:
$JAVA_HOME/jre/lib/i386/server:$JAVA_HOME/jre/lib/i386

:$JAVA_HOME/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib
分析:
- 前三个都是JRE中提供的本地库
- 后三个是操作系统的库文件目录

-Djava.library.path 和 LD_LIBRARY_PATH的区别
如果使用 java -Djava.library.path=/jni/library/path 的方式设置的话,会覆盖默认值。其值为:
/jni/library/path

如果使用 export LD_LIBRARY_PATH=/jni/library/path的方式设置的话,会追加其值到默认值中。LD_LIBRARY_PATH的值会插入到JRE本地库之后,操作系统库文件目录之前。其值为:
$JAVA_HOME/jre/lib/i386/server:$JAVA_HOME/jre/lib/i386

:$JAVA_HOME/jre/../lib/i386:/jni/library/path:/usr/java/packages/lib/i386:/lib:/usr/lib

 

转载地址:http://www.cnblogs.com/xrq730/p/4827132.html

http://blog.sina.com.cn/s/blog_48a45b9501015m6q.html

本文转载自:https://www.cnblogs.com/haitaofeiyang/p/7698121.html

shzwork
粉丝 15
博文 827
码字总数 18401
作品 0
厦门
私信 提问
Android System.Load vs System.LoadLibrary

其实,网上已经有很多地方已经讨论过,System.Load 和 System.LoadLibrary 的差异了,比如这里: http://stackoverflow.com/questions/7016391/difference-between-system-load-and-system-l......

Jerikc
2015/11/24
1K
0
Java基础知识JNI 在Android中使用System.loadLibrary()

tiny6410中的部分硬件(串口、led、pwm蜂鸣器、adc等) 友善做了一个硬件库friendlyarm-hardware.so 如果android应用程序想要访问以上硬件时,就要使用java的JNI技术 1、JNI的全称为:Java ...

子曰疯
2013/09/02
10K
0
SMSLib实现Java短信收发的功能

用java实现短信收发的功能,目前一般项目中短信群发功能的实现方法大致有下面三种: 1、 向运行商申请短信网关,不需要额外的设备,利用运行商提供的API调用程序发送短信,适用于大型的通信公...

墙头草
2011/05/16
1K
0
System.setProperty 与 System.getProperty

System可以有对标准输入,标准输出,错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。 System.getProperties()可以确定当前的系统...

Shawn_Cheung
2014/05/26
528
0
JNI --&-- JNA

最近写SDK,解释下什么是SDK,SDK一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。开发SDK时使用JNI去调用SO或DLL是一件多么痛苦的...

燚想天开
2012/12/18
774
0

没有更多内容

加载失败,请刷新页面

加载更多

kibana汉化

kibana5 / 6 需要下载补丁包,https://github.com/anbai-inc/Kibana_Hanization 其中 v6 版本原生支持国际化,只需要添加资源文件并且配置即可 kibana7 v7版本官方内置汉化资源,在配置文件 ...

细肉云吞
11分钟前
2
0
spring boot 自定义日志 log4j2

使用默认的日志在实际开发中会存在很多问题,比如备份文件名称无法自动重命名、各个等级的日志被放在一个文件中等,所以实际开发中为了更好满足我们的需求,我们一般都会自定义采用配置的方式...

雷开你的门
15分钟前
1
0
PCB设计-Allegro软件入门系列-设计参数配置(上)

前言 经历了导入网表,和放置器件后,我们就要画板子了,但是必要的设计参数也要先准备好,磨刀不误砍柴工。 《一》显示参数 这里主要设置DRC报错标志大小和飞线显示类型 (1)DRC标志可以适当...

demyar
16分钟前
2
0
js实现微博、微信分享

html <!-- 分享 --><div class="share-box"> <b style="vertical-align: middle;">分享到:</b> <a title="分享到新浪微博" class="shareSina"><span class="share-icon"></span><......

张兴华ZHero
32分钟前
3
0
创龙TMS320DM8168浮点DSP C674x + ARM Cortex-A8的CPU、NAND FLASH、NOR FLASH

TL6678-EasyEVM是广州创龙基于SOM-TL6678核心板而研发的一款多核高性能DSP开发板。开发板采用核心板+底板方式,底板采用沉金无铅工艺的四层板设计,尺寸为200mm*106.65mm,它为用户提供了SOM...

Tronlong创龙
35分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部