Web项目中用到JNI时应该注意的问题
2006-07-28 15:28
381 查看
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}commonlib目录下,并删除web项目中的这个JNI类即可解决前面提到的问题。
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}commonlib目录下,并删除web项目中的这个JNI类即可解决前面提到的问题。
相关文章推荐
- 在Myeclipse中开发web项目时,servlet的创建和使用中应该注意的问题。
- 总结JBOSS发布web项目时注意问题
- [原创]web application中使用Profile应该注意的问题
- javaEE之修改javaWeb服务器的项目名时需要注意的问题
- 新建web项目需要注意的问题(版本跟tomcat要匹配)
- myeclipse 在做项目复制时应该注意的问题
- [原创]web application中使用Profile应该注意的问题
- 项目经理应该注意的一些问题
- Vc++6.0项目迁到vs2005 应该注意的问题
- 【javaweb:servlet】从服务端下载中文名称文件应该注意的问题!!!
- 多人协作的项目中应该注意的问题
- 发现一个问题,十分蛋疼。 我们项目是由N个工程组成的,外围工程是web工程,内部的工程打包成jar,放入外围工程的WEB-INF/lib 内部的工程用到了spring的注解,例如@Service、
- linux 环境和 windows 环境在部署web项目时注意的问题
- 在web项目中一些需要注意的问题
- 【javaweb:事务控制】事务控制两个方法在插入存在主从表关系的数据时应该注意的顺序问题!
- (转)利用HttpWebRequest上传文件应该注意的问题
- WEB项目前期开展需要注意的问题
- 构建maven的web项目时注意的问题(出现Error configuring application listener of class org.springframework.web.context.ContextLoaderListener 或者前端控制器无法加载)
- Vc++6.0项目迁到vs2005 应该注意的问题
- java web上传、下载文件源码以及应该注意的问题