Java调用C++ API完整示例(dll)

来源:互联网 发布:linux添加用户组命令 编辑:程序博客网 时间:2024/05/19 23:59

最近有一个和香港的对接项目。在通信问题上出现了卡壳。港方提供的是一个java库,需要和我们这边进行交易策略对接。交易策略是以协议的方式,通过网络通信发送到我们的系统。由于我们缺少稳定可靠的java通信组件,但我们具有一个非常可靠的C++通信组件。因此就萌发了将现有的C++通信组件封装为可供Java调用的组件。通过几天的实验,最终达到目的。当然,由于时间有限,并未研究到非常透彻,其中也使用了某些比较取巧的手段。仅供参考。(在windows下通过JNI实现的)

源代码和工程可至如下地址免积分下载:http://download.csdn.net/detail/great3779/7136355

整个过程实际上是分三步:

一. 在java中写好匹配代码,并编译出C++头文件;

二. 写一个C++对接dll,用于桥接java和C++ api;

三. Java通过调用JNI调用桥接dll,最终完成对C++ api的调用。

详细步骤说明如下:


1.      在java源代码中完成匹配代码。

文件:Communication.java

 

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /* 
  2.  * Tochange this license header, choose License Headers in Project Properties. 
  3.  * Tochange this template file, choose Tools | Templates 
  4.  *and open the template in the editor. 
  5.  */  
  6.    
  7. package communication;  
  8.    
  9. /** 
  10.  * 
  11.  *@author user 
  12.  */  
  13. public class Communication {  
  14.    
  15.     public native boolean ConnectServer(String ip, int port);  
  16.     public native boolean SendDataToServer(String msg);  
  17.     public native String RecvData();  
  18.     public native void CloseSocket();  
  19.     public native int GetMrSocketLastError();  
  20.       
  21.    public static void main(String[] args) {  
  22.        System.loadLibrary("mrSocketAPIJavaInt");  
  23.        Communication comm=new Communication();  
  24.          
  25.         boolean res = comm.ConnectServer("127.0.0.1"17896);  
  26.           
  27.         while(true)  
  28.         {  
  29. //             String msg = comm.RecvData();  
  30. //             if(msg == null || msg.length()<= 0)  
  31. //                System.out.println("receive data error! errorcode::"+nativeCode.GetMrSocketLastError());  
  32. //             else  
  33. //                 System.out.println(msg);  
  34.               
  35.               
  36.             comm.SendDataToServer("1");  
  37.             try  
  38.             {  
  39.                  Thread.sleep(1000);  
  40.             }  
  41.             catch(InterruptedException ie)  
  42.             {  
  43.             }  
  44.               
  45.               
  46.         }  
  47.           
  48.         // comm.CloseSocket();  
  49.     }  
  50.  }  

2.      将.java文件编译成.class文件。

至src目录,运行cmd:javac ./communication/Communication.java



完成后,会在.java文件所在目录,生成同名的.class文件。


3.      将.class文件编译成C++对接头文件(.h文件)。

还是在src目录,运行cmd:javah -jni communication.Communication

完成后,会在src目录,生成头文件:communication_Communication.h


 4.      对接C++ api

设置编译器的include路径,包含java的头文件

C:\ProgramFiles\Java\jdk1.7.0_51\include

C:\Program Files\Java\jdk1.7.0_51\include\win32


 6.      新建一个C++ dll,并将头文件mronginfo_communication_communication.h引入,同时新建mronginfo_communication_communication.cpp,实现头文件中的这些接口。

 

7.      由于该dll是C++dll, 因此在该dll完成对原C++的api调用即可。


8.     将桥接dll, C++api共同拷贝至java包运行目录(例如:C:\Program Files\Java\jdk1.7.0_51\bin)即可。

0 0
原创粉丝点击