前言

开发环境

客户端:Unity3D开发(C#)

服务器:Java (基于Java7)

日   期:2016年09月

需求说明

部分服务器的部分逻辑功能在客户端实现一遍,可以简单的理解为服务器的部分逻辑代码搬到客户端来实现一遍。

想到的办法是代码转换。有两个原因:

  • 时间问题,把时间用在更有意义的事情上。
  • 解放双手和大脑,无须把相同的代码写两遍。

源代码转换法

源代码转换就是指把Java的代码转换成C#的源代码。

这样做的好处是方便后续的开发和调试,有源码更放心。

以下是几个工具,用于Java源码转换到C#源码

Java Language Conversion Assistant

文档:https://msdn.microsoft.com/zh-cn/library/1kwtxa08(v=vs.80).aspx

下载:https://www.microsoft.com/en-us/download/details.aspx?id=14349

visual studio 2008及之前的老版本集成此工具,但从visual studio2010起已不提供,故放弃之。

j2cstranslator

下载:https://sourceforge.net/projects/j2cstranslator/

介绍:http://www.cnblogs.com/Lawson/archive/2012/02/21/2361827.html

开源,免费,但13年至今未更新

octopus .NET Translator

官网:http://www.remotesoft.com/octopus/

收费,未进行详细了解

Java to C# Converter

官网:http://www.tangiblesoftwaresolutions.com/Product_Details/Java_to_CSharp_Converter.html

介绍:http://www.cnblogs.com/yiyan127/p/CSharp_CrackJava2CSharpConverter.html

收费,免费版有1000行代码限制。看了官网介绍后,决定使用它。

XES – Java To C#

官网:http://www.euclideanspace.com/software/language/xes/userGuide/convert/javaToCSharp/index.htm

下载:https://sourceforge.net/projects/xes/files/OldFiles/xes_java_runtime_alpha06.zip/download

免费,似乎用起来并不那么理想,目前的最新版本是2004年,未有更新,故放弃之。

Java to C# Converter

经过对比之后,我选择了Java to C# Coverter,此工具的更多详情,可以在官网的介绍中查看

转换过程中的信息信息,会出现在对话框中,同时也会标注在转换后的代码中。

虚拟机运行法(IKVM)

本小节主要是说 IKVM在Unity中的使用。

IKVM下载:https://github.com/Unity-Technologies/kaizen/tree/master/bundles/IKVM.NET

IKVM和Unity

话题讨论

http://forum.unity3d.com/threads/building-project-with-ikvm-dlls-inside.101097/

JavaToDll导出

下图中,上图是Java的源代码,下方是转换成Dll后反编译查看的代码。

我的测试

引擎版本:Unity 4.0 / Unity 5.3.5 (目标平台测试过 Windows和Android 平台)

IKVM:ikvm-7.2.4630.5

OS:Windows 7 x64

  1. 从git或官网下载ikvm,比如我下载的ikvm-7.2.4630.5.zip,并解压
  2. 拷贝ikvm-7.2.4630.5\bin\下的所有dll 到Unity的Assets\Plugins
  3. 拷贝Java转换出的dll,放到Assets\Plugins 下,比如我的hello.dll
  4. 在Unity的脚本中调用java中的class , method 等等

下方是我测试过程中出现的Error,出于性能和后期调试考虑,我放弃了此种方式,采用将Java代码转换成C#源码的方式。

已知Error

当在脚本的全局变量,返回值,协程中引用了java中的class,method时,就会报以下Error。

private ExampleLibrary exampleLibrary2;
IEnumerator CoLog()
{
int idx = ;
ExampleLibrary exampleLibrary = new ExampleLibrary();
while (idx < )
{
DoLog(exampleLibrary.HelloWorld());
yield return null;
idx++;
}
}

但如果是内部变量则不会有这些Error。

void TestLog()
{
ExampleLibrary exampleLibrary = new ExampleLibrary();
for (int idx = ; idx < ; idx++)
{
DoLog(exampleLibrary.HelloWorld());
}
}

运行时Error

GameObject (named 'Main Camera') references runtime script in scene file. Fixing!
The script behaviour 'IKVM_Java_HelloWorld' could not be instantiated!

Project中选中脚本时的Error

TypeLoadException: Could not load type 'IKVM_Java_HelloWorld' from assembly 'Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.
System.MonoType.GetFields (BindingFlags bindingAttr) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System/MonoType.cs:)
UnityEditor.MonoScriptImporterInspector.ShowFieldInfo (System.Type type, UnityEditor.MonoImporter importer, System.Collections.Generic.List` names, System.Collections.Generic.List` objects, System.Boolean& didModify) (at C:/buildslave/unity/build/Editor/Mono/Inspector/MonoScriptInspector.cs:)
UnityEditor.MonoScriptImporterInspector.OnInspectorGUI () (at C:/buildslave/unity/build/Editor/Mono/Inspector/MonoScriptInspector.cs:)
UnityEditor.InspectorWindow.DrawEditor (UnityEditor.Editor editor, Int32 editorIndex, Boolean rebuildOptimizedGUIBlock, System.Boolean& showImportedObjectBarNext, UnityEngine.Rect& importedObjectBarRect) (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:)
UnityEditor.DockArea:OnGUI()

测试代码review

https://github.com/zhaoqingqing/blog_samplecode/tree/master/technical-research/java-to-csharp

Java To CSharp源代码转换的更多相关文章

  1. Java页面中文编码要转换两次encodeURI

    1.js文件中使用encodeURI()方法. login_name = encodeURI(encodeURI(login_name)); 2.action中URLDecoder解码 loginNa ...

  2. Java 二进制与十六进制转换

    Java 二进制与十六进制转换 二进制转换十六进制 /** * @description 将二进制转换成16进制 * * @param buf * @return */ public static S ...

  3. java中汉字自动转换成拼音

    java中汉字自动转换成拼音 1.需要下载jar包 pinyin4j.2.5.0.jar ,加入到WEB-INF下的lib里边,右键add to bulid path. 2.[代码]PinYinUti ...

  4. Java对象和Excel转换工具XXL-EXCEL

    <Java对象和Excel转换工具XXL-EXCEL> 一.简介 1.1 概述 XXL-EXCEL 是一个灵活的Java对象和Excel文档相互转换的工具. 一行代码完成Java对象和Ex ...

  5. 简述Java变量和强制转换类型

    简述Java变量和强制转换类型 java变量 1. java变量 变量:顾名思义,就是在java执行程序过程中可以发生改变的量,就好比方程式中的未知数X一样. 变量的内存分配过程 int a ; // ...

  6. Java将ip字符串转换成整数的代码

    下面代码是关于Java将ip字符串转换成整数的代码,希望对各位有较大用途. public class IpUtil { public static int Ip2Int(String strIp){ ...

  7. Java数值类型之间转换

    Java之间的数值转换如图所示,实心箭头代表无数据丢失,虚线箭头代表可能丢失 例如:123456789是一个大的整数,包含的位数比float类型能够表达的位数多,但这个数转换为float类型时,将会得 ...

  8. Java基础-进制转换

    Java基础-进制转换 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Java 程序中常用的进制 1>.十进制,由“0123456789” 这10个数字组成,逢十进一: ...

  9. java,swift,oc互相转换,html5 web开发跨平台

    java,swift,oc互相转换,html5 web开发跨平台 写一个java->swift的程序,这个程序是做跨平台系统的核心部分swift和oc到java也在考虑之列Swift->J ...

随机推荐

  1. Notepad2替代系统自带的记事本

    事情是这样的,平时我经常把一些文字复制到记事本中编辑好了再复制到目标位置,可以在系统自带的记事本中替换删除一些内容,记事本小巧,占用很少的资源,我很喜欢:但今天复制的内容中有很多数字和一些我不想要的内 ...

  2. 1.C#WinForm基础制作简单计算器

    利用c#语言编写简单计算器: 核心知识点: MessageBox.Show(Convert.ToString(comboBox1.SelectedIndex));//下拉序号 MessageBox.S ...

  3. 8.JAVA之GUI编程键盘码查询器

    程序使用说明: 1.本程序由于是java代码编写,所以运行需安装jdk并配置好环境变量. 2. 复制java代码到记事本内,另存为Keyboard_events.java: 3.复制批处理代码到记事本 ...

  4. sqlserver 游标的使用

    declare @temp_temp uniqueidentifier--临时变量 DECLARE aaa CURSOR for select Id from A ------------------ ...

  5. 关系数据库SQL之可编程性触发器

    前言 前面关系数据库SQL之可编程性函数(用户自定义函数)一文提到关系型数据库提供了可编程性的函数.存储过程.事务.触发器及游标,前文已介绍了函数.存储过程.事务,本文来介绍一下触发器的使用.(还是以 ...

  6. ASP.NET MVC项目演练:用户登录

    ASP.NET MVC 基础入门 http://www.cnblogs.com/liunlls/p/aspnetmvc_gettingstarted.html 设置默认启动页面 public clas ...

  7. Web API项目中使用Area对业务进行分类管理

    在之前开发的很多Web API项目中,为了方便以及快速开发,往往把整个Web API的控制器放在基目录的Controllers目录中,但随着业务越来越复杂,这样Controllers目录中的文件就增加 ...

  8. SIMLock锁卡功能解析

    一.锁卡背景介绍 锁卡即SIMLock,当手机开机启动或者插入SIM卡时,手机modem侧预置在NV项中的配置信息会与SIM卡中的信息做比对,检测是否匹配.若匹配,则SIM卡可以正常使用.若不匹配,则 ...

  9. python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)

    一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...

  10. Mysql FROM_UNIXTIME效率 VS PHP date()效率 数据说话!

    这几天在做数据统计,有几个统计图的需求是这样的: 按照年.月.日统计订单数量, 比方一年12个月,统计出1月多少订单,二月多少订单,按照这种模式统计. 但是数据库里存放的是 timestamp  的  ...