Java通过System.load()和System.loadLibrary()方式加载动态库的区别

编程入门 行业动态 更新时间:2024-10-10 08:26:45

1.共同点

System.load()与System.loadLibrary()方法均能够加载Windows环境、Linux环境下的动态库文件,而且不区分是封装好的JNI库文件或者非JNI库文件。

当带有native关键字的本地方法在被调用时,都会通过这两种方式之一将其加载至内存。

2.区别

  • System.load(String filename) :参数filename为文件的绝对路径,或相对路径下的动态库文件的全限定名称。

相对路径:

//相对路径path
//=================================Windows环境===============================
//当前类所在的项目路径
String path = XXXXXX.class.getClassLoader().getResource("//").getPath();
//如果dll库有依赖,加载顺序按照依赖顺序即可
System.load(path + "demoLib01.dll");
System.load(path + "demoLib02.dll");
System.out.println(System.getProperty("java.library.path"));

//=================================Linux环境=================================
//当前类所在的项目路径
String path = XXXXXX.class.getClassLoader().getResource("//").getPath();
//如果dll库有依赖,加载顺序按照依赖顺序即可
System.load(path + "demoLib01.so");
System.load(path + "demoLib02.so");
System.out.println(System.getProperty("java.library.path"));

绝对路径:

//绝对路径
//=================================Windows环境===============================
//当前类所在的项目路径
String path = XXXXXX.class.getClassLoader().getResource("//").getPath();
//项目路径+具体的类所在的包路径
path =  path + File.separator + "com" + File.separator + "server"+File.separator+ "study" + File.separator+"demo"+File.separator+"day01"+File.separator;    
//如果dll库有依赖,加载顺序按照依赖顺序即可
System.load(path + "demoLib01.dll");
System.load(path + "demoLib02.dll");
System.out.println(System.getProperty("java.library.path"));

//=================================Linux环境=================================
//当前类所在的项目路径
String path = XXXXXX.class.getClassLoader().getResource("//").getPath();
//项目路径+具体的类所在的包路径
path =  path + File.separator + "com" + File.separator + "server"+File.separator+ "study" + File.separator+"demo"+File.separator+"day01"+File.separator;    
//如果dll库有依赖,加载顺序按照依赖顺序即可
System.load(path + "demoLib01.so");
System.load(path + "demoLib02.so");
System.out.println(System.getProperty("java.library.path"));
  • System.loadLibrary(String libname) :参数libname为动态库文件名,不包含库文件的扩展名。

System.loadLibrary(String libname)和java.library.path变量对应的路经相关,此方法加载的文件必须是在“java.library.path”这一jvm变量所指向的路径中。

​​      只要将.dll动态库文件放在任何java.library.path包含的路径中即可,主要有以下路径。

1)和jre相关的一些目录

2)程序当前目录

3)Windows目录

4)系统目录(system32)

5)系统环境变量path指定目录

         调用方式①:通过System.getProperty("java.library.path");获得“java.library.path”路径,将动态库dll文件放到path路径下,调用“System.loadLibrary("XXX")”加载dll。

         调用方式②:通过“System.setProperty("java.library.path", path)”方法重新设置l“java.library.path”路径,将动态库dll文件放到path路径下,调用“System.loadLibrary("XXX")”加载dll。

//windows环境下,将加载 demoLib01.dll 本地库
System.loadLibrary("demoLib01"); 

//linux环境下,将加载 libdemoLib02.so 本地库
System.loadLibrary("demoLib02");

3. 注意

  • 如果动态库没有依赖,则只要把dependency.dll放在java.library.path包含的路径中即可。
  • 如果动态库有其他的依赖,比如demo1.dll依赖了test1.dll,则加载动态库时需根据依赖先前考虑动态库加载的顺序。

 先加载依赖库,再加载当前库。

System.load(String filename) :指定java.library.path路径的path值,将动态库放在path路径下。

System.load(path + "test1.dll");

System.load(path + "demo1.dll");

System.loadLibrary(String libname) :

System.loadLibrary("test1");   //将加载 libtest1.dll 本地库

System.loadLibrary("demo1");   //将加载 libdemo1.dll 本地库

更多推荐

Java通过System.load()和System.loadLibrary()方式加载动态库的区别

本文发布于:2023-06-14 08:03:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1453625.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:加载   区别   方式   动态   System

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!