关于E6Plugin的总结

关于E6Plugin的总结

因为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’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘*’, ‘0’,
   ‘#’ };

 public PluginCanvas() {
  setFullScreenMode(true);

  colorData = getARGBArray(alpha);
  // try {
  // for (int i = 160; i < 320; i++) {
  // for (int j = 0; j < width; j++) {
  // int v = getKey(j, i);
  // System.out.println("line " + i + " " + j + " " + v);
  // }
  // }
  // } catch (Exception e) {
  // System.out.println(e.toString());
  // }
 }

 protected void keyPressed(int key) {
  keyV = key;

  repaint();
 }

 protected void keyReleased(int key) {

 }

 protected void pointerDragged(int x, int y) {

 }

 protected void pointerPressed(int x, int y) {
  int v = getKey(x, y);
  if (v != -99) {
   keyPressed(v);
  }
 }

 protected void pointerReleased(int x, int y) {
  int v = getKey(x, y);
  if (v != -99) {
   keyReleased(v);
  }
 }

 public int getKey(int x, int y) {
  int tmpY = y – height;
  int rowNum = 0;
  int colNum = 0;
  if (tmpY % 40 >= 4 && tmpY % 40 <= 36) {
   rowNum = tmpY / 40;
  } else {
   return -99;
  }

  if (x % 80 >= 4 && x % 80 <= 76) {
   colNum = x / 80;
  } else {
   return -99;
  }

  return mapKeyTable[rowNum][colNum];
 }

 public int[] getARGBArray(int alpha) {
  Image bufferImage;
  bufferImage = Image.createImage(width, height);
  Graphics bg = bufferImage.getGraphics();
  int i, j;
  int x, y;

  bg.setColor(0);
  bg.fillRect(0, 0, bufferImage.getWidth(), bufferImage.getHeight());

  bg.setColor(0x21, 0x43, 0x99);
  for (i = 0; i < keyStr.length; i++) {
   x = (i % 3) * 80 + 4;
   y = (i / 3) * 40 + 4;

   bg.fillRect(x, y, 72, 32);
  }

  bg.setColor(0xbb1122);
  for (i = 0; i < keyStr.length; i++) {
   x = (i % 3) * 80 + 40;
   y = (i / 3) * 40 + 20;

   bg.drawChar(keyStr[i], x, y, Graphics.TOP | Graphics.HCENTER);
  }

  int[] bufferColorData = new int[width * height];
  bufferImage.getRGB(bufferColorData, 0, width, 0, 0, width, height);

  for (i = 0; i < height; i++) {
   for (j = 0; j < width; j++) {
    bufferColorData[i * width + j] = (bufferColorData[i * width + j] & 0x00ffffff)
      | (alpha << 24);
   }
  }

  return bufferColorData;
 }

 int alpha = 0x3f;

 public void paintKeyPad(Graphics g) {
  g.drawRGB(colorData, 0, width, 0, getHeight() – height, width, height,
    true);
 }

 public int getColor(int a, int r, int g, int b) {
  return b | g << 8 | r << 16 | a << 24;
 }

 protected void paint(Graphics g) {
  // TODO Auto-generated method stub
  g.setColor(0);
  g.fillRect(0, 0, getWidth(), getHeight());

  paintKeyPad(g);
  
  g.setColor(0xffffff);
  g.drawString("keyCode = " + keyV, 0, 0, 0);
 }

}

附2:
 
    public static final int PUBLIC           = 0x00000001;
    public static final int PRIVATE          = 0x00000002;
    public static final int PROTECTED        = 0x00000004;
    public static final int STATIC           = 0x00000008;  
    public static final int FINAL            = 0x00000010;
    public static final int SYNCHRONIZED     = 0x00000020; 
    public static final int VOLATILE         = 0x00000040;
    public static final int TRANSIENT        = 0x00000080; 
    public static final int NATIVE           = 0x00000100;  
    public static final int INTERFACE        = 0x00000200;  
    public static final int ABSTRACT         = 0x00000400;
    public static final int STRICT           = 0x00000800;

One thought on “关于E6Plugin的总结

  1. wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling
    wow power leveling -229594334254112

Leave a Reply

Your email address will not be published. Required fields are marked *