Antenna生成JAD和MANIFEST.MF中文乱码一种解决方法(UTF-8)

作者:Wupei  |  发表时间:  |  所属分类:J2ME

注意: 本文章针对antenna-src-1.0.2.zip, 请查看antenna是否有最新版本

最近配置Antenna成功了,也可以正常使用了

但是在给真正的J2ME游戏打包时,就发现问题了,如果让 MIDlet-Name 使用中文的话,就会生成JAD乱码…

查过文档以后,发现生成JAD时可以使用 encoding 属性, OK, 添加上 encoding="UTF-8" ,打包….依然有问题…生成的 JAD 依然不是 UTF-8 格式

然后没有办法,只有查看 Antenna 源代码了.. 下载 Antenna的src 

http://sourceforge.net/project/showfiles.php?group_id=67420 

看一下源代码,OK,关系到乱码的3个Java文件

de.pleumann.antenna.misc.JadFile.java  A simple class to access the contents of a JAD file(就是保存JAD文件内容的封装类,而且MANIFEST.MF文件也用这个生成的) — 这个文件没有问题,参数也都是有的

de.pleumann.antenna.WtkJad.java (是生成JAD的类封装,与wtkjad的XML的命令相对应) — 这个文件也是OK的,参数都使用了 encoding

de.pleumann.antenna.WtkPackage (是打包的类封装,与wtkpackage的XML的命令相对应) — 这个文件大有问题,因为传的参 encoding 都是 null 

说明: execute() 函数,为后两个类的的执行函数 

恩,找到问题了,就好解决了,开始修改吧, 把类似以下语句都修改了

jad.load(jadFile.getAbsolutePath(), null); 
//或
man.save(manFile, null);

修改为:

jad.load(jadFile.getAbsolutePath(), "UTF-8"); 
//或
man.save(manFile, "UTF-8");

这样存取都为UTF-8格式了 

恩,可以了,关闭eclipse,重新编译打包,覆盖原来添加到Eclipse中的 antenna-bin-1.0.2.jar ,恩,呵呵,这就是你自己的 antenna 版本

重新打开eclipse,重新执行,执行后发现,JAD没问题了,但是…..MANIFEST.MF从JAR拿出来后,用记事本观看…还是乱码….

经过我的检测(其实就是把.MF存出来),发现 MANIFEST.MF 其实是没问题的,UTF-8没问题,也不乱码,但是经过 Ant 中的 打包函数 后, 加入到JAR包中,UTF-8格式没变,但是中文内容乱码了…..

在Antenna的src中的语句为:

super.execute();

就是这句造成了乱码,因为是 Ant 1.7.0 运行库中的东西….我没有能力修改… 

传说好像是 Ant 的 BUG….

6月15日更新: MANIFEST.MF中文乱码完美解决了! 添加 wtkpackage 字段 keepManifestOrder=”true” 就OK,很简单吧…

查看一下Antenna源代码,才知道,实际上,运行 keepManifestOrder 语句之前, Ant 已经把 MF 文件打到 JAR 包中了(这一MF是乱码状态),而这一语句,使刚才生成的 MF 文件,重新写入 JAR (这一个是Antenna实现的),所以就不乱码咯,哈哈,但是有一个tmp目录没有清空,这是因为 manF流 没有关闭的原因,这个没啥关系的,修改一下代码,见最后
注: 看了代码才知道,可以这样更新 MF 文件啊,哈哈,强大!

来看一下修改的XML片段:

<wtkpackage jarfile="${dir.output.deployed}\${jar.filename}.jar" 
	jadfile="${dir.output.deployed}\${jad.filename}.jad" 
	obfuscate="${wtk.obfuscate}" preverify="true"
	classpath="${dir.classpath}" keepManifestOrder="true">

	<fileset dir="${dir.output.classes}" />
</wtkpackage>

 

 

以下说的皆是P话…..但是为了保留思路,大家可以考虑一下哦…就当是思路拓展了,呵呵

—————————————以下已删除——————————————-

没办法,只能另寻途径,一开始想直接用JAR命令,直接更新 MANIFEST.MF ,但是我最终未实验成功….(或许你会成功…因为我还没学会呢…)

注意: 本方法使用以后JAD的 MIDlet-Jar-Size 字段,就不正确了….待解决

我用了一种办法,是使用 WinRAR 中的命令行,进行 MANIFEST.MF 的替换

1. 修改 de.pleumann.antenna.WtkPackage 文件,使得其在运行过程中导出(存储)一个 MANIFEST.MF

在execute()函数末尾添加语句:  

final String myMf = "build/MANIFEST.MF"; //存到你喜欢的位置
try {
	man.save(myMf, "UTF-8");
	System.out.println("myMf: build/MANIFEST.MF create.");
} catch (IOException e) {
	System.out.println("build/MANIFEST.MF create error.");
}

我存储到了 Build 文件夹下,这样就可以使用 WINRAR 将其打包到 JAR 中

修改相应的XML文件(前一篇文章有相关的XML):

<!-- 因为命令行不支持带空格的命令,所以如果WINRAR路径中有空格,要加引号 -->
<property name="winrar.home" value="C:\Program\WinRAR" />
<!-- 用winrar 更新 MF 文件 -->
<exec dir="${dir.output}" executable="cmd.exe" os="Windows XP" >
	<arg line="/c ${winrar.home}\WinRAR.exe A -apMETA-INF ${dir.output.deployed}\${jar.filename}.jar MANIFEST.MF"/>
</exec>

当然这种办法,连我都不是很喜欢….但是我没办法…这个也不具有通用性…如果你知道更方便,更通用的方法,告诉我一声啊,谢了

将WINRAR的注释去掉即可….记得修改你生成 MANIFEST.MF 路径

—————————————以上已删除—————————————

 

 

这样就OK了,哈哈,终于完美解决乱码问题啦…..可以继续自己的工作了

XML文件的文章:  《Eclipse与Antenna整合开发J2ME程序》

 

关于tmp文件夹没有删除的小BUG的代码修改:

//de.pleumann.antenna.WtkPackage.java文件
//void addManifest(File tmpDir, File manFile)函数
//(大约在325行)
manF.close(); //添加
jos.flush();
jos.close();
utility.delete(jarFile);
utility.copy(tmp, jarFile);

Trackback from your site.

(15)条评论

  • Wupei

    |

    抱歉,看到晚了,邮件已发,请查收

    回复

  • 80boy

    |

    我的打包方法是用批处理调用Build.xml,可怎么修改都不支持中文。楼主能不能告诉我如何才能让JAD和MANIFEST.MF里面的MIDlet-Vendor属性显示中文。在此感谢LZ了。我的邮箱是80beijing08@163.com

    回复

  • Wupei

    |

    已发出,请查收

    回复

  • man

    |

    楼主,给我发个改好的antenna包,可以不?我的邮箱是wlj-6@163.com,谢谢了

    回复

  • wupei

    |

    已发出,请查收

    回复

  • jme

    |

    可以发一个改好了的antenna-bin-1.jar给我吗?谢谢! wangcai128@163.com

    回复

  • 网络电话

    |

    哈哈,现在看了终于明白了~ 谢谢啦

    回复

  • wupei

    |

    恩,谢谢,我以前用的是1.0.2版本..因为生成JAD的不是硬编码,生成MF文件的是硬编码啊…所以只有改咯
    可能是他已经修复了吧
    最新版本是 Antenna 1.1.0-beta, 可以试一下

    回复

  • Banny

    |

    JadFile.java中把save跟load方法的第一行加encoding=”UTF-8″;
    另外wtkpackage这个Task支持manifestencoding的属性,这属性是从jar这个Task继承下来的,所以只要改一下wtkpackage加上manifestencoding=”UTF-8″

    回复

  • Wupei

    |

    OK.明天晚上给你发…现在在家呢..没带笔记本..

    回复

  • gamesday

    |

    我在wtkbuild时,加上编码格式.
    编码格式要跟源代码的一模一样.一般来说是GBK的.
    加上之后乱码问题就解决了…
    但是里面的MF显示是乱码.其实与是UTF-8的.不影响运行.
    现在问题是那MF临时文件去不掉…..看着真烦!!!!!!!!!!!!!!!!!!!
    楼主能不能发份你改好了的源码及jar到我邮箱吗?
    zzq130@163.com

    回复

  • Wupei

    |

    🙂 呵呵..好久sourceforge.net都上不去了..听说是被和谐了…用代理服务器上吧…
    我记得那时候弄的时候怎么也弄不好啊….
    我记得加上编码格式….乱码问题还是没有解决…而且里面的MF一直没有好啊…

    回复

  • gamesday

    |

    中文乱码,实际上没那么复杂.不需要改源码.
     在编译时.加上编码格式就行…注意也源代码的格式一致就行了

    回复

  • gamesday

    |

    楼主真强啊.
    我这两天也在搞antenna.发现也有这个乱码问题.在网上搜到你的贴子.可是我进不了官网.下不到源码!
    楼主能不能传一份源码给我.或者传一个改好了的antenna-bin-1.0.2.jar给我.
    多谢了!

    回复

请在这里留言: