`

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

    以下是对System.load与System.loadLibrary进行了详细的分析介绍。需要的朋友可以过来参考下

    Library_System.zip

    C语言程序设计期末实训作业,选择题目是做一个**图书信息管理系统**。 这里给出源码,需要实训报告等,请前往文章中github地址下载 2020年3月30日 22:20:19再次修改为免费下载

    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加载后调用函数的问题.md

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

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

    jacob.jar1.19及使用方法

    at java.lang.System.loadLibrary(System.java:1028) at com.jacob.com.LibraryLoader.loadJacobLibrary(LibraryLoader.java:184) at com.jacob.com.JacobObject.<clinit>(JacobObject.java:107) at MsWordEdit....

    人脸识别动态库opencv4.0

    OpenCV4.0 需要用到的动态库,如果没有改dll会报错, System.loadLibrary(Core.NATIVE_LIBRARY_NAME);报错提示需要在jdk下有该文件, 本文件存放在/javapath/bin/下, 该文件是64位window系统下使用

    使用gradle创建opencv项目

    gradle管理java项目是很方便,但opencv没有官方的maven ...//关键步骤不能使用System.loadLibrary Mat hello = Mat.zeros(3, 3, CvType.CV_8UC1); System.out.println(hello.dump()); } } 然后就可以为所欲为啦 ^_^

    linux jnative 调用.so方法及附属全部库和源码

    public static void main(String[] args) throws NativeException, IllegalAccessException{ //纯c写到动态库 JNative clib = new JNative("libtest.so", "test_a"); //调用libtest.so下到test_a函数 clib....

    python 调用 C++ dll 32位 64位 问题 ctypes.cdll.LoadLibrary

    t532.rar 测试代码 https://blog.csdn.net/wowocpp/article/details/105382257 python 调用 C++ dll 32位 64位 问题 ctypes.cdll.LoadLibrary

    如何调用dll中的函数.rar_GetProcAddress dll_LoadLibrary vc_调用DLL中的函数_调用D

    示范如何使用 LoadLibrary(...) 和 GetProcAddress(....)调用dll的输出函数.

    G.711android.so JNI音频编解码库

    System.loadLibrary("G711Android"); } catch (UnsatisfiedLinkError ule){ System.out.println("loadLibrary(G711Android),"+ule.getMessage()); } } private static native int linear2ulaw( int pcm_val...

    android jni详细介绍

    android jni详细介绍,包括如下文档: android_jni_javah_...Android技术之JNI和HAL.pdf Android通过JNI调用驱动程序(完全解析实例).doc 由浅入深,让你了解JNI如何在android里使用,也可以顺便了解一下android hal机制.

    Android 深入研究JNI详解

    System.loadLibrary(*.so的档案名); 例如,Android框架里所提供的MediaPlayer.java类,含指令: java代码: 1. public class MediaPlayer{ 2. static { 3. System.loadLibrary(“media_jni”); 4. } 5. }

    Eo Webbrowser 解决win10 Failed to resolve LoadLibrary

    解决win10操作系统,初始化Eo Webbrowser报错"Failed to resolve LoadLibrary",需要调用eowp.exe,来进行处理,Both EO.Pdf and EO.WebBrowser dynamically create child processes and run browser engine inside ...

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

    Android安卓源码解析,比较详细的分析了Sytem.loadLibrary的源码,对于so文件的dump的点有非常好的借鉴意义

    ReLinker:适用于Android的强大本机库加载器

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

    LoadLIbrary示例

    LoadLIbrary示例

    JNI完全技术手册 带完整书签

    System.loadLibrary("HelloWorld"); 149 JNIEXPORT void JNICALL Java_HelloWorld_print (JNIEnv *, jobject); 150 Chap20:JNI编程系列之中级篇(上)... 151 1. Java基本类型的传递... 151 2. String参数的传递...

    loadLibrary msc error:java.lang.UnsatisfiedLinkError:

    loadLibrary msc error:java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.example.xflinean-1/base.apk”],nativeLibraryDirectories=[/vendor/lib, /system/...

Global site tag (gtag.js) - Google Analytics