Antenna生成JAD和MANIFEST.MF中文乱码一种解决方法(UTF-8)
注意: 本文章针对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()函数末尾添加语句:
- try {
- man.save(myMf, "UTF-8");
- }
我存储到了 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);
Re: Banny
恩,谢谢,我以前用的是1.0.2版本..因为生成JAD的不是硬编码,生成MF文件的是硬编码啊...所以只有改咯
可能是他已经修复了吧
最新版本是 Antenna 1.1.0-beta, 可以试一下
完美解法
JadFile.java中把save跟load方法的第一行加encoding="UTF-8";
另外wtkpackage这个Task支持manifestencoding的属性,这属性是从jar这个Task继承下来的,所以只要改一下wtkpackage加上manifestencoding="UTF-8"
Re: gamesday
OK.明天晚上给你发...现在在家呢..没带笔记本..
tem问题
我在wtkbuild时,加上编码格式.
编码格式要跟源代码的一模一样.一般来说是GBK的.
加上之后乱码问题就解决了...
但是里面的MF显示是乱码.其实与是UTF-8的.不影响运行.
现在问题是那MF临时文件去不掉.....看着真烦!!!!!!!!!!!!!!!!!!!
楼主能不能发份你改好了的源码及jar到我邮箱吗?
zzq130@163.com
Re: gamesday
:) 呵呵..好久sourceforge.net都上不去了..听说是被和谐了...用代理服务器上吧...
我记得那时候弄的时候怎么也弄不好啊....
我记得加上编码格式....乱码问题还是没有解决...而且里面的MF一直没有好啊...
问题已解决
中文乱码,实际上没那么复杂.不需要改源码.
在编译时.加上编码格式就行...注意也源代码的格式一致就行了
邮箱
忘了留邮箱:
zzq130@163.com
多谢了
很强
楼主真强啊.
我这两天也在搞antenna.发现也有这个乱码问题.在网上搜到你的贴子.可是我进不了官网.下不到源码!
楼主能不能传一份源码给我.或者传一个改好了的antenna-bin-1.0.2.jar给我.
多谢了!





