将java库转换为.net库

简介:

【转载请注明出处】

 

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

 

工具:

IKVM――把java bytecode 转换成IL程序,并提供大部分J2SE 1.4类的.net实现(IKVM.GNU.Classpath.dll

winrar――提取jar,打包jar

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

反编译工具(可选)――没源代码时用,主要也是浏览类与类之间的关系,java反编译我用的是DJ Java Decompiler.netReflector

 

原理:

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

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

 

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格式,把后缀改成jarOK

 

例子:转换Geotoolsmain模块

下面以Geotoolsmain模块为例,说明怎样将jar文件转换为IL文件。

geotools是有10年历史的GIS中间件。其main模块有1000多个类,源代码文件大小合计9.74Mjar文件名为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.jarjai_codec.jar, jai_core.jar, JTS-1.4.jar, vecmath-1.3.jarxalan-2.5.1.jaropengis-legacy-0.1.jar, units-0.01.jar都转换成了dllmailapi-1.3.jarbatik*.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.CoordinateTransformationorg.geotools.renderer.lite.InternalTranscoderorg.geotools.data.DataTestCase这三个类没转换成功,其中org.geotools.data.DataTestCase是测试用的,可以不管,剩下两个类要用到batik中的类,可以按照上述思路把batik转换为dll,也可重写这两个类――剩下的1000个类,已经全部转换成功,可以在.net平台上用了。

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

   jar2dll_result1.jpg

jar2dll_result2.jpg


说明:

1rt.jarsun.*;com.*命名空间中的类,IKVM.GNU.Classpath.dll都没有

2,进行.net开发时需要引用IKVM.GNU.Classpath.dll

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

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

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

本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2005/10/10/251724.html如需转载请自行联系原作者


xiaotie 集异璧实验室(GEBLAB)

相关文章
|
20天前
|
Unix Linux C#
增强用户体验:2个功能强大的.NET控制台应用帮助库
增强用户体验:2个功能强大的.NET控制台应用帮助库
|
10天前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
2月前
|
网络协议 Java Apache
【Java】已解决java.net.HttpRetryException异常
【Java】已解决java.net.HttpRetryException异常
43 0
|
2月前
|
网络协议 Java
【Java】已解决java.net.UnknownHostException异常
【Java】已解决java.net.UnknownHostException异常
324 0
|
2天前
|
算法 Java 测试技术
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
|
17天前
|
安全 Java
Java模拟生产者-消费者问题。生产者不断的往仓库中存放产品,消费者从仓库中消费产品。其中生产者和消费者都可以有若干个。在这里,生产者是一个线程,消费者是一个线程。仓库容量有限,只有库满时生产者不能存
该博客文章通过Java代码示例演示了生产者-消费者问题,其中生产者在仓库未满时生产产品,消费者在仓库有产品时消费产品,通过同步机制确保多线程环境下的线程安全和有效通信。
|
2天前
|
安全 Java API
Java 8 流库的魔法革命:Filter、Map、FlatMap 和 Optional 如何颠覆编程世界!
【8月更文挑战第29天】Java 8 的 Stream API 通过 Filter、Map、FlatMap 和 Optional 等操作,提供了高效、简洁的数据集合处理方式。Filter 用于筛选符合条件的元素;Map 对元素进行转换;FlatMap 将多个流扁平化合并;Optional 安全处理空值。这些操作结合使用,能够显著提升代码的可读性和简洁性,使数据处理更为高效和便捷。
10 0
|
28天前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
很多文章都介绍了FTPClient如何连接ftp服务器,但却很少有人说如何连接一台开了SSL认证的ftp服务器,现在代码来了。
61 2
|
7天前
|
Java 开发工具 Spring
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
|
2月前
|
开发框架 安全 Java
.net和java有什么样的区别?
Java和.NET在本质、编程语言、生态系统与工具、跨平台性、应用领域、性能与效率以及安全性与可靠性等方面都存在明显的区别。选择哪个平台取决于具体的需求、技术栈和目标平台。
120 7
下一篇
云函数