(转) JNI 重载的问题

来源:互联网 发布:java 优秀代码 编辑:程序博客网 时间:2024/05/22 10:43
Web项目中用到JNI时应该注意的问题
作者:刘冬 发文时间:2004.12.20
    JNI(Java Native Interface)应用程序一般是一个Java类,在这个类中定义了几个native方法,并在类的初始化过程中加载动态库,例如下面这个类

public class SystemInfo{  static {    System.loadLibrary("SystemInfo");  }  public static native long getPhysicalMemory();}


    当Web项目用到该类并由于其他类的修改导致项目(context)重新加载,这个时候SystemInfo的初始化就会出异常,直接导致SystemInfo这个不可用,因为JNI中不允许一个动态库被加载两次,而且也没法通过程序来卸载前面所加载的动态库。

    怎么来解决因为context重新加载而导致JNI类无法试用的问题呢? 其实这个问题不难,我们只要不让JNI类重新加载即可。但是一般的应用服务器对Web项目中文件都是默认重新加载的,例如WEB-INF/classes以及WEB-INF/lib目录。如此我们便不能将JNI类放在这两个目录下,但是我们又必须保证这个JNI类能被Web项目的其他类引用到,因此这就需要参照不同应用服务器的类路径的说明进行设置,对于Tomcat而言,我们可以把这个JNI类单独打包并放在{tomcat}/common/lib目录下,并删除web项目中的这个JNI类即可解决前面提到的问题。(T111)