程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#挪用Java辦法實例詳解

C#挪用Java辦法實例詳解

編輯:C#入門知識

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辦法實例詳解的全體論述,願望對年夜家有所贊助,假如年夜家想懂得更多內容敬請存眷網站!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved