Java To CSharp源代码转换
前言
开发环境
客户端: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
- 从git或官网下载ikvm,比如我下载的ikvm-7.2.4630.5.zip,并解压
- 拷贝ikvm-7.2.4630.5\bin\下的所有dll 到Unity的Assets\Plugins 下
- 拷贝Java转换出的dll,放到Assets\Plugins 下,比如我的hello.dll
- 在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源代码转换的更多相关文章
- Java页面中文编码要转换两次encodeURI
1.js文件中使用encodeURI()方法. login_name = encodeURI(encodeURI(login_name)); 2.action中URLDecoder解码 loginNa ...
- Java 二进制与十六进制转换
Java 二进制与十六进制转换 二进制转换十六进制 /** * @description 将二进制转换成16进制 * * @param buf * @return */ public static S ...
- java中汉字自动转换成拼音
java中汉字自动转换成拼音 1.需要下载jar包 pinyin4j.2.5.0.jar ,加入到WEB-INF下的lib里边,右键add to bulid path. 2.[代码]PinYinUti ...
- Java对象和Excel转换工具XXL-EXCEL
<Java对象和Excel转换工具XXL-EXCEL> 一.简介 1.1 概述 XXL-EXCEL 是一个灵活的Java对象和Excel文档相互转换的工具. 一行代码完成Java对象和Ex ...
- 简述Java变量和强制转换类型
简述Java变量和强制转换类型 java变量 1. java变量 变量:顾名思义,就是在java执行程序过程中可以发生改变的量,就好比方程式中的未知数X一样. 变量的内存分配过程 int a ; // ...
- Java将ip字符串转换成整数的代码
下面代码是关于Java将ip字符串转换成整数的代码,希望对各位有较大用途. public class IpUtil { public static int Ip2Int(String strIp){ ...
- Java数值类型之间转换
Java之间的数值转换如图所示,实心箭头代表无数据丢失,虚线箭头代表可能丢失 例如:123456789是一个大的整数,包含的位数比float类型能够表达的位数多,但这个数转换为float类型时,将会得 ...
- Java基础-进制转换
Java基础-进制转换 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Java 程序中常用的进制 1>.十进制,由“0123456789” 这10个数字组成,逢十进一: ...
- java,swift,oc互相转换,html5 web开发跨平台
java,swift,oc互相转换,html5 web开发跨平台 写一个java->swift的程序,这个程序是做跨平台系统的核心部分swift和oc到java也在考虑之列Swift->J ...
随机推荐
- 理清JavaScript正则表达式--上篇
在JavaScript中,正则表达式由RegExp对象表示.RegExp对象呢,又可以通过直接量和构造函数RegExp两种方式创建,分别如下: //直接量 var re = /pattern/[g | ...
- 记2016腾讯 TST 校招面试经历,电面、笔试写代码、技术面、hr面,共5轮
(出处:http://www.cnblogs.com/linguanh/) 前序: 距离 2016 腾讯 TST 校招面试结束已经5天了,3月27日至今,目前还在等待消息.从投简历到两轮电面,再到被 ...
- CSS3与页面布局学习总结(六)——CSS3新特性(阴影、动画、渐变、变形、伪元素等)
CSS3在CSS2.1的基础上新增加了许多属性,这里选择了较常用的一些功能与大家分享,帮助文档中有很详细的描述,可以在本文的示例中获得帮助文档. 一.阴影 1.1.文字阴影 text-shadow&l ...
- React.js深入学习详细解析
今天,继续深入学习react.js. 目录: 一.JSX介绍 二.React组件生命周期详解 三.属性.状态的含义和用法 四.React中事件的用法 五.组件的协同使用 六.React中的双向绑定 ...
- Java豆瓣电影爬虫——抓取电影详情和电影短评数据
一直想做个这样的爬虫:定制自己的种子,爬取想要的数据,做点力所能及的小分析.正好,这段时间宝宝出生,一边陪宝宝和宝妈,一边把自己做的这个豆瓣电影爬虫的数据采集部分跑起来.现在做一个概要的介绍和演示. ...
- android使用PullToRefresh实现上拉加载和下拉刷新效果
其实很早前就在博客园中也写过官方的下拉刷新控件SwipeRefreshLayout,但是这个控件仅仅支持下拉刷新,用起来还算可以.然而在我们实际开发应用中,很多地方都不止有下拉刷新,而且还有上拉加载的 ...
- CSS3属性 box-shadow 向框添加一个或多个阴影
CSS3属性 利用box-shadow制作网页页眉背景 box-shadow 浏览器支持 IE9+.Firefox 4.Chrome.Opera 以及 Safari 5.1.1 支持 box-shad ...
- iOS 编辑UITableView(根据iOS编程编写)
上个项目我们完成了 JXHomepwner 简单的应用展示,项目地址.本节我们需要在上节项目基础上,增加一些响应用户操作.包括添加,删除和移动表格. 编辑模式 UITableView 有一个名为 e ...
- shiro的使用2 灵活使用shiro的密码服务模块
shiro最闪亮的四大特征是认证,授权,加密,会话管理. 上一篇已经演示了如何使用shiro的授权模块,有了shiro这个利器,可以以统一的编码方式对用户的登入,登出,认证进行管理,相当的优雅. 为了 ...
- alias拦截器的使用
在SSH项目中,有时需要由一个Action跳转到另一个Action.有两种方式可以实现Action之间的跳转,一种是chain,另一种是redirectAction,这两种方式之间的区别是chain是 ...