Category Archives: Java

[转]SMALI文件语法

来源地址:http://bbs.pediy.com/showthread.php?t=151769

参考资料:http://code.google.com/p/smali/wiki/Registers

dalvik字节码有两种类型,原始类型和引用类型。对象和数组是引用类型,其它都是原始类型。
V void,只能用于返回值类型
Z boolean
B byte
S short
C char
I int
J long(64位)
F float
D double(64位)
对象以Lpackage/name/ObjectName;的形式表示。前面的L表示这是一个对象类型,package/name/是该对象所在的 包,ObjectName是对象的名字,“;”表示对象名称的结束。相当于java中的package.name.ObjectName。例 如:Ljava/lang/String;相当于java.lang.String

数组的表示形式
 [I——表示一个整型一维数组,相当于java中的int[]。
 对于多维数组,只要增加[就行了。[[I相当于int[][],[[[I相当于int[][][]。注意每一维的最多255个。
 对象数组的表示:[Ljava/lang/String;表示一个String对象数组。
方法
表示形式:Lpackage/name/ObjectName;->MethodName(III)Z
 Lpackage/name/ObjectName;表示类型,MethodName是方法名。III为参数(在此是3个整型参数),Z是返回类型(bool型)。
 方法的参数是一个接一个的,中间没有隔开。
一个更复杂的例子:
method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
在java中则为:
String method(int, int[][], int, String, Object[])
字段
表示形式:
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;
即包名,字段名和各字段类型。
寄存器
在dalvik字节码中,寄存器都是32位的,能够支持任何类型。64位类型(Long和Double型)用2个寄存器表示。
有两种方式指定一个方法中有多少寄存器是可用的。.registers指令指定了方法中寄存器的总数。.locals指令表明了方法中非参寄存器的数量。
方法的传参
 当一个方法被调用的时候,方法的参数被置于最后N个寄存器中。如果一个方法有2个参数,5个寄存器(v0-v4),那么参数将置于最后2个寄存器——v3和v4。
 非静态方法中的第一个参数总是调用该方法的对象。
例如,非静态方法LMyObject;->callMe(II)V有2个整型参数,另外还有一个隐含的LMyObject;参数,所以总共有3个参 数。假如在该方法中指定了5个寄存器(v0-v4),以.registers方式指定5个或以.locals方式指定2个(即2个local寄存器+3个 参数寄存器)。当该方法被调用的时候,调用该方法的对象(即this引用)存放在v2中,第一个整型参数存放在v3中,第二个整型参数存放在v4中。
对于静态方法除了没有隐含的this参数外其它都一样。
寄存器的命名方式
有两种方式——V命名方式和P命名方式。P命名方式中的第一个寄存器就是方法中的第一个参数寄存器。在下表中我们用这两种命名方式来表示上一个例子中有5个寄存器和3个参数的方法。
v0 第一个local register
v1 第二个local register
v2 p0 第一个parameter register
v3 p1 第二个parameter register
v4 p2 第三个parameter register
你可以用任何一种方式来引用参数寄存器——他们没有任何差别。
注意:baksmali默认对参数寄存器使用P命名方式。如果想使用V命名方式,可以使用-pl—no-parameter-registers选项。
使用P命名方式是为了防止以后如果要在方法中增加寄存器,需要对参数寄存器重新进行编号的缺点。
Long/Double值
Long和double类型是64位的,需要2个寄存器(切记切记)。
例如,对于非静态方法LMyObject;->MyMethod(IJZ)V,参数分别是LMyObject;,int,long,bool。故该方法需要5个寄存器来存储参数。

p0 this
p1 I
p2,p3 J
p4 Z

补充:
# static fields             定义静态变量的标记
# instance fields        定义实例变量的标记
# direct methods       定义静态方法的标记
# virtual methods      定义非静态方法的标记
构造函数的返回类型为V,名字为<init>。

if-eq p1, v0, :cond_8 表示如果p1和v0相等,则执行cond_8的流程:
:cond_8
invoke-direct {p0}, Lcom/paul/test/a;->d()V
调用com.paul.test.a的d()方法
if-ne p1, v0, :cond_b 表示不相等则执行cond_b的流程:
:cond_b
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V
invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z
move-result v0

大概意思就是调用com.paul.test.a的setPressed方法,然后再调用父类View的onKeyUp方法,最后 return v0

 

举两个例子:
sget-object v5, Lcom/google/youngandroid/runtime;->Lit227:Lgnu/mapping/SimpleSymbol;
获取com.google.youngandroid.runtime中的Lit227字段存入v5寄存器,相当于
gnu.mapping.SimpleSymbol localVariable = com.google.youngandroid.runtime.Lit227;

sput-object v0, Lcom/google/youngandroid/runtime;->Lit78:Lkawa/lang/SyntaxTemplate;
Likewise, this is setting the value of a static field. i.e.
设置com.google.youngandroid.runtime.Lit78的值为v0寄存器中的 kawa.lang.SyntaxTemplate类型变量的值。相当于 com.google.youngandroid.runtime.Lit78 = kawa.lang.SyntaxTemplate localVariable;

 

Read: 1038

【转】编程语言/JAVA 转 Netbeans 5.5 界面英文问题解决

Netbeans 5.5 界面英文问题解决

从昨晚搞到现在。Netbeans的界面语言问题终于解决了。

问题:从官网下载的netbeans不论是中文版还是英文版默认的操作界面都是中文,并且字体十分恶心。

目标效果:把界面语言改成英文并使系统正常支持中文。

解决办法:

进入netbeans-5.5etc ,其中netbeans-5.5为netbeans的安装路径。
编辑netbeans.conf
将其中的#command line switchs下面那行变为:
netbeans_default_options="-J-Xms128m -J-Xmx256m -J-XX:PermSize=32m -J-XX:MaxPermSize=160m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Duser.language=zh -J-Duser.country=US --fontsize 13"

说明:

关于前面几个参数的解释可以参照netbeans的guide:

http://www.netbeans.org/kb/55/using-netbeans/configuring.html#pgfId-1158626

后面的几个参数-J-Duser.language=zh -J-Duser.country=US --fontsize 13是调用java的本身系统属性,设置语言为中文,国家为美国。这点很重要!

国家是美国使netbeans的界面为英文,而语言为中文使netbeans可以支持中文,如果只需要英文则可以把language设为en,不过在调用file browser的时候会发现左边一系列windows特性的中文按钮都回变成乱码。

在netbeans的toolsoptionsfonts&colorssyntax下的language选项设置all languages的default的字体为一个能够支持中文的字体,如:Microsoft YaHei

Read: 818

[转]使用线程创建的三种方式实现j2me联网功能

src: http://www.javaeye.com/topic/420224

在j2me联网时,在eclipse控制台下有一个警告:“若要避免潜在的死锁,应该在commandAction()处理程序之外的其他线程中执行可能 会阻塞的,操作(如网络连接)。
为了避免潜在的死锁,我们经常把把联网的代码部分写到一个线程中去执行。
而实际应用中,网络连接的事务也都是使用一个单独的线程进行的。

线程的创建可以使用Runnable接口来实现,也可以使用Thread类实现,还可以以匿名内部类的方式创建。在本文中,分别用这三种方式给出 了j2me联网的例子。
代码均测试通过。可以直接使用。
1.通过继承Thread类创建

Java 代码
  1. /**  
  2. * 测 试Thread类线程  
  3. * @author mfcai  
  4. */   
  5.   import java.io.BufferedReader;  
  6. import java.io.IOException;  
  7. import java.io.InputStreamReader;  
  8. import java.io.Reader;  
  9. import java.net.HttpURLConnection;  
  10. import java.net.MalformedURLException;  
  11. import java.net.URL;  
  12.   
  13. public class OpenConn implements Runnable {  
  14.     private HttpURLConnection conn;  
  15.     private URL url;  
  16.   
  17.     // Thread thread1;  
  18.   
  19.     public OpenConn(String url) throws MalformedURLException {  
  20.         this.url = new URL(url);  
  21.     }  
  22.   
  23.     public void run() {  
  24.         try {  
  25.             conn = (HttpURLConnection) url.openConnection();  
  26.         } catch (IOException e) {  
  27.             e.printStackTrace();  
  28.             url = null;  
  29.         }  
  30.     }  
  31.   
  32.     public HttpURLConnection getConn() {  
  33.         return conn;  
  34.     }  
  35.   
  36.     public static void main(String[] args) throws Exception {  
  37.         // 创建Runnable类  
  38.         OpenConn openConn = new OpenConn("http://www.google.com");  
  39.         // 创建线程  
  40.         Thread thread = new Thread(openConn);  
  41.         // openConn.thread1=thread;  
  42.         thread.start();  
  43.         thread.join(10000);// wait 10 seconds  
  44.         HttpURLConnection c = openConn.getConn();  
  45.         if (c != null) {  
  46.             System.out.println("连接网络成功...");  
  47.             BufferedReader r = new BufferedReader(new InputStreamReader(c  
  48.                     .getInputStream()));  
  49.             String s = r.readLine();  
  50.             while (s != null) {  
  51.                 System.out.println(s);  
  52.                 s = r.readLine();  
  53.             }  
  54.         } else {  
  55.             System.out.println("超时错误,连接网络失败...");  
  56.         }  
  57.     }  
  58. }  
/**  * 测试Thread类线程  * @author mfcai  */    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL;  public class OpenConn implements Runnable {  private HttpURLConnection conn;  private URL url;   // Thread thread1;   public OpenConn(String url) throws MalformedURLException {   this.url = new URL(url);  }   public void run() {   try {    conn = (HttpURLConnection) url.openConnection();   } catch (IOException e) {    e.printStackTrace();    url = null;   }  }   public HttpURLConnection getConn() {   return conn;  }   public static void main(String[] args) throws Exception {   // 创建Runnable类   OpenConn openConn = new OpenConn("http://www.google.com");   // 创建线程   Thread thread = new Thread(openConn);   // openConn.thread1=thread;   thread.start();   thread.join(10000);// wait 10 seconds   HttpURLConnection c = openConn.getConn();   if (c != null) {    System.out.println("连接网络成功...");    BufferedReader r = new BufferedReader(new InputStreamReader(c      .getInputStream()));    String s = r.readLine();    while (s != null) {     System.out.println(s);     s = r.readLine();    }   } else {    System.out.println("超时错误,连接网络失败...");   }  } }

2.通过引用Runnable接口创建

Java 代码
  1. /**  
  2. * 测 试Runnable接口线程  
  3. * @author mfcai  
  4. */   
  5. import java.io.BufferedReader;  
  6. import java.io.IOException;  
  7. import java.io.InputStreamReader;  
  8. import java.io.Reader;  
  9. import java.net.HttpURLConnection;  
  10. import java.net.MalformedURLException;  
  11. import java.net.URL;  
  12.   
  13. public class OpenConn2 extends Thread {  
  14.     private HttpURLConnection conn;  
  15.     private URL url;  
  16.   
  17.     public OpenConn2(String url) throws MalformedURLException {  
  18.         this.url = new URL(url);  
  19.     }  
  20.   
  21.     public void run() {  
  22.         try {  
  23.             conn = (HttpURLConnection) url.openConnection();  
  24.         } catch (IOException e) {  
  25.             e.printStackTrace();  
  26.             url = null;  
  27.         }  
  28.     }  
  29.   
  30.     public HttpURLConnection getConn() {  
  31.         return conn;  
  32.     }  
  33.   
  34.     public static void main(String[] args) throws Exception {  
  35.         OpenConn2 openConn = new OpenConn2("http://www.google.com");  
  36.         openConn.start();  
  37.         openConn.join(10000);// wait 10 seconds  
  38.         HttpURLConnection c = openConn.getConn();  
  39.         if (c != null) {  
  40.             System.out.println("连接网络成功...");  
  41.             BufferedReader r = new BufferedReader(new InputStreamReader(c  
  42.                     .getInputStream()));  
  43.             String s = r.readLine();  
  44.             while (s != null) {  
  45.                 System.out.println(s);  
  46.                 s = r.readLine();  
  47.             }  
  48.         } else {  
  49.             System.out.println("超时错误,连接网络失败...");  
  50.         }  
  51.     }  
  52. }  
/**  * 测试Runnable接口线程  * @author mfcai  */  import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL;  public class OpenConn2 extends Thread {  private HttpURLConnection conn;  private URL url;   public OpenConn2(String url) throws MalformedURLException {   this.url = new URL(url);  }   public void run() {   try {    conn = (HttpURLConnection) url.openConnection();   } catch (IOException e) {    e.printStackTrace();    url = null;   }  }   public HttpURLConnection getConn() {   return conn;  }   public static void main(String[] args) throws Exception {   OpenConn2 openConn = new OpenConn2("http://www.google.com");   openConn.start();   openConn.join(10000);// wait 10 seconds   HttpURLConnection c = openConn.getConn();   if (c != null) {    System.out.println("连接网络成功...");    BufferedReader r = new BufferedReader(new InputStreamReader(c      .getInputStream()));    String s = r.readLine();    while (s != null) {     System.out.println(s);     s = r.readLine();    }   } else {    System.out.println("超时错误,连接网络失败...");   }  } }

3.以匿名内部类的方式创建
即在一个方法中创建线程,当方法被调用时,线程即启动,如下:

Java 代码
  1. /**  
  2. * 测 试匿名线程线程创建  
  3. * @author mfcai  
  4. */   
  5.   
  6.   
  7. import java.io.BufferedReader;  
  8. import java.io.IOException;  
  9. import java.io.InputStreamReader;  
  10. import java.net.HttpURLConnection;  
  11. import java.net.URL;  
  12.   
  13. public class OpenConn3 {  
  14.     private HttpURLConnection conn;  
  15.     private URL url;  
  16.       
  17.     public static void main(String[] args){  
  18.         try{  
  19.             OpenConn3 open3= new OpenConn3();  
  20.             open3.strartMyThread();  
  21.         }catch(Exception ex){  
  22.             System.out.println(ex.toString());  
  23.         }  
  24.     }  
  25.      public void strartMyThread() throws Exception{   
  26.          this.url =new URL("http://www.google.com");  
  27.          java.lang.Runnable runner=new Runnable(){  
  28.              public void run(){   
  29.                  try {  
  30.                         conn = (HttpURLConnection) url.openConnection();  
  31.                     } catch (IOException e) {  
  32.                         e.printStackTrace();  
  33.                         url = null;  
  34.                     }  
  35.              }  
  36.   
  37.          };  
  38.          Thread openConn=new Thread(runner);   
  39.          openConn.start();   
  40.          openConn.join(10000);// wait 10 seconds  
  41.   
  42.         if (conn != null) {  
  43.             System.out.println("连接网络成功...");  
  44.             BufferedReader r = new BufferedReader(new InputStreamReader(conn  
  45.                     .getInputStream()));  
  46.             String s = r.readLine();  
  47.             while (s != null) {  
  48.                 System.out.println(s);  
  49.                 s = r.readLine();  
  50.             }  
  51.         } else {  
  52.             System.out.println("超时错误,连接网络失败...");  
  53.         }  
  54.   
  55.      }  
  56. }  
/**  * 测试匿名线程线程创建  * @author mfcai  */    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL;  public class OpenConn3 {  private HttpURLConnection conn;  private URL url;    public static void main(String[] args){   try{    OpenConn3 open3= new OpenConn3();    open3.strartMyThread();   }catch(Exception ex){    System.out.println(ex.toString());   }  }   public void strartMyThread() throws Exception{     this.url =new URL("http://www.google.com");          java.lang.Runnable runner=new Runnable(){           public void run(){             try {             conn = (HttpURLConnection) url.openConnection();            } catch (IOException e) {             e.printStackTrace();             url = null;            }           }           };          Thread openConn=new Thread(runner);           openConn.start();           openConn.join(10000);// wait 10 seconds     if (conn != null) {     System.out.println("连接网络成功...");     BufferedReader r = new BufferedReader(new InputStreamReader(conn       .getInputStream()));     String s = r.readLine();     while (s != null) {      System.out.println(s);      s = r.readLine();     }    } else {     System.out.println("超时错误,连接网络失败...");    }    } }

转载请注明作者和出处。

Read: 910

[转]深入理解MIDP的界面类体系

因为在MIDP手机编程中,没有控制台的概念,所以所有的MIDP手机软件都必须有自己的界面,下面就熟悉一下MIDP的界面类体系。

首先说明的是,MIDP的标准界面类都位于javax.microedition.lcdui包中,使用时一定要记得引入。

在界面体系中,所以可以直接显示的界面类都继承自同一个父类——Displayable。根据是否能直接操作屏幕,以及是否和屏幕尺寸相关,MIDP的界面类分为两大类:

1、 高级用户界面——和屏幕大小无关,不能直接操作屏幕

高级用户界面类可以不需要修改就可以在所有支持Java的手机上显示,不同的手机显示方式会有所不同,但功能均可以正常使用。特别适合做对于界面要求不高的手机应用软件。

高级用户界面中的类又分为两个部分:

l 容器类

容器类是指直接或者是间接继承自Displayable,可以直接在屏幕上显示的类。这些类都有一个统一的父类——Screen类,其他的都是实现的容器类,包括以下几个:

u Alert——提示框

u Form——窗体

u List——列表框

u TextBox——文本盒,多行文本框

以上这些类除了Screen类以外,都代表一类界面,在实际的开发过程中,即可以直接使用(只使用其对象)也可以使用继承。

l 控件类

控件类是指那些不能在屏幕上直接显示,必须添加到容器类(注:MIDP中的所有控件类均只能添加到Form中)才可以显示的类。这些类也有一个统一的父类Item类,其它的都是实现的控件类,包括以下几个:

u ChoiceGroup——选择框,包括单选和多选

u DateFiled——日期文本框

u Gauge——进度条

u ImageItem——图片项目

u StringItem——可变字符串项目

u TextFiled——单行文本框

在MIDP2.0中,新增两个控件:

u CustomItem——个性化项目,可以实现自己的控件

u Spacer——空白

在实际的使用中,根据界面的需要,选择合适的控件种类,然后添加到Form中进行显示。

2、 低级用户界面——和屏幕大小相关,可以直接操作屏幕

低 级用户界面可以让程序员直接操作界面,例如可以在屏幕上方便的绘制图片、文字以及基本的图形等,可以在手机中表现复杂的界面,所以很适合进行手机游戏以及 移动证券之类的软件开发。但是低级界面一般和屏幕大小关系比较密切,所以在不同的手机型号之间实现的时候,一般需要进行移植。

低级用户界面主要包括两个类:

l Canvas——手机画布

该类代表手机屏幕,包含获得屏幕属性的一系列方法、事件处理的方法,以及最核心的paint绘制方法等。在MIDP2.0中该类有一个子类——GameCanvas。

l Graphics——画笔

系统所有的绘制动作都通过该类实现,包含一般的绘制方法、设置字体或颜色的方法以及一些技巧操作的方法等。

低级用户界面可以理解为使用Graphics这样一个画笔类在Canvas上进行绘制。

当然还有一个在高级用户界面和低级用户界面都可以使用的类——Command(软按钮类),使用该类可以在界面中实现软按钮的功能。

在整个界面体系中,除了以上最核心的类以外,还包含一些其他的辅助功能,主要分为如下几种:

1、 高级用户事件处理体系

因为高级用户界面的事件处理采用了监听器(Listener)模式,所以在API中只提供了几个接口:

l CommandListener

处理软按钮(Command)事件。

l ItemStateListener

处理控件(Item)状态改变事件。

l ItemCommandListener——MIDP2.0新增

处理和控件相关的软按钮事件。

2、 低级用户界面辅助类

在实际使用低级用户界面中,经常用到图片、字体等,这些也在界面体系中被实现成具体的类,分别是:

l Font——字体类

l Image——图片类

由于J2ME对J2SE进行了大量的简化,所以颜色没有实现成具体的类,而只是支持RGB格式的表示而已。

以上系统的介绍了MIDP的界面类体系,希望能使您对于界面类结构有更加深刻的认识。不足之处请积极指正!

来源:http://bbs.csai.cn/dispbbs.asp?boardid=56&Id=100957&page=7

Read: 705