81,122
社区成员




package com.huike.demo;
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
public class TestJNative {
public void test() {
JNative n = null;
try {
n = new JNative("hkbank.dll", "IcrConnect");
n.setRetVal(Type.INT);
int i = 0;
n.setParameter(i++, Type.INT, "0");
n.setParameter(i++, Type.INT, "9600");
n.invoke();
System.out.println(n.getRetVal());
} catch (NativeException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} finally {
try {
if(n != null) {
n.dispose();
}
} catch (NativeException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
TestJNative tn = new TestJNative();
tn.test();
}
}
package com.huike.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
public class CallDLLAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
JNative n = null;
try {
n = new JNative("hkbank.dll", "IcrConnect");
n.setRetVal(Type.INT);
int i = 0;
n.setParameter(i++, Type.INT, "0");
n.setParameter(i++, Type.INT, "9600");
n.invoke();
System.out.println(n.getRetVal());
} catch (NativeException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} finally {
try {
if(n != null) {
n.dispose();
}
} catch (NativeException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return null;
}
}
警告: Unhandled Exception thrown: class java.lang.IllegalStateException
2008-4-27 11:30:25 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet action threw exception
java.lang.IllegalStateException: JNative library not loaded, sorry !
at org.xvolks.jnative.JNative.<init>(JNative.java:337)
at org.xvolks.jnative.JNative.<init>(JNative.java:269)
at com.huike.struts.action.CallDLLAction.execute(CallDLLAction.java:19)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
怎么来解决因为context重新加载而导致JNI类无法试用的问题呢?
其实这个问题不难,我们只要不让JNI类重新加载即可。但是一般的应用服务器对Web项目中文件都是默认重新加载的,例如WEB-INF/classes以及WEB-INF/lib目录。如此我们便不能将 JNI类放在这两个目录下,但是我们又必须保证这个JNI类能被Web项目的其他类引用到,因此这就需要参照不同应用服务器的类路径的说明进行设置,对于 Tomcat而言,我们可以把这个JNI类单独打包并放在{tomcat}commonlib目录下,并删除web项目中的这个JNI类即可解决前面提到的问题。