`

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

阅读更多

使用第三方API时,部署应用时,总是报运行失败找不到java.library.path

 

作用:

它们都可以用来装载库文件,不论是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
分享到:
评论

相关推荐

    深入解析System.load 与 System.loadLibrary

    Java中的`System.load`和`System.loadLibrary`都是用于加载本地库(Native Library)的方法,主要服务于Java本地接口(Java Native Interface, JNI),允许Java代码调用C/C++编写的函数。这两个方法在处理库文件时有...

    android安卓源码解析-Sytem.loadLibrary.pdf

    在Android开发中,加载本地共享库.so文件是一个常见的操作,通常涉及到System类中的两个方法:System.loadLibrary()和System.load()。这两个方法都用于加载native代码库,但它们的用法和工作原理存在一些差异。以下...

    深入分析Android加载so文件

    Java层加载so的函数有两个:System.load(String pathName)和System.loadLibrary(String libName)。这两个函数的区别就是load函数的参数是so文件的绝对地址,而loadLibrary的参数是so的名称,这个so文件必须放在apk的...

    jni动态加载方式示例工程

    `System.loadLibrary()`会自动寻找对应的库文件,通常是根据系统路径和库名规则(如libname.so)来查找,而`System.load()`则需要提供库的完整路径。 以下是一个简单的示例,展示了如何在Java中动态加载本地库: `...

    Library_System.zip

    通过这个实训作业,学生不仅能巩固C语言的基本语法和编程技巧,还能理解并掌握链表数据结构的应用,以及文件操作和函数设计的实践经验,这对于深化对计算机科学的理解,提高编程能力具有重要意义。

    安卓加载so卡死问题复现

    这里我们关注的焦点是`System.loadLibrary`方法导致的应用卡死,这通常与C++运行时库(如gnustl)有关。在描述中提到,这个问题已经定位到gnustl,这是一个广泛使用的GNU C++标准模板库,用于Android NDK开发。 ...

    C#中动态加载和卸载DLL

    通常,C++使用LoadLibrary和FreeLibrary函数来完成这一任务,但C#的设计有所不同,它依赖于.NET框架的垃圾回收(GC)机制来管理资源。然而,这限制了在程序运行时动态卸载DLL的能力,因为GC并不总是立即回收不再使用...

    C#中加载和卸载DLL

    在C++中,通过`LoadLibrary`和`FreeLibrary`函数可以轻松地加载和卸载DLL。而在C#中,虽然可以通过`Assembly.LoadFile`方法来动态加载DLL,但是在卸载DLL方面却没有直接对应的方法,这是因为C#采用了垃圾回收机制。 ...

    JNI函数使用

    System.loadLibrary("Sample3"); Sample3 sample = new Sample3(); String[] texts = sample.stringMethod("java编程思想"); for(int i=0;i<texts.length;i++) { texts[i]=new String(texts[i].getBytes("ISO...

    直接加载并调用DLL中函数

    这是一个从内存(资源形式)直接加载并调用DLL中函数的例子。 xDll工程只是一个测试用的dll,附上代码,编译出的xDll.dll直接放在testLoadDll工程目录下 testLoadDll是实际测试代码,从资源直接加载Dll并调用其导出...

    Windows环境下Java加载DLL.docx

    System.loadLibrary("chilkat"); } catch (UnsatisfiedLinkError e) { System.err.println("Native code library failed to load.\n" + e); System.exit(1); } } public static void main(String argv[]) { ...

    zebra连接打印机dll包

    然后,你可以使用Java的`System.loadLibrary()`方法加载dll: ```java System.setProperty("java.library.path", "path_to_dll_directory"); System.loadLibrary("ZebraNativeUsbAdapter"); ``` 这里`path_to_dll_...

    深入研究java.lang.Runtime类.doc

    17. loadLibrary(String libname):加载具有指定库名的动态库。 18. maxMemory():返回 Java 虚拟机试图使用的最大内存量。 19. removeShutdownHook(Thread hook):取消注册某个先前已注册的虚拟机关闭挂钩。 20. ...

    java.lang.System类.pdf

    - `load()`和`loadLibrary()`方法分别用于加载动态链接库和本地库。 6. **安全**: - `getSecurityManager()`返回当前的系统安全经理,如果未设置则返回`null`。 - `setSecurityManager()`允许设置安全管理器,...

    运行时动态导入so库文件。用最少的代码实现动态导入本地so库文件示例设定so放在assets文件夹下.rar

    3. **加载.so库**: 使用System.load()或System.loadLibrary()函数加载.so库。System.load()接受一个文件路径作为参数,而System.loadLibrary()则期望一个库名(不包含".so"后缀)。在这种情况下,因为.so文件是临时...

    运行时动态导入so库文件

    然而,如果我们要在运行时动态加载.so库,就需要使用Java层的`System.loadLibrary()`方法。这个方法接受一个字符串参数,该参数是.so库的名称(不包括".so"后缀)。但默认情况下,它会从已知的路径(如`lib/`目录)...

    关于dll加载后调用函数的问题.md

    首先,我们在写DLL的时候,需要在DLL函数里面加上DllMain函数,可以在这里面写上你自己的函数,windows在用LoadLibrary加载DLL后调用会DllMain函数,而你把自己的函数已经先写在在DllMain里面了,那么你的函数也自然就执行...

    JAVA调用C#写的DLL例子

    JAVA 调用 C# 编写的 DLL 例子 在本篇文章中,我们将详细介绍如何使用 JAVA 调用 C# 编写的 DLL ...我们可以通过使用 JNI 和 System.LoadLibrary 方法来调用 C# 编写的 DLL 文件,从而实现 JAVA 和 C# 之间的交互。

    Android代码-ReLinker

    java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader: findLibrary returned null at java.lang.Runtime.loadLibrary(Runtime.java:365) at java.lang.System...

    centos7环境下编译opencv4.5.4生成的so和jar

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME); } public static void main(String[] args) { Mat img = Imgcodecs.imread("path_to_your_image.jpg"); if (img.empty()) { System.out.println("Failed to ...

Global site tag (gtag.js) - Google Analytics