原文: j2megame.org站长博客
最近配置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);