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.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的结构如下:
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方法实例详解的全部叙述,希望对大家有所帮助,如果大家想了解更多内容敬请关注猪先飞网站!
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了Spring AOP 对象内部方法间的嵌套调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-29
- 这篇文章主要介绍了c++中system("pause")的作用和含义,非常不错,具有参考借鉴价值,需要的朋友参考下吧...2020-04-25
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
- 这篇文章主要介绍了c# 三种方法调用WebService接口的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-07
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
这篇文章主要介绍了基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍 的相关资料,需要的朋友可以参考下...2016-05-14- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了C# 16 进制字符串转 int的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
- 这篇文章主要介绍了js实现调用网络摄像头及常见错误处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-07
InterlliJ IDEA2020新建java web项目找不到Static Web的解决
这篇文章主要介绍了InterlliJ IDEA2020新建java web项目找不到Static Web的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-02- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
- 这篇文章介绍了c#动态调用Webservice的两种方法实例,有需要的朋友可以参考一下...2020-06-25