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

最近有一個和香港的對接項目。在通信問題上出現了卡殼。港方提供的是一個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)即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章