Antenna生成JAD和MANIFEST.MF中文乱码解决

原文: 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() 函数,为后两个类的的执行函数 

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

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

修改为:

  1. jad.load(jadFile.getAbsolutePath(), "UTF-8");
  2. //或
  3. 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中的语句为:

  1. 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片段:

  1. <wtkpackage jarfile="${dir.output.deployed}\${jar.filename}.jar"
  2.         jadfile="${dir.output.deployed}\${jad.filename}.jad"
  3.         obfuscate="${wtk.obfuscate}" preverify="true"
  4.         classpath="${dir.classpath}" keepManifestOrder="true">
  5.  
  6.         <fileset dir="${dir.output.classes}" />
  7. </wtkpackage>

 

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

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

 

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

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