C#挪用Java辦法實例詳解。本站提示廣大學習愛好者:(C#挪用Java辦法實例詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#挪用Java辦法實例詳解正文
C#可以直接援用C++的DLL和轉換JAVA寫好的法式。比來因為任務緣由接觸這方面比擬多,依據現實需求,我們經由過程一個詳細例子把一個JAVA辦法轉換成可以由C#直接挪用的DLL
C#挪用c++
C#挪用C++的例子網上許多,以一個C++的詳細辦法為例。
C++代碼
// 獲得一幀圖象數據 MVSMARTCAMCTRL_API int __stdcall MV_SC_GetOneFrame(IN void* handle, IN OUT unsigned char *pData , IN unsigned int nDataSize, IN OUT MV_SC_IMAGE_OUT_INFO* pstImageInfo); // 成果數據緩存的下限 #define MV_SC_MAX_RESULT_SIZE (1024*16) // 輸入幀的信息 typedef struct _MV_SC_IMAGE_OUT_INFO_ { unsigned short nWidth; // 圖象寬 unsigned short nHeight; // 圖象高 unsigned int nFrameNum; // 幀號 unsigned int nFrameLen; // 以後幀數據年夜小 unsigned int nTimeStampHigh; // 時光戳高32位 unsigned int nTimeStampLow; // 時光戳低32位 unsigned int nResultType; // 輸入的新聞類型 // 依據新聞類型對應分歧的構造體 unsigned char chResult[MV_SC_MAX_RESULT_SIZE]; unsigned int nReserved[8]; // 保存 }MV_SC_IMAGE_OUT_INFO C#代碼 /// <summary> /// 取得相機所攝影片 /// </summary> /// <param name="handle"></param> /// <returns></returns> [DllImport("MvSmartCamCtrl.dll")] public static extern int MV_SC_GetOneFrame(IntPtr handle, Byte[] pData, int nDataSize, out MV_SC_IMAGE_OUT_INFO pstDevInfo); // 輸入幀的信息 [StructLayout(LayoutKind.Sequential)] public struct MV_SC_IMAGE_OUT_INFO { public short nWidth; // 圖象寬 public short nHeight; // 圖象高 public int nFrameNum; // 幀號 public int nFrameLen; // 以後幀數據年夜小 public int nTimeStampHigh; // 時光戳高32位 public int nTimeStampLow; // 時光戳低32位 public int nResultType; // 輸入的新聞類型 // 依據新聞類型對應分歧的構造體 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024 * 16)] public MV_SC_RESULT_BCR chResult; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public int[] nReserved; }
如許我們把這個DLL放在法式根目次下,就可以完成DLL辦法的挪用。
C#挪用JAVA辦法
IKVM.NET是一個針對Mono和微軟.net框架的java完成,其設計目標是在.NET平台上運轉java法式。它包括了以下的組件:
用.NET完成的java虛擬機,java類庫的.NET完成。
努力於在java和.NET之間交互的對象。
法式需求
我們有一個JAVA寫好的Demo,傳的參數是用Gzip停止緊縮傳到辦事器的,代碼以下:
package Demo; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.params.HttpClientParams; import com.谷歌.gson.Gson; public class Demo { public static String doPostClient(String json, String url) { HttpClient httpClient = new HttpClient(); String rval = ""; PostMethod postMethod = new PostMethod(url); try { Gson gson = new Gson(); InputStream in = new ByteArrayInputStream(objectToByte(json)); postMethod.setRequestBody(in); HttpClientParams params = new HttpClientParams(); httpClient.setParams(params); httpClient.executeMethod(postMethod); byte[] b = postMethod.getResponseBody(); String rtnData = (String) byteToObject(b); rval = gson.toJson(rtnData); } catch (Exception e) { rval="erro:"+e.getMessage(); } finally { postMethod.releaseConnection(); } return rval; } public static byte[] objectToByte(java.lang.Object obj) { byte[] bytes = null; ObjectOutputStream oo = null; try { ByteArrayOutputStream out = new ByteArrayOutputStream(); GZIPOutputStream gzip = new GZIPOutputStream(out); gzip.write(obj.toString().getBytes("utf-8")); gzip.close(); bytes = out.toByteArray(); } catch (Exception e) { e.printStackTrace(); } finally { if (oo != null) { try { oo.close(); } catch (IOException e) { e.printStackTrace(); } } } return bytes; } private static java.lang.Object byteToObject(byte[] bytes) { String obj = ""; ObjectInputStream oi = null; try { ByteArrayInputStream bi = new ByteArrayInputStream(bytes); GZIPInputStream gzipi = new GZIPInputStream(bi); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(gzipi, "UTF-8")); String line; while ((line = bufferedReader.readLine()) != null) { obj+=line; } } catch (Exception e) { e.printStackTrace(); } finally { if (oi != null) { try { oi.close(); } catch (IOException e) { e.printStackTrace(); } } } return obj; } }
這個代碼我用C#改寫了,用HttpWebRequest的方法傳到辦事器,辦事器那裡Gzip解壓不了,查了緣由是由於Java與C#的Byte類型值規模分歧,我們有兩種處理思緒,一種是將這個JAVA做成webservice掛在辦事器上,c#再去挪用,第二種就是將這個辦法編譯成可由C#直接挪用的DLL,因為這個辦法功效比擬單一,我們拔取了後者。
情況設置裝備擺設
IKVM.NET 下載後解壓獲得BIN文件夾中的數據,用於JAR包轉換和基本DLL。
IKVM.OpenJDK.ClassLibrary.dll用於C#法式接入。
下載地址:https://yunpan.cn/cBHTS5fXsIe9v 拜訪暗碼 0847。
將IKVM.NET的BIN文件夾的地址添加到情況變量。
盤算機右鍵屬性--高等體系設置--高等--情況變量--在體系變量中找到PATH--將BIN文件夾的地址添加出來,
在CMD中輸出ikvmc 有贊助文檔解釋情況設置裝備擺設勝利。
Bin文件夾下的IKVM.OpenJDK.Core.dll,IKVM.Runtime.dll,IKVM.Runtime.JNI.dll和IKVM.OpenJDK.ClassLibrary.dll為公共DLL,一切轉換法式都需援用
轉換步調
1.肯定援用關系:
該Demo的構造以下:
Demo.jar 依附於 commons-httpclient-3.1.jar 和 gson-2.4.jar
commons-httpclient-3.1.jar 依附於 commons-logging-1.1.3.jar 和 commons-codec-1.6.jar
我們先將gson-2.4.jar,commons-logging-1.1.3.jar,commons-codec-1.6.jar 生成DLL,語法以下:
ikvmc JAR包物理途徑。
win7體系默許生成在C:\Users\Administrator 這個文件夾下
commons-httpclient-3.1.dll 生成語法以下:
ikvmc commons-httpclient-3.1.jar -r:commons-logging-1.1.3.dll -r:commons-codec-1.6.dll
我們將Demo打包的名字為JavaApi.Demo 如許生成的 JavaApi.dll 生成語法以下:
ikvmc JavaApi.Demo.jar -r:commons-httpclient-3.1.dll -r:gson-2.4.dll
下面的文件都是絕對應的物理途徑,然後將一切生成的DLL添加到C#項目中援用,包含之前的公共DLL,援用到項目中一切援用的DLL如圖:
如許便可以直接在法式中應用這個java辦法了
Demo.Demo.doPostClient(js, url);
第一個Demo java法式中的package名。
第二個Demo java法式中的class名。
以上所述是小編給年夜家引見的C#挪用Java辦法實例詳解的全體論述,願望對年夜家有所贊助,假如年夜家想懂得更多內容敬請存眷網站!