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名。

转载于:https://www.cnblogs.com/kaoleba/p/5653414.html

C#调用Java方法(详细实例)相关推荐

  1. c 调用java post方法_C#调用Java方法(详细实例)

    C#可以直接引用C++的DLL和转换JAVA写好的程序.最近由于工作原因接触这方面比较多,根据实际需求,我们通过一个具体例子把一个JAVA方法转换成可以由C#直接调用的DLL C#调用c++ C#调用 ...

  2. js调用java_Js调用Java方法并互相传参的简单实例

    Js通过PhoneGap调用Java方法并互相传参的. 一.JAVA代码 写一个类,该类继承自Plugin并重写execute方法. public class PluginTest extends P ...

  3. js调java并传参_Js调用Java方法并互相传参的简单实例

    Js通过PhoneGap调用Java方法并互相传参的. 一.JAVA代码 写一个类,该类继承自Plugin并重写execute方法. import org.json.JSONArray; import ...

  4. android jni 结构体_Android应用开发Android JNI-c/c++调用java方法

    本文将带你了解Android应用开发Android JNI-c/c++调用java方法,希望本文对大家学Android有所帮助. " Android   JNI-c/c++调用java方法, ...

  5. C++调用Java方法

    最近在搞JNI那块,发现网上很多都是Java调用JNI,然后再调用C++的方法.而当C++函数里调用Java的方法,网上的文章可以说是少之又少,所以写此篇文章共勉.... 本文介绍两种方法,一是C++ ...

  6. 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )

    文章目录 I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV . JNI ...

  7. JNI基础 c语言调用java方法

    利用c语言调用java无参的方法 java方法 com.example.jniparsedata.ParseData类中的方法     //打印     public void sayHelloFro ...

  8. 本地方法(JNI)——调用 java 方法

    [0]README 1) 本文部分文字描述 转自 core java volume 2 , 旨在理解 本地方法(JNI)--调用 java 方法 的基础知识 : 2) C语言调用java 方法,包括: ...

  9. xsl调用java方法传参_Java中的XSL转换:一种简单的方法

    xsl调用java方法传参 XSL转换 (XSLT)是将一个XML文档转换为另一个XML文档的强大机制. 但是,在Java中,XML操作相当冗长和复杂. 即使是简单的XSL转换,也必须编写几十行代码- ...

最新文章

  1. Rabbit MQ 学习笔记(3)角色列表
  2. android内核模块签名,android安装内核module,提示Required key not available
  3. 卧槽!12个杭州阿里高学历女员工被初中男骗财骗色1900多万!骗子冒充有钱佬!开豪车保时捷勾搭妹子,法院判无期徒刑!...
  4. python 基础列表解析(十八)
  5. plsql学习笔记---plsql相关概念,以及基础结构
  6. CCF NOI1074 2的幂次方表示
  7. docker 厂商 容器_我终于不用再解释Docker了!
  8. PERT网络分析法(计划评估和审查技术)
  9. html 图片循环轮播,如何在Web端实现动画切换效果一致的无限循环图片轮播?
  10. 数据分布度的度量Measures of Spread
  11. PS中图层混合模式的Blend公式
  12. 计算机网络——CSMA/CD协议
  13. 打散线条lisp_cad细线模式(cad中宽线炸开后变成细线是怎么回事)
  14. java打开jnlp_jnlp文件怎么打开
  15. SparkStreaming通过读取文件动态黑名单过滤
  16. 超好用一键卸载软件和软件注册码
  17. “被动挖光缆”到“主动剪网线”,蚂蚁金服异地多活的微服务体系
  18. Unit Test Harness(用具)应该具备什么功能?
  19. CANoe.DiVa 操作指南 - 时间参数配置
  20. 利用JapiDocs构建java接口文档(无代码侵入性)

热门文章

  1. 勒索软件损失2年增15倍 2017年可达50亿美元
  2. [20170302]什么是fuzzy.txt
  3. STL学习系列七:优先级队列priority_queue容器
  4. 关于ExtJs4的Grid带 查询 参数 分页(baseParams--extraParams)
  5. UTF8 与 UTF8 +BOM 区别
  6. Shell脚本:Linux下定时备份MySQL数据库
  7. GDI+中发生一般性错误 以及发布时候需要配置的文件
  8. Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)
  9. 网格成就Web 2.0存储时代的路易XIV?
  10. mysql数据库基础知识和安装与卸载(快速入门)