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
- /*
- * Tochange this license header, choose License Headers in Project Properties.
- * Tochange this template file, choose Tools | Templates
- *and open the template in the editor.
- */
- package communication;
- /**
- *
- *@author user
- */
- public class Communication {
- public native boolean ConnectServer(String ip, int port);
- public native boolean SendDataToServer(String msg);
- public native String RecvData();
- public native void CloseSocket();
- public native int GetMrSocketLastError();
- public static void main(String[] args) {
- System.loadLibrary("mrSocketAPIJavaInt");
- Communication comm=new Communication();
- boolean res = comm.ConnectServer("127.0.0.1", 17896);
- while(true)
- {
- // String msg = comm.RecvData();
- // if(msg == null || msg.length()<= 0)
- // System.out.println("receive data error! errorcode::"+nativeCode.GetMrSocketLastError());
- // else
- // System.out.println(msg);
- comm.SendDataToServer("1");
- try
- {
- Thread.sleep(1000);
- }
- catch(InterruptedException ie)
- {
- }
- }
- // comm.CloseSocket();
- }
- }
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
- /*
- * Tochange this license header, choose License Headers in Project Properties.
- * Tochange this template file, choose Tools | Templates
- *and open the template in the editor.
- */
- package communication;
- /**
- *
- *@author user
- */
- public class Communication {
- public native boolean ConnectServer(String ip, int port);
- public native boolean SendDataToServer(String msg);
- public native String RecvData();
- public native void CloseSocket();
- public native int GetMrSocketLastError();
- public static void main(String[] args) {
- System.loadLibrary("mrSocketAPIJavaInt");
- Communication comm=new Communication();
- boolean res = comm.ConnectServer("127.0.0.1", 17896);
- while(true)
- {
- // String msg = comm.RecvData();
- // if(msg == null || msg.length()<= 0)
- // System.out.println("receive data error! errorcode::"+nativeCode.GetMrSocketLastError());
- // else
- // System.out.println(msg);
- comm.SendDataToServer("1");
- try
- {
- Thread.sleep(1000);
- }
- catch(InterruptedException ie)
- {
- }
- }
- // comm.CloseSocket();
- }
- }
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)即可。