📄 test.txt
字号:
Topic: 在struts的action里使用JNative报 JNative library not loaded
Print this page
--------------------------------------------------------------------------------
1.在struts的action里使用JNative报 JNative library not loaded Copy to clipboard
Posted by: kidd_zhang325
Posted on: 2008-04-27 11:44
应工作需要,想要在web 项目里调用DLL(公司里提供了一个hkbank.dll),对JNI机制不是太熟,
去网上了解了一下,说用JNative比较方便,所以打算用它。
首先,我在系统环境变量里加了一个DLL_HOME变量,值为hkbank.dll所在的路径,同时把JNative
里的JNativeCpp.dll也放到hkbank.dll的路径下,然后将%DLL_HOME%加到系统环境变量Path下。
其次,将JNative.jar放到项目的classpath里。
写了段代码做测试
12345678910111213141516171819202122232425262728293031323334353637383940
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版。
代码如下
12345678910111213141516171819202122232425262728293031323334353637383940414243
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;
}
}
所抛异常如下:
12345678910111213141516171819202122232425
警告: 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程序中就能找到呢?
--------------------------------------------------------------------------------
2.Re:在struts的action里使用JNative报 JNative library not loaded [Re: kidd_zhang325] Copy to clipboard
Posted by: Duncan
Posted on: 2008-04-27 19:51
native code dll 所在的資料夾(目錄)路徑必須包含在 system property: java.library.path。
你使用的 web container 之類的軟體在啟動時有可能有指定 java.library.path property,這時環境變數 path 的內容就不會是 java.library.path 的一部份,所以即使 path 環境變數有包含 jnative.dll 與 hkbank.dll 所在資料夾,JVM 會無法載入這些 dll(無法 locate 這些 dll)。
請參閱你的 web server/container 的文件,找出如何設定啟動 server/container 時的 system property: java.library.path 的值(也許直接修改啟動 server/container 的批次檔內容即可)。
--------------------------------------------------------------------------------
3.Re:在struts的action里使用JNative报 JNative library not loaded [Re: Duncan] Copy to clipboard
Posted by: kidd_zhang325
Posted on: 2008-04-27 21:17
Duncan wrote:
native code dll 所在的資料夾(目錄)路徑必須包含在 system property: java.library.path。
你使用的 web container 之類的軟體在啟動時有可能有指定 java.library.path property,這時環境變數 path 的內容就不會是 java.library.path 的一部份,所以即使 path 環境變數有包含 jnative.dll 與 hkbank.dll 所在資料夾,JVM 會無法載入這些 dll(無法 locate 這些 dll)。
請參閱你的 web server/container 的文件,找出如何設定啟動 server/container 時的 system property: java.library.path 的值(也許直接修改啟動 server/container 的批次檔內容即可)。
我用的是web container是Tomcat6.0,有人说:
如果要自定义DLL文件路径,例如将dll文件存放在E:\DLL那么编辑tomcat-bin--catalina.bat
在set JAVA_OPTS=%JAVA_OPTS%
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
后面添加-Djava.library.path="E:/DLL"
不知道是不是版本的问题,我这里tomcat6.0/bin下没有catalina.bat
但是在tomcat的conf資料夾下的catalina.properties文件中有指明
1
common.loader=${catalina.home}/lib,${catalina.home}/lib/*.jar
所以我将jnative.dll 與 hkbank.dll都放到了{catalina.home}/lib資料夾下,
同时也将JNative.jar及我所写的访问hkbank.dll的.class文件打包成.jar后都
放到了{catalina.home}/lib資料夾下,启动程序测试,错误依然
--------------------------------------------------------------------------------
4.Re:在struts的action里使用JNative报 JNative library not loaded [Re: kidd_zhang325] Copy to clipboard
Posted by: kidd_zhang325
Posted on: 2008-04-27 23:52
找到方法了,我将jnative.dll 和 hkbank.dll都放在Tomcat 6.0\bin资料夹下,JNative依旧放在在web项目WEB-INF/lib下并加至项目的classpath中,代码还是原来的,启动程序测试通过了。
另外,我打开Tomcat 6.0\bin下的tomcat6w.exe,在java选项卡下的Java Options似乎可以设置java.library.path,我在
1
-Djava.util.logging.config.file=catalina_home\conf\logging.properties
后增加了一项
1
-Djava.library.path=E:\Container\Tomcat 6.0\dll
(catalina_home为E:\Container\Tomcat 6.0,dll资料夹是我自己加的),想通过它来设置自定义的dll资料夹,但是未成功,不知是否设置有误
--------------------------------------------------------------------------------
5.Re:在struts的action里使用JNative报 JNative library not loaded [Re: kidd_zhang325] Copy to clipboard
Posted by: kidd_zhang325
Posted on: 2008-04-27 23:55
另外,谢谢Duncan給了我重要提示
--------------------------------------------------------------------------------
6.Re:在struts的action里使用JNative报 JNative library not loaded [Re: kidd_zhang325] Copy to clipboard
Posted by: Duncan
Posted on: 2008-04-28 00:27
kidd_zhang325 wrote:
找到方法了,我将jnative.dll 和 hkbank.dll都放在Tomcat 6.0\bin资料夹下,JNative依旧放在在web项目WEB-INF/lib下并加至项目的classpath中,代码还是原来的,启动程序测试通过了。
另外,我打开Tomcat 6.0\bin下的tomcat6w.exe,在java选项卡下的Java Options似乎可以设置java.library.path,我在
1
-Djava.util.logging.config.file=catalina_home\conf\logging.properties
后增加了一项
1
-Djava.library.path=E:\Container\Tomcat 6.0\dll
(catalina_home为E:\Container\Tomcat 6.0,dll资料夹是我自己加的),想通过它来设置自定义的dll资料夹,但是未成功,不知是否设置有误
property value 有空白時請以雙引號包圍。
1
-Djava.library.path="E:\Container\Tomcat 6.0\dll"
--------------------------------------------------------------------------------
JavaWorld@TW
Powered by Powerful JuteForum? Version Jute 1.5.8
Copyright? 2002-2003 Rainman Zhu,Zua,Netboy,Scott. All Rights Reserved.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -