论坛首页 移动开发技术论坛

Eclipse开发基于PhoneMe Advance的J2me程序(3)-编译支持调试(转)

浏览 2791 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-02-19   最后修改:2009-02-19
转载本人在博客里发表的文章
原文:http://jim19770812.blogspot.com/2009/02/ubuntueclipsephoneme-advancej2me3.html
phoneme advance mr1 默认是不提供调试功能的,想要调试功能?只能是自己编译了,为此phoneme advance提供了详细的指南来指导你自己编译具有调试功能的Phoneme Advance。

尽管如此,在编译的时候还是费了不少力气,其间参考了网上一些文章,有国内的也有国外的,最后总算是解决了,我把编译和配置的过程总结了一下,希望可以帮助你减少摸索的时间。
注:我编译的是Personal profile(PP)版本

1.环境要求

1.1.phoneme advance官网要求

Red Hat Linux distribution version 7.2 - 9.0
Java 2 Platform, Standard Edition (J2SE™) Development Kit (JDK™) version 1.4.2
GNU Make version 3.79.1 or later
GNU Cross Compiler (GCC) 3.4.6 or later
Doxygen version 1.4.1


1.2.对应于官网要求的编译环境,我的编译环境

os:ubuntu 8.10
linux kernel:linux 2.6.27-11-generic
jdk:1.4.2.18,sun官网上有jdk-1.4.2.18的bin下载,如果你和我一样已经装了更高版本,可以参考我的一篇文章《ubuntu下手工安装jdk(2)》,这篇文章介绍了如何手工安装和配置jdk,并且再不同jdk版本间切换。
make:GNU Make 3.81
gcc:3.4.6/4.3.2,我用3.4.6和4.3.2都能编译通过,其它版本就不知道了,如果你在编译时遇到因为gcc版本过高而无法编译的问题,可以参考我的一篇文章《ubuntu下手工切换gcc版本》,这篇文章里介绍了把gcc版本在4.x和3.x之间切换的办法。
doxygen:Doxygen version 1.5.6
ld:GNU ld (GNU Binutils for Ubuntu) 2.18.93.20081009
as:GNU assembler (GNU Binutils for Ubuntu) 2.18.93.20081009
ar:GNU ar (GNU Binutils for Ubuntu) 2.18.93.20081009
ranlib:GNU ranlib (GNU Binutils for Ubuntu) 2.18.93.20081009
bison:bison (GNU Bison) 2.1
lex:lex 2.5.35
qt:3.3.3
libstdc++:5.0.7


2.搭建编译环境

2.1.安装所需的包

jim@jim-laptop:~$ sudo apt-get install doxygen
jim@jim-laptop:~$ sudo apt-get install libqt3-compat-headers libqt3-mt-dev libqt3-mt libqt3-headers qt3-dev-tools qt3-linguist qt3-qtconfig qt3-app-dev
jim@jim-laptop:~$ sudo apt-get install libstdc++5


2.2.编译环境需要注意的地方

a.QT3的包不能有遗漏,否则可能编译失败
b.gcc的版本要注意,gcc高版本未必兼容低版本。
c.qt3的路径要注意,是 /usr/share/qt3,里面包含一个include和一个lib目录,如下所示



jim@jim-laptop:/usr/share/qt3$ ls -l
总用量 32
drwxr-xr-x  2 root root 4096 2009-02-06 00:59 bin
drwxr-xr-x  3 root root   16 2009-02-06 00:59 doc
lrwxrwxrwx  1 root root   17 2009-02-06 00:59 include -> ../../include/qt3
drwxr-xr-x  2 root root 4096 2009-02-06 01:29 lib
drwxr-xr-x 62 root root 4096 2009-02-06 00:59 mkspecs
drwxr-xr-x  2 root root 4096 2009-02-06 00:59 phrasebooks
lrwxrwxrwx  1 root root   21 2009-02-06 00:59 plugins -> ../../lib/qt3/plugins
drwxr-xr-x  3 root root   16 2009-02-06 01:29 tools
drwxr-xr-x  2 root root   32 2009-02-06 00:59 translations
jim@jim-laptop:/usr/share/qt3$

ok,环境基本上搭建完了

3.下载phoneme advance
在官网上下载phoneme_advanced-mr1-rel-bin-b06-linux-10_nov_2006.zip,解压到
~/phoneme_advanced-mr1-rel-bin-b06-linux-10_nov_2006目录下,这个是phoneme advance运行程序

在官网上下载phoneme_advanced-mr1-rel-src-b06-10_nov_2006.zip,解压到
~/phoneme_advanced-mr1-rel-bin-b06-linux-10_nov_2006/phoneme-advanced-mr1-src
目录下,这个是我们需要的源码

4.编译
编译之前先确认几个路径

a.qt路径:/usr/share/qt3 #最后不能不带"/"
b.环境变量$JAVA_HOME指向的是jdk-1.4.2.x

确认无误后,可以开始编译了


jim@jim-laptop:~/phoneme_advanced-mr1-rel-bin-b06-linux-10_nov_2006/phoneme-advanced-mr1-src$ cd build/linux-x86-generic
jim@jim-laptop:~/phoneme_advanced-mr1-rel-bin-b06-linux-10_nov_2006/phoneme-advanced-mr1-src/build/linux-x86-generic$ make J2ME_CLASSLIB=personal QT_TARGET_DIR=/usr/share/qt3 CVM_DEBUG=true CVM_JVMDI=true CVM_JVMPI=true CVM_PRELOAD_LIB=true USE_DEBUG=true JDK_HOME=$JAVA_HOME
......
jim@jim-laptop:~/phoneme_advanced-mr1-rel-bin-b06-linux-10_nov_2006/phoneme-advanced-mr1-src/build/linux-x86-generic$


如果没什么错误提示的话,编译就成功了。


注意
我编译的是Personal Profile(PP),如果需要编译Personal Basis Profile(PBP),需要把参数J2ME_CLASSLIB=personal换成 J2ME_CLASSLIB=basis,我没试过,如果编译出现问题请参考Phone me advance编译手册。


如果出现了下面的错误提示

Linking ../../build/linux-x86-generic/./bin/cvm
/usr/bin/ld: cannot find -lstdc++
collect2: ld returned 1 exit status
make: *** [../../build/linux-x86-generic/./bin/cvm] 错误 1

这是因为编译程序没有找到/usr/lib/libstdc++.so动态库,可以通过建立一个符号链接来解决,执行命令如下

sudo ln -s /usr/lib/libstdc++.so.5.0.7 /usr/lib/libstdc++.so


ok,再次编译,这次应该可以通过了。

编译之后可以看到下列文件

jim@jim-laptop:~/phoneme_advanced-mr1-rel-bin-b06-linux-10_nov_2006/phoneme-advanced-mr1-src/build/linux-x86-generic$ ls bin
cvm
jim@jim-laptop:~/phoneme_advanced-mr1-rel-bin-b06-linux-10_nov_2006/phoneme-advanced-mr1-src/build/linux-x86-generic$ ls lib
content-types.properties  jvm.hprof.txt  libdt_socket_g.so  libhprof_g.so  libjdwp_g.so  security  zi
jim@jim-laptop:~/phoneme_advanced-mr1-rel-bin-b06-linux-10_nov_2006/phoneme-advanced-mr1-src/build/linux-x86-generic$


其中bin/cvm是我们需要的VM,lib/lib*_g.so是cvm需要的有调试功能的动态库。

5.测试
phoneme advance 提供了几个小例子可以帮助我们测试刚才编译的cvm是否正确,执行下面的命令可以测试

5.1.执行cdc测试

jim@jim-laptop:~/phoneme_advanced-mr1-rel-bin-b06-linux-10_nov_2006/phoneme-advanced-mr1-src/build/linux-x86-generic$ bin/cvm -cp democlasses.jar cdc.HelloWorld
CVM Configuration:
Java stack chunk size (stackChunkSize): 1024
Java stack minimum size (stackMinSize): 1024
Java stack maximum size (stackMaxSize): 131072
GC[SS]: Initialized semi-space gen for generational GC
Size of *each* semispace in bytes=1048576
Limits of generation = [0xb6cbc200,0xb6ebc200)
First semispace      = [0xb6cbc200,0xb6dbc200)
Second semispace     = [0xb6dbc200,0xb6ebc200)
GC[MC]: Initialized mark-compact gen for generational GC
Size of the space in bytes=4194304
Limits of generation = [0xb6ebc200,0xb72bc200)
GC[generational]: Auxiliary data structures
heapBaseMemoryArea=[0xb6cbc008,0xb72bc208)
cardTable=[0x929c798,0x929f798)
objectHeaderTable=[0x929f7a0,0x92a27a0)
summaryTable=[0x92a27a8,0x92ae7a8)
"/home/jim/phoneme_advanced-mr1-rel-bin-b06-linux-10_nov_2006/phoneme-advanced-mr1-src/build/linux-x86-generic/lib/personal.jar" is not a valid classpath zip file or directory.
Hello world.
jim@jim-laptop:~/phoneme_advanced-mr1-rel-bin-b06-linux-10_nov_2006/phoneme-advanced-mr1-src/build/linux-x86-generic$

因为编译时加入了CVM_DEBUG=true选项,因此CVM执行时返回了一些调试信息,看到最后的Hello world.字样就表示成功了。

在执行的时候出现了一提示lib/personal.jar没找到的警告,很奇怪,编译的时候personal.jar并没有自动生成,不要紧,在phoneme_advanced-mr1-rel-bin-b06-linux-10_nov_2006.zip压缩包里的phoneme_advanced-mr1-pp-rel-bin-b06-linux-10_nov_2006.zip里有这个jar包。
只要把这个personal.jar包复制到~/phoneme_advanced-mr1-rel-bin-b06-linux-10_nov_2006/phoneme-advanced-mr1-src/build/linux-x86-generic/lib目录下,再次测试就没这个警告了。

5.2.执行Personal Profile(PP)测试

jim@jim-laptop:~/phoneme_advanced-mr1-rel-bin-b06-linux-10_nov_2006/phoneme-advanced-mr1-src/build/linux-x86-generic$ bin/cvm -cp democlasses.jar personal.DemoFrame
CVM Configuration:
Java stack chunk size (stackChunkSize): 1024
Java stack minimum size (stackMinSize): 1024
Java stack maximum size (stackMaxSize): 131072
GC[SS]: Initialized semi-space gen for generational GC
Size of *each* semispace in bytes=1048576
Limits of generation = [0xb6dca200,0xb6fca200)
First semispace      = [0xb6dca200,0xb6eca200)
Second semispace     = [0xb6eca200,0xb6fca200)
GC[MC]: Initialized mark-compact gen for generational GC
Size of the space in bytes=4194304
Limits of generation = [0xb6fca200,0xb73ca200)
GC[generational]: Auxiliary data structures
heapBaseMemoryArea=[0xb6dca008,0xb73ca208)
cardTable=[0x9e147a0,0x9e177a0)
objectHeaderTable=[0x9e177a8,0x9e1a7a8)
summaryTable=[0x9e1a7b0,0x9e267b0)

出现窗口如下图所示:


6.调试
phoneme advance的调试功能和JVM一样强大,一方面提供了本地调试,另一方面结合jdb也可以进行远程调试。

本地调试可以在开发期间调试程序,远程调试可以在开发机器和手持设备之间调试,功能无比的强大。

下面用一个小例子来说明如何使用jdb进行基于命令行的调试
范例源码如下

package com.demo;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Main implements ActionListener
{
     public static void main(String args[])
     {
          Frame f = new Frame("窗口") ;
          f.setSize(320,240) ;
          Button button1 = new Button("关闭");
          button1.addActionListener(new Main());
          f.add(button1);
          f.show();
     }

public void actionPerformed(ActionEvent actionEvent) {
  System.exit(0);
}
}


jim@jim-laptop:~/source/j2me/java-ides/eclipse/workspaces/projects/demo1/bin$ cvm -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=7801 com.demo.Main
CVM Configuration:
Java stack chunk size (stackChunkSize): 1024
Java stack minimum size (stackMinSize): 1024
Java stack maximum size (stackMaxSize): 131072
GC[SS]: Initialized semi-space gen for generational GC
Size of *each* semispace in bytes=1048576
Limits of generation = [0xb6d55200,0xb6f55200)
First semispace      = [0xb6d55200,0xb6e55200)
Second semispace     = [0xb6e55200,0xb6f55200)
GC[MC]: Initialized mark-compact gen for generational GC
Size of the space in bytes=4194304
Limits of generation = [0xb6f55200,0xb7355200)
GC[generational]: Auxiliary data structures
heapBaseMemoryArea=[0xb6d55008,0xb7355208)
cardTable=[0x9c8d788,0x9c90788)
objectHeaderTable=[0x9c90790,0x9c93790)
summaryTable=[0x9c93798,0x9c9f798)

ok,这样就在本机的7801端口启动了调试服务了。
接下来用jdb来连接

jim@jim-laptop:~/source/j2me/java-ides/eclipse/workspaces/projects/demo1/bin$ jdb com.demo.Main
正在初始化 jdb...
> run
运行 com.demo.Main
设置 未捕捉到 java.lang.Throwable
设置延迟的 未捕捉到 java.lang.Throwable

VM 已启动: >



执行run命令可以启动程序,稍候可以看到程序启动了,如下图所示



ok,已经写的购详细了,如果你在编译时遇到问题的话,可能是配置的不对或者编译工具的版本和我的不一致,没关系,多尝试几次就可以了,我也是经过了好几天的摸索,查阅了一堆文档和资料之后才搞定的。

我把编译好的虚拟机已经上传到网络硬盘了,可以在这里下载
phoneme_advance-mr1-b06-linux-x86-generic-pp-debug.tar
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics