在struts的action里使用JNative报 JNative library not loaded

java123abc 2008-04-27 01:20:29
应工作需要,想要在web 项目里调用DLL(公司里提供了一个hkbank.dll),对JNI机制不是太熟,
去网上了解了一下,说用JNative比较方便,所以打算用它。
首先,我在系统环境变量里加了一个DLL_HOME变量,值为hkbank.dll所在的路径,同时把JNative
里的JNativeCpp.dll也放到hkbank.dll的路径下,然后将%DLL_HOME%加到系统环境变量Path下。
其次,将JNative.jar放到项目的classpath里。

写了段代码做测试

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();
}
}

测试发现可以调用

然后将以上测试代码转移至web项目中,也将JNative.jar加至web项目的classpath下。项目用的是struts1.2版。
代码如下

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)

然后,我将JNativeCpp.dll放置WINDOWS/system32下,做测试仍然抛以上异常
我觉得是DLL文件未找到,可为什么在非web程序中就能找到呢?
...全文
1370 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kjniuzemin2003 2008-11-22
  • 打赏
  • 举报
回复
你好。我想问一下,我怎么用JNative取得.dll中的属性值呀?另外,我的.dll中的方法是属于某某对象的,那我调用该方法的时候,也是像前面所说的方法那样调用吗?
wsxjq 2008-10-09
  • 打赏
  • 举报
回复
这个不是jni调用动态库,我也遇见过这种问题,直接将你的dll 放在tomcat 的bin 目录下就ok 了。
java123abc 2008-04-28
  • 打赏
  • 举报
回复
好的,谢谢nanjg
nanjg 2008-04-27
  • 打赏
  • 举报
回复
web项目和 一般的项目不一样
怎么来解决因为context重新加载而导致JNI类无法试用的问题呢?

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


出处:http://tech.ddvip.com/2006-04/11438421002114.html

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧