欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-19 22:13:40
...

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 本地库