jzgl_javaeye 发表于 2013-1-15 02:51:54

关于Java装载库文件

System.load 和 System.loadLibrary详解

1.它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件。在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载。

2.System.load 参数为库文件的绝对路径,可以是任意路径。
例如你可以这样载入一个windows平台下JNI库文件:
System.load("C:\\Documents and Settings\\TestJNI.dll");。

3. System.loadLibrary 参数为库文件名,不包含库文件的扩展名。
例如你可以这样载入一个windows平台下JNI库文件
System. loadLibrary ("TestJNI");

这里,TestJNI.dll 必须是在java.library.path这一jvm变量所指向的路径中。
可以通过如下方法来获得该变量的值:
System.getProperty("java.library.path");

默认情况下,在Windows平台下,该值包含如下位置:
1)和jre相关的一些目录
2)程序当前目录
3)Windows目录
4)系统目录(system32)
5)系统环境变量path指定目录

4.如果你要载入的库文件静态链接到其它动态链接库,例如TestJNI.dll 静态链接到dependency.dll, 那么你必须注意:
1)如果你选择
System.load("C:\\Documents and Settings\\ TestJNI.dll");
那 么即使你把dependency.dll同样放在C:\\Documents and Settings\\下,load还是会因为找不到依赖的dll而失败。因为jvm在载入TestJNI.dll会先去载入TestJNI.dll所依赖 的库文件dependency.dll,而dependency.dll并不位于java.library.path所指定的目录下,所以jvm找不到 dependency.dll。
你有两个方法解决这个问题:
一是把C:\\Documents and Settings\\加入到java.library.path的路径中,例如加入到系统的path中。二是先调用
System.load("C:\\Documents and Settings\\ dependency.dll"); 让jvm先载入dependency.dll,然后再调用
System.load("C:\\Documents and Settings\\ TestJNI.dll");
2)如果你选择
System. loadLibrary ("TestJNI");
那么你只要把dependency.dll放在任何java.library.path包含的路径中即可,当然也包括和TestJNI.dll相同的目录。

java的System.getProperty()方法可以获取的值

java.version
Java 运行时环境版本

java.vendor
Java 运行时环境供应商

java.vendor.url
Java 供应商的 URL

java.home
Java 安装目录

java.vm.specification.version
Java 虚拟机规范版本

java.vm.specification.vendor
Java 虚拟机规范供应商

java.vm.specification.name
Java 虚拟机规范名称

java.vm.version
Java 虚拟机实现版本

java.vm.vendor
Java 虚拟机实现供应商

java.vm.name
Java 虚拟机实现名称

java.specification.version
Java 运行时环境规范版本

java.specification.vendor
Java 运行时环境规范供应商

java.specification.name
Java 运行时环境规范名称

java.class.version
Java 类格式版本号

java.class.path
Java 类路径

java.library.path
加载库时搜索的路径列表

java.io.tmpdir
默认的临时文件路径

java.compiler
要使用的 JIT 编译器的名称

java.ext.dirs
一个或多个扩展目录的路径

os.name
操作系统的名称

os.arch
操作系统的架构

os.version
操作系统的版本

file.separator
文件分隔符(在 UNIX 系统中是“/”)

path.separator
路径分隔符(在 UNIX 系统中是“:”)

line.separator
行分隔符(在 UNIX 系统中是“/n”)

user.name
用户的账户名称

user.home
用户的主目录

user.dir
用户的当前工作目录



public class SystemProperty {       public static void main(String args[]) {          System.out.println("java_vendor:" + System.getProperty("java.vendor"));          System.out.println("java_vendor_url:"                   + System.getProperty("java.vendor.url"));          System.out.println("java_home:" + System.getProperty("java.home"));          System.out.println("java_class_version:"                   + System.getProperty("java.class.version"));          System.out.println("java_class_path:"                  + System.getProperty("java.class.path"));          System.out.println("os_name:" + System.getProperty("os.name"));          System.out.println("os_arch:" + System.getProperty("os.arch"));          System.out.println("os_version:" + System.getProperty("os.version"));          System.out.println("user_name:" + System.getProperty("user.name"));          System.out.println("user_home:" + System.getProperty("user.home"));          System.out.println("user_dir:" + System.getProperty("user.dir"));          System.out.println("java_vm_specification_version:"                  + System.getProperty("java.vm.specification.version"));          System.out.println("java_vm_specification_vendor:"                  + System.getProperty("java.vm.specification.vendor"));          System.out.println("java_vm_specification_name:"                  + System.getProperty("java.vm.specification.name"));          System.out.println("java_vm_version:"                  + System.getProperty("java.vm.version"));          System.out.println("java_vm_vendor:"                  + System.getProperty("java.vm.vendor"));          System.out                  .println("java_vm_name:" + System.getProperty("java.vm.name"));          System.out.println("java_ext_dirs:"                  + System.getProperty("java.ext.dirs"));          System.out.println("file_separator:"                  + System.getProperty("file.separator"));          System.out.println("path_separator:"                  + System.getProperty("path.separator"));          System.out.println("line_separator:"                  + System.getProperty("line.separator"));      }
页: [1]
查看完整版本: 关于Java装载库文件