[Java] 利用jawin完成調用window中dll的調用[轉載]

由於項目的特殊需求,我們必須在程式調用window的dll。
開始我們用jni,後來由於調用的dll太多,而且很煩瑣。所以,我們決定用開源的jawin調用。
jawin 可以對dll中的方法進行調用,也可以調用com中的方法.內部還提供了一個工具,直接對 com組件匯出成 java的類,個人認為很方便。


有三篇…待整理

========================================================

========================================================
下面是我們作的一個測試,很順利便通過了。
1、下載jawin︰http://jawinproject.sourceforge.net/;/1218107116443/)。
2、配置︰
    》將jawin.jar放於%JAVA_HOME%jrelibext下 。
    》將jawin.dll放於c:winntsystem32下。否則將出現錯誤︰COMException : no jawin in java.library.path;
    也可將jawin.dll放於每個項目目錄下。

   》至此在Editplus中調試Jawin/NJawin的例子,可以透過。 而在Eclipse中有時還會出上面的錯誤︰COMException : no jawin in java.library.path。
   》在Eclipse中,選單->window->preference->Java->installed JREs 將原來的remove,重新建一個指到你的java sdk目錄。
   》 ok了。
 3、程式測試︰

     》調用 dll,dll 的模式不需要匯出了,直接調用就可以了,下面是下載的包中提供的一個例子:
     》我在win2000下,測試透過。
/
 
Created on Dec 22, 2005
 
 
/
import org.jawin.FuncPtr;

import org.jawin.ReturnFlags;

/*
 
@author gf  mail to [email protected]
 
 
TODO To change the template for this generated type comment go to
  Window - Preferences - Java - Code Style - Code Templates
 
/
public class GfJawinTest {

       public static void main(String[] args) {

              try {

                     FuncPtr msgBox = new FuncPtr(“USER32.DLL”, “MessageBoxW”);

                  

                     msgBox.invoke_I(0, “Hello From a DLL”, “From Jawin”, 0, ReturnFlags.CHECK_NONE);

              } catch (Exception e) {

                     e.printStackTrace();

              }

       }

}
 轉自︰http://www.blogjava.net/gf7/archive/2005/12/22/25041.html

========================================================

========================================================

1.下載NJawin,將jawin.jar放於%JAVA_HOME%jrelibext下

2.將jawin.dll放於c:winntsystem32下。否則將出現錯誤︰COMException : no jawin in java.library.path;

   也可將jawin.dll放於每個項目目錄下。

3.至此在Editplus中調試Jawin/NJawin的例子,可以通過。

  而在Eclipse中有時還會出上面的錯誤︰COMException : no jawin in java.library.path。

4.在Eclipse中,選單->window->preference->Java->installed JREs

  將原來的remove,重新建一個指到你的java sdk目錄。
5. ok了。

jawin下載: Jawin;/1218107102504/)
hinet: jawin.zip

========================================================

========================================================


今天老师和我聊起Java调用Win API的事,回来查了下,SUN官方提供的JNI调用时还要自己生成头文件,对已有的DLL再次进行封装。需要对C++非常熟悉,因为要写C++代码。不过还好还有另一种解决方案——Jawin。

官方网站:http://jawinproject.sourceforge.net

把lib文件夹下的jawin.jar和jawin-stubs.jar放到%JAVA_HOME%jrelibext 目录下
把bin文件夹下的
jawin.dll放到%SystemRoot%System32 目录下

然后就可以运行demo下的Hellodll.java了:

/ HelloDll.java -
This file is part of the Jawin Project: http://jawinproject.sourceforge.net/
Please consult the LICENSE file in the project root directory,
or at the project site before using this software. /


/ $Id: HelloDll.java,v 1.3 2004/06/14 20:16:38 arosii_moa Exp $ /

package demos;

import org.jawin.COMException;
import org.jawin.FuncPtr;
import org.jawin.ReturnFlags;


/* Demo that uses the Win32 MessageBoxW API-method.
@version     $Revision: 1.0 $
@author      虫的传人, http://hi.baidu.com/虫的传人/
/
public class HelloDll {


public static void main(String[] args) throws Exception {
   FuncPtr msgBox = null;
   try {
    msgBox = new FuncPtr(“USER32.DLL”, “MessageBoxW”);
    msgBox.invoke_I(0, “Hello From a DLL”, “From Jawin”, 0, ReturnFlags.CHECK_FALSE);
   } catch (COMException e) {
    // handle exception
    e.printStackTrace();
    throw e;
   } finally {
    if (msgBox != null) {
     try {
      msgBox.close();
     } catch (COMException e) {
      // handle fatal exception
      e.printStackTrace();
      throw e;
     }
    }
   }
}
}


调用自己写的dll:

import org.jawin.COMException;
import org.jawin.FuncPtr;
import org.jawin.ReturnFlags;


public class nativeDll {
public static void main(String[] args) throws Exception {
   int result1,result2;
   FuncPtr test1 = null;
   FuncPtr test2 = null;
   try {
    test1 = new FuncPtr(“demo.dll”, “test1”);
    test2 = new FuncPtr(“demo.dll”, “test2”);
    result1 = test1.invoke_I(5, 6, ReturnFlags.CHECK_NONE);
    result2 = test2.invoke_I(5, 6, ReturnFlags.CHECK_NONE);
    System.out.println(“5 plus 6 is “ + result1);
    System.out.println(“5 multiply 6 is “ + result2);
   } catch (COMException e) {
    e.printStackTrace();
   } finally {
    if (test1 != null) {
     try {
      test1.close();
     } catch (COMException e) {
      e.printStackTrace();
     }
    }
    if (test2 != null) {
     try {
      test2.close();
     } catch (COMException e) {
      e.printStackTrace();
     }
    }
   }
}
}


命令行运行:javac nativeDll.java
java -classpath “.;%JAVA_HOME%jrelibextjawin.jar” nativeDll

注意,这里一定要加-classpath “.;%JAVA_HOME%jrelibextjawin.jar” 不然会提示

Exception in thread “main” java.lang.NoClassDefFoundError: org/jawin/COMExceptio
n
Caused by: java.lang.ClassNotFoundException: org.jawin.COMException
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)


特别注意”.;”,不加的话会提示

Exception in thread “main” java.lang.NoClassDefFoundError: nativeDll
Caused by: java.lang.ClassNotFoundException: nativeDll
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)


Next: [C/C++] 載入DLL中的副程式[轉貼] Prev: [Java] 關於Java調用dll的方法