Java通过System.load()和System.loadLibrary()方式加载动态库的区别
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 本地库
上一篇: 曾经以为自己小时候很爱看书