使用第三方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("C:\\Documents and Settings\\TestJNI.dll"); //Windows
System.load("/usr/lib/TestJNI.so"); //Linux
System.loadLibrary
System.loadLibrary 参数为库文件名,不包含库文件的扩展名。
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/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
分析:
- 前三个都是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
相关推荐
Java中的`System.load`和`System.loadLibrary`都是用于加载本地库(Native Library)的方法,主要服务于Java本地接口(Java Native Interface, JNI),允许Java代码调用C/C++编写的函数。这两个方法在处理库文件时有...
在Android开发中,加载本地共享库.so文件是一个常见的操作,通常涉及到System类中的两个方法:System.loadLibrary()和System.load()。这两个方法都用于加载native代码库,但它们的用法和工作原理存在一些差异。以下...
Java层加载so的函数有两个:System.load(String pathName)和System.loadLibrary(String libName)。这两个函数的区别就是load函数的参数是so文件的绝对地址,而loadLibrary的参数是so的名称,这个so文件必须放在apk的...
`System.loadLibrary()`会自动寻找对应的库文件,通常是根据系统路径和库名规则(如libname.so)来查找,而`System.load()`则需要提供库的完整路径。 以下是一个简单的示例,展示了如何在Java中动态加载本地库: `...
通过这个实训作业,学生不仅能巩固C语言的基本语法和编程技巧,还能理解并掌握链表数据结构的应用,以及文件操作和函数设计的实践经验,这对于深化对计算机科学的理解,提高编程能力具有重要意义。
这里我们关注的焦点是`System.loadLibrary`方法导致的应用卡死,这通常与C++运行时库(如gnustl)有关。在描述中提到,这个问题已经定位到gnustl,这是一个广泛使用的GNU C++标准模板库,用于Android NDK开发。 ...
通常,C++使用LoadLibrary和FreeLibrary函数来完成这一任务,但C#的设计有所不同,它依赖于.NET框架的垃圾回收(GC)机制来管理资源。然而,这限制了在程序运行时动态卸载DLL的能力,因为GC并不总是立即回收不再使用...
在C++中,通过`LoadLibrary`和`FreeLibrary`函数可以轻松地加载和卸载DLL。而在C#中,虽然可以通过`Assembly.LoadFile`方法来动态加载DLL,但是在卸载DLL方面却没有直接对应的方法,这是因为C#采用了垃圾回收机制。 ...
这是一个从内存(资源形式)直接加载并调用DLL中函数的例子。 xDll工程只是一个测试用的dll,附上代码,编译出的xDll.dll直接放在testLoadDll工程目录下 testLoadDll是实际测试代码,从资源直接加载Dll并调用其导出...
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...
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[]) { ...
17. loadLibrary(String libname):加载具有指定库名的动态库。 18. maxMemory():返回 Java 虚拟机试图使用的最大内存量。 19. removeShutdownHook(Thread hook):取消注册某个先前已注册的虚拟机关闭挂钩。 20. ...
- `load()`和`loadLibrary()`方法分别用于加载动态链接库和本地库。 6. **安全**: - `getSecurityManager()`返回当前的系统安全经理,如果未设置则返回`null`。 - `setSecurityManager()`允许设置安全管理器,...
3. **加载.so库**: 使用System.load()或System.loadLibrary()函数加载.so库。System.load()接受一个文件路径作为参数,而System.loadLibrary()则期望一个库名(不包含".so"后缀)。在这种情况下,因为.so文件是临时...
然而,如果我们要在运行时动态加载.so库,就需要使用Java层的`System.loadLibrary()`方法。这个方法接受一个字符串参数,该参数是.so库的名称(不包括".so"后缀)。但默认情况下,它会从已知的路径(如`lib/`目录)...
然后,你可以使用Java的`System.loadLibrary()`方法加载dll: ```java System.setProperty("java.library.path", "path_to_dll_directory"); System.loadLibrary("ZebraNativeUsbAdapter"); ``` 这里`path_to_dll_...
首先,我们在写DLL的时候,需要在DLL函数里面加上DllMain函数,可以在这里面写上你自己的函数,windows在用LoadLibrary加载DLL后调用会DllMain函数,而你把自己的函数已经先写在在DllMain里面了,那么你的函数也自然就执行...
JAVA 调用 C# 编写的 DLL 例子 在本篇文章中,我们将详细介绍如何使用 JAVA 调用 C# 编写的 DLL ...我们可以通过使用 JNI 和 System.LoadLibrary 方法来调用 C# 编写的 DLL 文件,从而实现 JAVA 和 C# 之间的交互。
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...
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 ...