Tomcat的Release Notes 里有这么一段话:
=======================
JNI Based Applications:
=======================
Applications that require native libraries must ensure that the libraries have
been loaded prior to use. Typically, this is done with a call like:
static {
System.loadLibrary("path-to-library-file");
}
in some class. However, the application must also ensure that the library is
not loaded more than once. If the above code were placed in a class inside
the web application (i.e. under /WEB-INF/classes or /WEB-INF/lib), and the
application were reloaded, the loadLibrary() call would be attempted a second
time.
To avoid this problem, place classes that load native libraries outside of the
web application, and ensure that the loadLibrary() call is executed only once
during the lifetime of a particular JVM.
简单地说就是JNI库的加载在启动Tomcat的JVM中只能进行一次,如果两次执行System.loadLibrary("path-to-library-file");将会导致错误(Error,不是Exception):
java.lang.UnsatisfiedLinkError:
Native Library xxx.dll already loaded in another classloader。
可是这段话并没有给出具体的解决办法。我要使用的一个NT登录验证的JAAS模块碰到了这个问题:我把包含这个语句的库放在了某个web应用程序的lib目录下,结果当修改了某个web配置文件导致这个程序的context reload时,JAAS模块就不能使用,因为它又重新加载JNI库导致错误。只有重新启动整个tomcat才能恢复正常,十分麻烦。
找了好久,终于在一个大侠的文章(http://cuiyingfeng.blog.ccidnet.com/blog/ccid/do_showone/tid_48232.html)中找到了解决方法:
1、加载JNI库的包放在Tomcat的common/lib目录下,而不要放在各context的lib目录下;
2、每次加载JNI库之前检查是否已经加载过。
由于加载语句不是我能控制的,所以第二种方法不能实现,于是我就通过第一种方法把这个问题解决了。
分享到:
相关推荐
首先,Java扫描仪接口调用涉及到Java的JNI(Java Native Interface)或JNA(Java Native Access)。JNI是Java平台的标准接口,允许Java代码与其他语言写的代码进行交互,如C/C++。通过JNI,Java应用程序可以直接调用...
需要注意的是,由于Jacob是基于JNI(Java Native Interface)的,所以可能存在一些兼容性问题,比如不同版本的Java和Windows,或者64位和32位系统的差异。在实际应用中,可能需要根据具体环境调整配置。 Apache标签...
在"j2ee通过jni调用dll"的场景中,Java应用服务器(如Tomcat、WebLogic等)运行J2EE应用程序时,可以通过JNI接口调用一个DLL。这通常发生在以下情况:需要利用操作系统提供的低级别功能,如文件I/O、硬件控制或者...
在Java编程中,有时我们需要利用本地库(Native Libraries)的功能,这时JNI(Java Native Interface)就派上了用场。JNI允许Java代码与本地代码(如C++或C)进行交互,使得开发者能够利用已有的C/C++库或者实现特定...
错误提示"no opencv_java249 in java.library.path"表明Java程序在运行时找不到名为`opencv_java249`的本地库,这个库是OpenCV的Java接口,用于在Java代码中调用OpenCV的功能。 2. **检查环境变量**: 首先,检查...
不能将本地库或者他们的 JNI 接口放在应用程序的 WEB-INF/lib 或者 WEB-INF/classes 目录下,否则可能会导致类装载器的问题。调用 System.loadLibrary(String) 的类必须被一个类装载器装载,而不会受到应用程序自己...
1. **加载顺序**:JNI函数在被调用时,系统首先尝试从本地库中查找,如果没有找到,则会尝试动态加载。 2. **异常处理**:在JNI中抛出异常时,通常使用`jthrowable`类型,并且可以通过`ExceptionOccurred`和`...
首先,我们可以通过Java的本地接口(JNI,Java Native Interface)来实现PHP与Java的交互。JNI允许Java代码调用C/C++编写的本地方法,从而间接实现PHP调用Java。在提供的文件中,“jni”标签可能代表了这一技术的...
Java和C++之间进行Socket通信时,可能会遇到乱码问题,主要是由于编码格式不一致导致的。Java默认使用UTF-8编码,而C++在Windows XP环境下可能使用GBK编码。解决这个问题的关键在于确保数据在传输过程中保持正确的...
Tomcat Native库是Tomcat与APR交互的桥梁,它是一个C编译的库,提供了Java Native Interface (JNI) 接口,使得Java代码能够调用APR的功能。这个库还包含了OpenSSL的绑定,使得Tomcat可以更高效地处理SSL连接。 安装...
JNI在很多场景下都是必要的,比如当需要利用已有的C/C++库,或者需要提升性能时,因为本地代码通常比Java更快。本文将详细讲解JNI的相关知识点,包括其用途、基本概念、使用步骤、以及一些常见的问题和解决方案。 1...
它的主要作用是提供对Java Native Access (JNA) 或者Java Native Interface (JNI) 的支持,使得Java代码能够直接调用Windows系统的本地API,实现如TLS加速、ALPN协议选择等功能。尤其在开启HTTP/2支持时,`tcnative-...
例如,使用Tomcat Native的本机SSL实现,可以避免Java的JNI调用开销,从而提高SSL连接的速度。此外,它还支持其他性能优化特性,如异步I/O操作。 **安装步骤** 1. **下载与解压**:首先,从Apache官方网站下载`...
JNI允许运行在虚拟机的Java程序能够与其它语言(例如C和C++)编写的程序或者类库进行相互间的调用。同时JNI提供的一整套的API,允许将Java虚拟机直接嵌入到本地的应用程序中。图1是Sun站点上对JNI的基本结构的描述
这个工具主要解决了跨语言通信的问题,使得开发者可以利用Java的丰富库和功能,即使他们的主要编程语言不是Java。在本篇文章中,我们将深入探讨JavaBridge的核心功能、使用场景以及如何操作。 JavaBridge 的核心...
通过阅读源码,我们可以学习到如何在Java中通过JNI调用本地方法,以及如何设计高效的网络I/O模型。 在实际开发中,我们可以通过编译源码来定制自己的连接器,比如调整线程池大小、优化网络缓冲区配置等,以适应特定...
例如,对于制卡机,可能需要编写C/C++的动态链接库,并通过JNI接口将其与JAVA代码结合,实现对制卡机的操作。 2. **JQuery跨域**: - 跨域是浏览器的一项安全策略,限制了JavaScript脚本只能访问同一源下的资源。...
Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips ...
- **APR (Apache Portable Runtime)**:通过JNI调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,提高静态文件处理性能。 - **配置示例**: ```xml ``` - **参数解释**: - `protocol`:...
4. `tomcat-jni.jar`:JNI(Java Native Interface)库,允许Java代码调用本地(C/C++)代码,通常与Tomcat底层操作相关,例如与session持久化相关的系统调用。 5. `catalina.jar`:Tomcat的核心组件,包含服务器的...