本帖最后由 Programus 于 2009-11-11 22:52 编辑
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://programus.blogbus.com/logs/49223738.html
英文原文: http://lejos.sourceforge.net/nxt/nxj/tutorial/Preliminaries/CompileAndRun.htm
本章节描述了如何编译和运行LeJOS NXJ程序。
(译注:本章节中提到的NXT主要指机器人套装中的NXT积木块)
大多数人都想写一些Java程序,然后扔到NXT里面去运行。不过,事实上除此之外还有其他的选择:LeJOSNXJ支持在PC上运行程序,并远程遥控NXT机器人。类似这样的PC程序不仅可以遥控安装有LeJOSNXJ固件的机器人,甚至还可以遥控运行着标准LEGO固件的机器人。(译者牢骚:你倒是早说,我就不把固件替换了……)另一个有趣的程序运行方式是让一部分程序运行在NXT中,而另一部分运行在PC上,两者通过蓝牙或者USB进行通信。通过这种方式,可以让PC部分的程序使用更大的内存、更强的处理器完成很多极其复杂的处理。还可以在PC上显示出有趣的用户接口,比如机器人的探索地图等。在NXT端运行的程序部分则具有快速响应传感器、精确控制马达等长处。如果你对编写PC端程序感兴趣,请参看本章节最后部分的PC API 命令行工具一节。
在我们即将开始本章主题讲解之前,有必要再稍微提一点:LeJOS NXJ程序还可以运行在手机或者其他类似设备上,只要这种设备支持JME(JavaMicroEditionEnvironment)。这些程序可以通过蓝牙与NXT通信。我们计划在不久之后在本指南中追加一个章节来讲述如何用LeJOS NXJ JMEAPI来开发程序。(译者:至少在我翻译的时候,还没看到类似的章节。)
最后,(译者:原作者很絮叨,请大家继续耐心看下去) LeJOS NXJ程序还可以分布到多个NXT中,然后通过蓝牙或者RS485进行相互间的通信。对了,还有,NXT程序也可以与例如蓝牙全球定位接收器之类的外部设备通信。详情请看[通信]一节。
现在,我们来看看如何让你撰写的程序在NXT上运行。你可以选择用LeJOS NXJ命令行工具来编译和运行你的程序,也可以使用一个集成开发环境(IDE)。
虽说命令行工具是非常有用的,但最好还是用一款IDE工具来开发LeJOSNXJ。因为IDE工具往往都可以快速地帮助你查出并定位程序中的错误和问题,这可比编译的时候看到一大串错误清单要贴心多了。另外,IDE还具有语法高亮、自动调整代码格式、自动完成、智能提示、收缩代码片段等等等等比亲生女儿还要窝心的功能,能够大大地提高你的开发效率和编程体验。不过,使用IDE的好处还不止于此:它还可以帮助你建立工程、调试程序、自动生成文档、绘制用户界面……JavaIDE工具往往把Sun的和其他第三方的Java工具集成在一起,让你只需轻动手指便可完成很多繁复的工作。同时,这些IDE工具还可以通过插件(plug-in)机制轻松地扩展自己的功能。
由于IDE的简便易用以及强大功能,强烈建议你使用IDE开发你所有的LeJOS程序,哪怕是最简单的程序。(译者:我现在就是这样。)任何一种LeJOS NXJ程序都可以使用IDE创建。
虽然你可以使用任意一种你喜欢的IDE来开发LeJOS NXJ程序,但本指南仅提供关于两种最普及的Java IDE的设置使用指导——Eclipse和Netbeans。而且LeJOS NXJ有针对此两款IDE的插件,可以让程序的书写和测试变得更加轻松。
请选择如下链接来学习如何设置对应的IDE工具:
而在本章剩下的内容里,将教会你如何使用命令行工具。如果你决定使用命令行工具,你可以选择任意编辑器作为你的代码编辑工具。很多工具都可以被配置成调用外部工具的方式,从而让你可以从编辑器内部调用这些命令行工具。
另外一个编译和运行LeJOSNXJ程序的可选方式是使用ant构建脚本。ant脚本通常都在IDE里面使用。Netbeans用ant进行所有的编译,在Eclipse中,ant是可选的。不过,你也可以在命令行上使用ant。所有的LeJOSNXJ例子都带有ant脚本。要运行ant脚本,你只需要切换到包含有build.xml文件的目录,并键入ant命令即可。
接下来要介绍的命令行批处理脚本文件,根据你所使用的操作系统不同,可能是Windows下的.cmd或.bat的批处理文件亦或是Unixshell脚本文件。这些脚本文件在运行时会首先设置好LeJOSNXJ所需的类路径、库路径、启动类路径,然后调用一个Java类来完成所有的工作。有一个例外是nxjc命令,它调用的是javac命令。ant脚本会使用同样的Java类,但是不会使用这些命令脚本文件。
LeJOS NXJ命令行工具的使用
编译时,LeJOS调用了标准的Sun Java编译器。然而,它需要将标准的Java库替换成LeJOS自己的版本——classes.jar。因此,我们提供了一个命令:nxjc。它会将引导类(boot class)设置为classes.jar。nxjc的参数调用方式与javac一致。
LeJOS NXJ程序与普通Java程序有一点不同:它不支持动态类加载。它将所有会被使用到的类都收集在一起,并打包进一个以.nxj为扩展名的二进制文件中。这一过程被称为连接。连接而成的二进制文件随后被传入NXT中以待执行。
用来编译、连接和运行LeJOS NXJ程序的工具有如下几个:
不过,通常你只需要使用nxjc和nxj就够了,因为nxj命令依次执行了nxjlink和nxjupload。
如上这些命令都需要在命令行窗口中运行。
nxjc - 编译程序
编译一个或多个java文件。
语法: nxjc <java源文件>
示例:
nxjc View.java
nxjc命令实际上使用如下参数调用了javac: - -bootclasspath <classes.jar文件所在路径>
- <java源文件>
之所以使用了-bootclasspath选项,是因为LeJOS不使用标准java.lang的类,而是使用他自己的classes.jar。
nxjlink - 连接程序
调用LeJOS NXJ连接器。
语法: nxjlink [-v|--verbose] [-g|--debug] [-a|--all] 主类 –o <输出用二进制文件名>
示例:
nxjlink -v Tune -o Tune.nxj
将指定的主类(包含主函数的类)与它所用到的所有类以及classes.jar中的标准LeJOS类连接,并生成可以被上传到NXT中运行的二进制的NXJ程序。
-v或--verbose选项会让命令产生一个被连接到NXJ文件中的类名、方法名标识的列表,并输出至标准输出。这份列表将在调试时相当有用。
-g或--debug选项会在程序中植入一个调试监视器。使得程序可以在运行时被强行中断(按ENTER+ESCAPE键),并会输出未捕获异常的调用堆栈。
连接器会自动删除未被使用的方法。使用-a或-all选项可以强行让连接器包含所有的方法,无论方法是否被用到。不过,这个选项应该是完全没用的。
-h或--help可以打印出选项帮助。
nxjupload - 上传程序
语法: nxjupload [-b|--bluetooth] [-u|--usb] [-d|--address 地址] [-n|--name 名称] [-r|--run] <文件名>
示例:
nxjupload Tune.nxj
上传一个二进制(.nxj)文件。默认情况下,会首先尝试用USB连接,然后使用蓝牙。如果指定了--bluetooth选项,则仅用蓝牙连接;指定了--usb选项,则仅用USB连接。
如果使用蓝牙连接,在没有指定-address选项或指定地址连接无效时,会进行蓝牙设备的搜索。
--name参数限定了所连接NXT的名字。如果此选项没有使用,nxjupload会尝试连接它找到的每一个NXT,并将文件上传到第一个成功连接的NXT上。
如果指定了--run选项,程序在被上传之后将被随机运行。
译注:nxjupload命令不仅可以用于上传.nxj程序文件,也可以上传任何需要的文件,例如程序用到的wav音频文件。
nxj - 连接、上传并运行程序
语法:nxj [options] main-class
示例:
nxj -r Tune
NXJ命令会自动连接并上传程序。它等同于顺次调用nxjlink和nxjupload。
所有适用于nxjlink或nxjupload的参数或选项都可以用于nxj命令。
默认的二进制文件名为 主类.nxj,比如上例中的文件为:Tune.nxj。
PC API 命令行工具
用来编译和运行LeJOS PC API程序的工具有:
注意:如果你不使用如上工具来编译或运行PCAPI程序,你就需要将pccomm.jar和bluecove.jar(Linux下还需要bluecove-gpl)包含在你的CLASSPATH里面,同时classes.jar必须从CLASSPATH里面删除。同时,标准Java库路径要被设置进去。
nxjpcc - 为你的PC编译PC API程序
编译一个或多个PC API Java源文件。
语法: nxjpcc [javac-options] <java源文件>
示例:
nxjpcc SensorTest.java
nxjpc - 在你的PC上运行PC API程序
调用Java来运行你的PC API程序。
语法: nxjpc [java-options] <主类>
示例:
nxjpc SensorTest |