zoukankan      html  css  js  c++  java
  • System.load(String filename)和System.loadLibrary(String libname)的区别

    作用:

    它们都可以用来装载库文件,不论是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指向的内容

    public static void main(String[] args){
        System.out.println(System.getProperty("java.library.path"));
    }
    
    C:Program FilesJavajdk1.6.0_45in;C:WindowsSunJavain;C:Windowssystem32;
    C:Windows;C:Program Files (x86)Common FilesNetSarang;C:Program FilesJavajdk1.6.0_45in;
    C:Program FilesJavajdk1.6.0_45jrein;
    可以看出在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
     
  • 相关阅读:
    特殊集合
    推箱子
    集合
    数组

    循环语句 练习题
    穷举与迭代
    循环语句
    练习题
    switch case
  • 原文地址:https://www.cnblogs.com/haitaofeiyang/p/7698121.html
Copyright © 2011-2022 走看看