⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.txt

📁 这是一个用java来调用dll的实例
💻 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 + -