[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)