Java调用dll与C++通讯(包括.dll文件的制作)

 
整体思路分为三步: java 方的代码开发;VC++方的代码开发; 如何在Tomcat下的部署使得java web可以访问此DLL接口。
第一部分:java 方的代码开发
第一步:在java方用Eclipse新建一个java web的Project.
第二步:在源文件目录下,新建一个CallSoftDll类,代码如下:
Java代码 复制代码
  1. package com.mycompany.call;   
  2. /**  
  3.  * @author sech  
  4.  *   
  5.  * @version 1.0  
  6.  */  
  7. public class CallSoftDll {   
  8.   
  9.     public native static int get();   
  10.   
  11.     public native static void set(int i);   
  12.   
  13.     static {   
  14.         System.loadLibrary("com_mycompany_call_CallSoftDll");   
  15.     }   
  16.   
  17.         public static void main(String[] args) {   
  18.         // TODO 自动生成方法存根   
  19.         CallSoftDll test = new CallSoftDll();   
  20.         test.set(10);   
  21.         // test.add(2, 5);   
  22.         // System.out.println(test.add(2, 5));   
  23.         System.out.println("successdfdsfsd!!");   
  24.         System.out.println(test.get());   
  25.         System.out.println("success!!");   
  26.     }   
  27. }  
package com.mycompany.call;
/**
 * @author sech
 * 
 * @version 1.0
 */
public class CallSoftDll {

	public native static int get();

	public native static void set(int i);

	static {
		System.loadLibrary("com_mycompany_call_CallSoftDll");
	}

		public static void main(String[] args) {
		// TODO 自动生成方法存根
		CallSoftDll test = new CallSoftDll();
		test.set(10);
		// test.add(2, 5);
		// System.out.println(test.add(2, 5));
		System.out.println("successdfdsfsd!!");
		System.out.println(test.get());
		System.out.println("success!!");
	}
}

保存后,并构建,如果构建成功;继续往下看。
第三步:打开项目所在目录下的classes目录,我的目录为:
F:/WorkSpace/Project/root/WEB-INF/classes
在这里新建run.bat文件,在文本编辑器中打开该文件,添加代码如下:
javah -classpath . -jni com.mycompany.call.CallSoftDll
第四步:双击run.bat文件运行后,在该目录下出现一个com_mycompany_call_CallSoftDll.h文件,代码如下:
C++代码 复制代码
  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>   
  3. /* Header for class com_mycompany_call_CallSoftDll */  
  4.   
  5. #ifndef _Included_com_mycompany_call_CallSoftDll   
  6. #define _Included_com_mycompany_call_CallSoftDll   
  7. #ifdef __cplusplus   
  8. extern "C" {   
  9. #endif   
  10. /*  
  11.  * Class:     com_mycompany_call_CallSoftDll  
  12.  * Method:    get  
  13.  * Signature: ()I  
  14.  */  
  15. JNIEXPORT jint JNICALL Java_com_mycompany_call_CallSoftDll_get   
  16.   (JNIEnv *, jclass);   
  17.   
  18. /*  
  19.  * Class:     com_mycompany_call_CallSoftDll  
  20.  * Method:    set  
  21.  * Signature: (I)V  
  22.  */  
  23. JNIEXPORT void JNICALL Java_com_mycompany_call_CallSoftDll_set   
  24.   (JNIEnv *, jclass, jint);   
  25.   
  26. /*  
  27.  * Class:     com_mycompany_call_CallSoftDll  
  28.  * Method:    add  
  29.  * Signature: (II)I  
  30.  */  
  31. JNIEXPORT jint JNICALL Java_com_mycompany_call_CallSoftDll_add   
  32.   (JNIEnv *, jclass, jint, jint);   
  33.   
  34. #ifdef __cplusplus   
  35. }   
  36. #endif   
  37. #endif  

网站可以直接调用CallSoftDll类,完成操作.
到此为止,java方的工作基本完成。
第二部分:VC++方的代码开发
打开Microsoft Visual C++可视化的工具,新建name为com_mycompany_call_CallSoftDll的项目
第一步:将JAVA_HOME文件夹下的
JAVA_HOME/include/jni.h
JAVA_HOME/include/win32/jni_md.h
和第一部分java项目中生成的com_mycompany_call_CallSoftDll.h
将这三个头文件拷贝到项目的Header files目录下。
第二步:根据头文件编辑Utill.app文件,代码如下。
C++代码 复制代码
  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>   
  3. /* Header for class com_mycompany_call_CallSoftDll */  
  4.   
  5. #ifndef _Included_com_mycompany_call_CallSoftDll   
  6. #define _Included_com_mycompany_call_CallSoftDll   
  7. #ifdef __cplusplus   
  8. extern "C" {   
  9. #endif   
  10. int i = 0;    
  11. /*  
  12.  * Class:     com_mycompany_call_CallSoftDll  
  13.  * Method:    get  
  14.  * Signature: ()I  
  15.  */  
  16. JNIEXPORT jint JNICALL Java_com_mycompany_call_CallSoftDll_get   
  17.   (JNIEnv *, jclass){   
  18. return i;   
  19. }   
  20.   
  21. /*  
  22.  * Class:     com_mycompany_call_CallSoftDll  
  23.  * Method:    set  
  24.  * Signature: (I)V  
  25.  */  
  26. JNIEXPORT void JNICALL Java_com_mycompany_call_CallSoftDll_set   
  27.   (JNIEnv *, jclass, jint j){   
  28. i=j;   
  29. }   
  30.   
  31. #ifdef __cplusplus   
  32. }   
  33. #endif   
  34. #endif  

第三步:编辑com_mycompany_call_CallSoftDll.def文件,代码如下:
C++代码 复制代码
  1. ; com_mycompany_call_CallSoftDll.def : Declares the module parameters for the DLL.   
  2. LIBRARY      "com_mycompany_call_CallSoftDll"  
  3. DESCRIPTION  'com_mycompany_call_CallSoftDll Windows Dynamic Link Library'  
  4. EXPORTS   
  5.      Java_com_mycompany_call_CallSoftDll_add  
 
第四步:
构建项目(快捷键为:Ctrl+F5).
如果构建项目OK的话,继续下面的工作。
默认在你的项目下出现你所需要的DLL文件。
我的出现在: D:/XP/Program Files/Microsoft Visual Studio/MyProjects/Utill/Debug文件夹下。
第五步:
点击“组建”菜单,选择下面的“配制..”
选择Win32 Release 点击关闭。
第五步:
点击“工程”下的“设置”,选择“使用MFC作为静态连接库”,点击确定即可。
到这里完成。
再次点击构建项目(快捷键为:Ctrl+F5)。
如果也没有问题的话,在
D:/XP/Program Files/Microsoft Visual Studio/MyProjects/Utill/Release文件下会出现你要的DLL文件。
第六步:区别
Debug和Release文件夹下的两个相同的DLL文件的区别:
都是实现了java接口的功能。
不同的是Debug目录下生成的那个Dll文件是用在装有Microsoft Visual C++ 6.0环境的机器上的。而Release目录下的那个DLL是用在没有装过Microsoft Visual C++ 6.0环境的机器上的。
第三部分:
如何在Tomcat下的部署使得java web可以访问此DLL接口
第一步:将生成的文件放在哪里?有两种情况:
如果是java应用程序调用的话,就放置在我的机器是win xp 我就放在system32文件夹下。
如果是java web 开发的话,就是放置在JAVA_HOME的根目录下的bin文件夹下。
第二步:将eclipse下的java web项目,在tomcat下进行部署,并运行.
到此如何用java 调用DLL文件结束。

注:
当类中有package时进行包.类的打包
生成的dll文件要放在%JAVA_HOME%/bin目录下
另:
dll生成过程未经测试,可能有所纰漏,但dll打包前的步骤都是正确的,也可以确保熟悉c++的人成功生成dll文件(我使用的dll文件是别人直接生成的,因我不会c++开发    )
参考资料: http://www.zone99.cn/redirect.php?tid=308&goto=lastpost
http://www.pconline.com.cn/pcedu/empolder/gj/java/0506/642328.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值