国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#調用Java方法實例詳解

2019-10-29 21:24:13
字體:
來源:轉載
供稿:網友

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.google.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的結構如下:

C#,java,方法

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如圖:

C#,java,方法

這樣就可以直接在程序中使用這個java方法了

Demo.Demo.doPostClient(js, url);

第一個Demo java程序中的package名。

第二個Demo java程序中的class名。

以上所述是小編給大家介紹的C#調用Java方法實例詳解的全部敘述,希望對大家有所幫助,如果大家想了解更多內容敬請關注VEVB武林網網站!


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 贵阳市| 凤凰县| 辽源市| 吉安市| 遂平县| 资兴市| 岳西县| 宁强县| 锦屏县| 油尖旺区| 梅河口市| 温宿县| 鸡泽县| 新和县| 永州市| 禹城市| 新巴尔虎右旗| 闵行区| 天水市| 辉南县| 建阳市| 红桥区| 锡林浩特市| 方山县| 沂水县| 定陶县| 高州市| 赤水市| 陆丰市| 灵宝市| 浦北县| 中方县| 贵溪市| 突泉县| 元谋县| 旌德县| 梁平县| 富顺县| 丁青县| 台湾省| 界首市|