混合编程-C#调用Java代码之简单篇

混合编程

前言:这几天在处理跨语言调用的时候碰了不少坑,为了让更多的开发者更快速高效地解决问题,写个文章记录一下,和大家分享!


何为混合编程

混合编程指的是使用两种或两种以上的程序设计语言来开发应用程序的过程。 (来自百度百科)

优势:能够结合各种语言之间的优势,来开发一个强劲的系统。比如Java和C++:JAVA简单,开发效率很高,完全面向对象,适合做应用程序,C++复杂,运行效率高,难以反编译,适合做底层。Android应用开发时,用Java写应用层,开发效率高,底层关键算法可考虑使用C++,执行效率高,也不容易被反编译,保密性更好。

缺陷:混合编程带来的缺陷就是人员的调动,需要每个语言都有一个专家级人物,能够对该语言产生的疑难杂症进行快速地判断处理,除了每个语言要有一个专家级人物之外,还有有一个主力,负责统筹各语言之间的交互问题,协调处理语言之间的数据交互等问题。


工具介绍 - IKVM

这里我们以C#调用Java为例,C#调用Java代码需要用到一个工具,那就是IKVM,该工具的作用就是将Jar包转换成DLL文件

IKVM介绍:

  • 在.NET中实现的Java虚拟机
  • Java类库的.NET实现
  • 支持Java和.NET互操作性的工具

    官网:https://www.ikvm.net/


环境配置

1.判断是否安装IKVM

  • 测试环境:Win+R,然后输入cmd打开命令行,最后在命令行中输入IKVM,如果显示'ikvm' 不是内部或外部命令,也不是可运行的程序 或批处理文件。,说明未安装,继续第二步
  • 下载工具: 进入官网,找到下载链接,官网的下载链接是IKVM 7的版本,下载链接为:https://sourceforge.net/projects/ikvm/files/ , 打开如下图所示界面,点击红色方框的按钮进行下载,等待几秒就会自动下载了。
  • 配置环境 下载下来就是配置环境变量了,比如说我解压到了D盘,那么我在添加到系统环境变量的Path下,添加一个路径就是:D:\ikvm-7.2.4630.5\bin
  • 环境验证:命令窗口中输入IKVM,如果出现下图,说明环境配置成功!如果还是出现如步骤一的图示,说明环境配置不成功!

实现过程

1、创建Java工程

注意事项:

  • 该工程的JRE运行环境是1.7
  • 需要被调用的方法(即getString())不能被privatestatic修饰
  • 包名不能是默认的包名(即缺省的包名),否则在C#中将无法通过命名空间找到该类

工程代码如下:

1
2
3
4
5
6
7
8
9
10
11
package com.test;
public class JarClass {
/**
* 创建一个公有非静态的方法
* @return
*/
public String getString() {
return "Hello World!";
}
}

2、将工程打包成Jar包

  • 在Java项目中点击:右键 -> Export -> Java -> Jar file -> Next ,出现下图所示的画面,图中的3就是选择要导出Jar包的路径,完成之后一路点击Next即可。


  • 完成上面这些步骤之后,会得到一个Jar包。这个Jar包就是用来转换成DLL文件的。

3、将Jar文件转换成DLL文件

  • 命令行中使用IKVM将JAR包转换成DLL文件,转换命令为:ikvmc -out:要转换的dll文件名称 转换Jar包的路径
  • 例如:ikvmc -out:JarTest.dll C:\Users\pangh\Desktop\JarTest.jar
  • 出现下图说明转换成功,此时在JarTest.jar文件同一路径下,会多出一个JarTest.dll的文件,这个就是要在C#中使用到的文件啦!

4、新建一个WPF项目

  • 首先要在WPF中通过NuGet包管理器安装IKVM插件。点击:工具 -> NuGet包管理器 -> 管理解决方案的NuGet 包管理器
  • 进入NuGet包管理器之后,点击:浏览 ->输入IKVM ->点击IKVM ->右侧选择当前项目 ->选择IKVM的版本为:7.2.4630.5 ->安装

    注意:WPF项目里安装的IKVM的版本要和将Jar转DLL的IKVM版本一致,否则会出现IKVM版本冲突的情况

  • 等待一会,安装完成后控制台会输出
  • 安装完成之后查看WPF项目的引用,会多出一下关于IKVM的DLL文件

5、使用DLL文件

  • 在项目中通过添加引用把我们的DLL文件添加到引用中

  • 添加引用完成之后,在MainWindow.cs 文件中使用该我们的DLL文件,使用方式是通过using Java程序的包名,然后再通过包名找到相应的类,最后在通过类调用相应的方法这一步很关键

cs文件代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Windows;
using com.test; // 这一步很关键,只有using com.test才能找到Java项目中的JarClass类
namespace WpfApp1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
JarClass test = new JarClass();
string t = test.getString();
MessageBox.Show(t);
}
}
}
  • 调用成功的图片

关键步骤

  • 1、导出Jar包
  • 2、使用IKVM将Jar包转换成DLL文件
  • 3、在C#中使用DLL文件,调用Java代码

本文小结

通过初次接触混合编程的过程,也踩了不少坑,混合编程给我们带来了多种语言的优势,我们在整合多种语言的时候也需要注意版本问题,如果把混合编程利用的好的话,能够给我们带来很多的便利。下一篇文章将给大家带来C#如何调用Java代码(复杂篇)。 希望能够帮助到更多的developer.


版权声明:本文为博主原创文章,转载请注明出处http://hunterblog.cn/ 和作者:Hunter,谢谢支持。