将java库转换为.net库

本文介绍如何使用ikvm工具将Java程序及其依赖的类库转换为.NET平台上的DLL文件,包括解决依赖问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


======================================================
注:本文源代码点此下载
======================================================

【转载请注明出处】

动机:

充分利用java阵营众多的类库

工具:

ikvm――把java bytecode 转换成il程序,并提供大部分j2se 1.4类的.net实现(ikvm.gnu.classpath.dll)

winrar――提取jar,打包jar

java ide(可选)――阅读源代码,浏览类之间的关系,我用的是eclipse

反编译工具(可选)――没源代码时用,主要也是浏览类与类之间的关系,java反编译我用的是dj java decompiler,.net用reflector。

原理:

java也好,.net也好,其执行无非就是运行时 + 库,把java汇编指令一条一条转换为il汇编指令,就可以实现java程序到.net程序的转换――你可以通过最纯正的.net使用方式来使用这些类库/程序。ikvm实现的就是这样一个功能。

如果一个java程序调用一大堆java类库,那么必须把这些程序和类库全部转换成.net的il格式,这个程序才能执行。

ikvm安装:

从www.ikvm.net上下载ikvm,解压缩后就能开始用。

将jar转换为dll:

运行:ikvmc -target:library ××××.jar

会将jar文件自动转换为 ××××.dll

但是,如果jar中引用的类不存在于××××.jar,也不存在于ikvm.gnu.classpath.dll之中,则会给出警告信息,该类也不会转换。这时,需要引用缺少的类所在的dll,格式如下:

ikvmc -target:library -reference:lib1.dll -reference:lib2.dll -reference:lib3.dll jar1.jar

jar的提取:

jar可以用winrar打开,把你想要的目录或类解压缩。

把java class文件打包为jar:

把目录压缩成zip格式,把后缀改成jar,ok。

例子:转换geotools的main模块

下面以geotools的main模块为例,说明怎样将jar文件转换为il文件。

geotools是有10年历史的gis中间件。其main模块有1000多个类,源代码文件大小合计9.74m。jar文件名为gt2-main.jar,2.34m.

步骤1:分析main模块依赖的类库,分析类库间的依赖关系

geotools-main依赖的类库有:

rt.jar――java的主要的lib

geoapi.jar――opengis一帮人定义的标准geoapi

jai_codec.jar, jai_core.jar,――java 2d api

jts-1.4.jar,――java 拓扑套件,主要用于拓扑分析,可能依赖

vecmath-1.3.jar――vector数学库

xalan-2.5.1.jar――xml 转换lib

opengis-legacy-0.1.jar,――忘了干什么的,反正和gis有关

units-0.01.jar――不知道是什么

batik*.jar――svg lib

mailapi-1.3.jar

步骤2:转换类库

先转换那些没依赖的库,比如vecmath-1.3.jar,......

运行:

ikvmc -target:library vecmath-1.3.jar

结果:

note: output file is "vecmath-1.3.dll"

note: automatically adding reference to "f:\ikvm-0.20.0.0\ikvm\bin\ikvm.gnu.classpath.dll"

成功转换成vecmath-1.3.dll。

如果碰上了依赖的库没转换,比如运行:

ikvmc -target:library jai_codec.jar

结果提示有些类找不到:

note: output file is "jai_codec.dll"

note: automatically adding reference to "f:\ikvm-0.20.0.0\ikvm\bin\ikvm.gnu.classpath.dll"

warning: class "com.sun.image.codec.jpeg.jpegcodec" not found

warning: class "com.sun.image.codec.jpeg.jpegencodeparam" not found

warning: class "com.sun.image.codec.jpeg.jpegimageencoder" not found

warning: class "com.sun.image.codec.jpeg.jpegdecodeparam" not found

warning: class "com.sun.image.codec.jpeg.jpegimagedecoder" not found

warning: class "com.sun.image.codec.jpeg.imageformatexception" not found

warning: class "com.sun.image.codec.jpeg.jpegqtable" not found

warning: class "sun.security.action.getpropertyaction" not found

因此对于有依赖关系的库,需要从最下面那个,大家都依靠它的那个库转换起。在这里就是rt.jar。

运行:

ikvmc -target:library rt.jar

惨!!!ikvm弹出错误窗口――不是我无能,是rt.jar太狡猾!

怎么办?需要从rt.jar中找出所需要的类,将这些类转换就行了。

用winrar找出需要的类,比如jai_codec需要com.sun.image.codec.jpeg.jpegcodec,....等8个类,就从rt.jar中找出这些类出来。注意,这些类可能还依赖于别的类,依赖的类也需要找出来,全部打包成一个新的jar,如little_rt.jar。如果有些类在ikvm.gnu.classpath.dll中已经有了,可以不用提取。

最惨的情况可能是1个类依赖2个类,2个类又依赖8个类,然后又依赖更多的类,这种情况下与其要把这些类提取出来,不如更改这个类,把对外依赖的东东都去掉,全部return null, return 0什么的。先转换成功,然后再用.net把这个类重写就行了。幸运的是这里没碰见这情况。

用把little_rt.jar转换为little_rt.dll,然后运行:

ikvmc -target:library -reference:little_rt.dll jai_codec.jar

ok!成功!

这样继续一个jar一个jar的转换,这些jar会依赖rt.jar中更多的类,需要都提取出来,放在little_rt.jar中,再转换为little_rt.dll。

就这样把geoapi.jar,jai_codec.jar, jai_core.jar, jts-1.4.jar, vecmath-1.3.jar,xalan-2.5.1.jar,opengis-legacy-0.1.jar, units-0.01.jar都转换成了dll。mailapi-1.3.jar和batik*.jar没转换。这两个直接转换都没成功,batik*.jar是一系列jar,之间的关系比较复杂我也搞不清。凭我对geotools的了解, main模块里基本没用到mail,而svg是以插件形式提供的,在这里用的也不多。那就不管这两个,来转换gt2-main.jar先。

运行:

ikvmc -target:library -reference:jai_codec.dll-reference:geoapi.dll -reference:xalan-2.5.1.dll -reference:jts-1.4.dll -reference:vecmath-1.3.dll -reference:units-0.01.dll -reference:opengis-legacy-0.1.dll -reference:little_rt.dll -reference:jai_core.dll gt2-main.jar

结果:

note: output file is "gt2-main.dll"

note: automatically adding reference to "f:\ikvm-0.20.0.0\ikvm\bin\ikvm.gnu.classpath.dll"

warning: class "org.geotools.ct.coordinatetransformation" not found

warning: unable to compile class "org.geotools.renderer.lite.internaltranscoder"

(missing class "org.apache.batik.transcoder.image.imagetranscoder")

warning: class "javax.swing.text.defaultformatterfactory" not found

warning: unable to compile class "org.geotools.ct.coordinatetransformation$inverse"

(missing class "org.geotools.ct.coordinatetransformation")

warning: class "org.geotools.renderer.style.internaltranscoder" not found

warning: class "org.apache.batik.transcoder.transcoderinput" not found

warning: class "org.apache.batik.transcoder.svgabstracttranscoder" not found

warning: class "org.apache.batik.transcoder.transcodinghints$key" not found

warning: class "org.apache.batik.transcoder.transcoderoutput" not found

warning: class "org.apache.batik.transcoder.transcodinghints" not found

warning: class "org.geotools.renderer.lite.internaltranscoder" not found

warning: unable to compile class "org.geotools.data.datatestcase"

(missing class "junit.framework.testcase")

warning: class "javax.mail.session" not found

warning: class "javax.mail.internet.internetaddress" not found

warning: class "javax.mail.address" not found

warning: class "javax.mail.internet.mimemessage" not found

warning: class "javax.mail.message" not found

warning: class "javax.mail.message$recipienttype" not found

warning: class "javax.mail.transport" not found

warning: class "javax.mail.messagingexception" not found

warning: class "javax.mail.internet.addressexception" not found

可以看见只有org.geotools.ct.coordinatetransformation,org.geotools.renderer.lite.internaltranscoder,org.geotools.data.datatestcase这三个类没转换成功,其中org.geotools.data.datatestcase是测试用的,可以不管,剩下两个类要用到batik中的类,可以按照上述思路把batik转换为dll,也可重写这两个类――剩下的1000个类,已经全部转换成功,可以在.net平台上用了。

检验结果:用reflector打开gt2-main.dll

说明:

1,rt.jar中sun.*;com.*命名空间中的类,ikvm.gnu.classpath.dll都没有

2,进行.net开发时需要引用ikvm.gnu.classpath.dll

3,ikvm的jar->dll转换可能存在bug,最好把test case也全部转换过来,测试测试

4,ikvm的jar->dll转换可能存在性能问题,需要时可进行重构

5,有少量java 语法产生的指令不能直接转换,会报错。这是极少量的,我转换了好几m的东西了,只报了2处这种错。这时候可能需要改动改动java源代码

作者:xiaotie , 集异璧实验室(geblab)

出处:http://www.cnblogs.com/xiaotie/

若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

绿色通道:好文要顶关注我收藏该文与我联系


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值