因为E6按键不够,所以做了以下尝试,结果还是失败了,希望以后能想到好的办法吧。 1.实验按键响应: E6侧面除了两个音量键外,还有3个音乐播放键,想看看着几个键能不能用上,于是进行J2ME环境下的试验,没想到,keyPressed根本就不理这几个按键,郁闷~~相当于没有用。 2.写外挂插到J2ME程序中: 既然不让用按键,触屏总能用吧,先写一个程序,它实现这样的功能: a.在屏幕上绘制出半透明的键盘。 b.用户点选键盘后,会调用Canvas的keyPressed函数,传递进相应的按键。模拟用户键盘输入。 程序很简单,放到E6上实测成功。(代码见后附录1) 下一步,就是把这个程序加到别人发的包里,看实际效果。 一般来说,用J2ME发布的程序都经过混淆,这样可以增加别人反编译后阅读源码的难度,并且可以减小程序包的大小,可正是这个混淆,非常麻烦。这里我拿GL的午夜台球做试验,解开包后,发现有5个class,其中c.class正是其Canvas的类,于是反编译之,把反编译得到的代码拷贝到Eclipse中,出现n条错误,原来,混淆器会把同种类的类型用最小的字母来顺序命名,比如有2个int变量,则它们会命名为a,b。可是如果有2个long变量,它们还是会命名为a,b。这样就麻烦了,因为在编辑环境下,这样的命名方式属于重复的,只能把它们改成不同的名称才能编译通过,因为本人比较懒,不愿意改动那10000多行的代码,所以这样直接在其Canvas中加入自己代码的方式就这么被否决了。 接着想这样:用自己写PlugCanvas继承别人的Canvas,并且在Paint中加入绘制键盘图形,在pointerPressed处理用户点击屏幕并模拟输出到别人程序的KeyPressed中。 进行试验,发现一般混淆后class都变成了final的,真郁闷,想直接继承还不行,必须修改class文件,研究发现,用UE打开class文件,查找0x31,在一些Import后的那个31就是modifier,把这个31改成21后,这个class就不是final了(附2:modifier的常量表) 事情还并没有结束,因为要在屏幕上绘制出键盘,就必须重构paint函数,可paint函数也被弄成了final的,又要改calss,这回没有上次那么简单,必须要找到对应的Method列表,找到paint函数,然后才能修改,一番研究之后发现,在class文件中查找0x11095e,把它改成0x01095e就可以把paint函数变成非final的了。(具体的方法可以参考class文件结构的文章http://java.chinaitlab.com/Jvm/24631.html) 本来,事情到这儿就应该完成了,所有文件都已经编译成功,可当我把class放到WTK下运行却无法运行,实在没辙了,等想到好的方法时再继续吧。 附1:import javax.microedition.lcdui.Canvas;import javax.microedition.lcdui.Graphics;import javax.microedition.lcdui.Image; /** * E6键盘插件 * * @author roye * */public class PluginCanvas extends Canvas { private int keyV; final int width = 240; final int height = 160; int[] colorData; int[][] mapKeyTable = { { 31, 32, 33 }, { 34, 35, 36 }, { 37, 38, 39 }, { 40, 30, 41 } }; char[] keyStr = { ‘1’, ‘2’, ‘3’,…
Read More Read More