浏览 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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |