1. 程式人生 > >Java呼叫C++ API完整示例(dll)

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)即可。

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