BLACKBERRY DEVELOPMENT WITH ANT & ECLIPSE

来源:互联网 发布:中国大数据研究院英语 编辑:程序博客网 时间:2024/06/05 19:45


In this two part series I’m going to try my best to describe how I use Apache Ant andEclipse to write/debug software for the BlackBerry platform.

Requirements

  • BlackBerry JDE 4.1+ (or JDE Component Pack)
  • Ant 1.6.x+ (if not using eclipse, or your ide does not support ant)
  • Eclipse 3.x (or your ide of choice)
  • BlackBerry Ant Tools

Prepare your workspace

This isn’t necessary per-say but you owe it to yourself. First step is adding a user library for the blackberry api. Go to Workspace->Preferences and drill down,Java->Build Path->User Libraries.

howto1.png

Click New and enter “BlackBerry 4.2″ as the library name. Click Add JARs and find your rim api jar (JDE_HOME/lib/net_rim_api.jar). Also be sure to set the javadoc location (JDE_HOME/docs/api). This will give you documentation popups when you do code assist (ctrl+space) and meaningful variable names when using code generation (eg: abstract method stubs).

howto2.png

Setup ant classpath

We will be using a set of ant tasks to automate the build process of our application so download the latest version of BlackBerry Ant Tools and extract the zip somewhere. Where you put bb-ant-tools.jar is up to you but I prefer to put it in my ant lib directory (eclipse/plugins/org.apache.ant_1.6.5/lib). Go to Window->Preferences and drill down, Ant->Runtime. Click Add External JARs and find bb-ant-tools.jar.

howto3.png

That’s it! The workspace is good to go.

Hello, World!

Alright, now lets get to the soldering! I mean programming (sorry, wrong pass-time). Ever since the first cave man/woman programmer chiseled the first cave program on his/her cave wall it has been a “Hello, World!” program. I don’t know what happens to those who break this tradition and I don’t want to find out.

Create a new java project and call it whatever the hell you want, but keep in mind what I just said about “Hello, World!”. Select the option to create separate source and output folders and click next.

howto4.png

In the Libraries tab select the JRE System Library and click Remove. ClickAdd Library and select User Library and click next. Check the checkbox beside the library we created when preparing our workspace and click finish. Click finish to create the project.

howto5.png

Create the class ca.slashdev.HelloWorldApp:

package ca.slashdev; import net.rim.device.api.ui.UiApplication;import net.rim.device.api.ui.component.LabelField;import net.rim.device.api.ui.container.MainScreen; public class HelloWorldApp extends UiApplication {   public HelloWorldApp() {      MainScreen screen = new MainScreen();      screen.add(new LabelField("Hello, World!"));      pushScreen(screen);   }    public static void main(String[] args) {      new HelloWorldApp().enterEventDispatcher();   }}

Create the build.xml file:

<project name="Hello World App" default="build">   <taskdef resource="bb-ant-defs.xml" />    <!-- rapc and sigtool require the jde.home property to be set -->   <property name="jde.home" location="/Users/josh/lib/JDE4.2" />    <!-- directory of simulator to copy files to -->   <property name="simulator.home" location="/Volumes/Java/JDE4.2/simulator" />    <property name="src.dir" location="src" />   <property name="build.dir" location="build" />   <property name="cod.name" value="ca_slashdev_HelloWorld" />    <target name="build">      <mkdir dir="${build.dir}" />      <rapc output="${cod.name}" srcdir="${src.dir}" destdir="${build.dir}">         <jdp title="Hello World" />      </rapc>   </target>    <target name="sign">      <sigtool codfile="${build.dir}/${cod.name}.cod" />   </target>    <target name="clean">      <delete dir="${build.dir}" />   </target>    <target name="load-simulator" depends="build">      <copy todir="${simulator.home}">         <fileset dir="${build.dir}" includes="*.cod,*.cso,*.debug,*.jad,*.jar" />      </copy>   </target></project>

IMPORTANT: Set the jde.home and simulator.home properties appropriately.

Show the Ant view by clicking Window->Show View->Ant. Drag the build.xmlfile into this view. Now you can simply double-click on the targets to run them. This would be a good time to run the build target. No errors? Sweet! Run the load-simulator target to copy files into the simulator.

Debugging

JDE 4.1 and above comes with a tool called JDWP. Start JDWP from your JDE install. Now lets setup a remote debug configuration in eclipse. Click Run->Debug. Select the Remote Java Application category and click the new button. Enter a name for the configuration and select the project. Click Debug and the simulator should spring to life.

howto6.png

Set a breakpoint at the line where the screen gets pushed to the stack. In the simulator, launch the Hello World application and eclipse should switch to the debug perspective and execution should be suspended at your breakpoint.

howto7.png

Recap

So what have we covered? We’ve added the blackberry api as a user library, installed the blackberry ant tools project and wrote a simple but effective build script. How many applications have you written that are this simple? Probably not many. Lets now look at a more complex setup with dependencies.

Hello, World! with dependencies

If you’ve gotten this far I’m going to assume that I can short cut some of the details now.

Create a general project in the workspace called common. This directory will be shared by all of the projects. Each project will import it’s build script as well as some common properties.

Create a file called build.xml:

<?xml version="1.0" encoding="ISO-8859-1"?><project name="build-common" default="build">   <taskdef resource="bb-ant-defs.xml" />    <!-- import project properties (project basedir is searched) -->   <property prefix="project" file="project.properties" />    <!-- get common build file basedir and import common properties -->   <dirname property="common.basedir" file="${ant.file.build-common}" />   <property file="${common.basedir}/common.properties" />    <property name="build.dir" location="build" />    <path id="import.jars">      <fileset dir="build/lib" includes="*.jar" />   </path>    <path id="src.files">      <fileset dir="src" includes="**/*" />   </path>    <target name="build" depends="deps">      <mkdir dir="build/lib" />      <rapc quiet="true" output="${project.output}" destdir="${build.dir}">         <import refid="import.jars" />         <src refid="src.files" />         <jdp file="${basedir}/project.properties" />      </rapc>   </target>    <target name="deps" if="project.deps">      <mkdir dir="build/lib" />      <subant target="export-all">         <dirset dir="${common.basedir}/.." includes="${project.deps}" />         <property name="export.dir" location="build/lib" />      </subant>   </target>    <target name="clean">      <delete dir="build" />   </target>    <target name="sign" depends="build">      <sigtool codfile="build/${project.output}.cod"               jdehome="${sigtool.jde}" password="${sigtool.password}" />      <!-- delete that damn pesky log file -->      <delete file="LogFile.txt" />   </target>    <target name="load-device" depends="sign">      <exec executable="${jde.home}/bin/JavaLoader.exe">         <arg value="-usb" />         <arg value="load" />         <arg file="build/${project.output}.cod" />      </exec>   </target>    <target name="load-simulator" depends="build">      <antcall target="export-all">         <param name="export.dir" value="${simulator.home}" />      </antcall>      <copy todir="${simulator.home}">         <fileset dir="build/lib" includes="*.*" />      </copy>   </target>    <target name="export" if="export.dir" depends="build">      <mkdir dir="${export.dir}" />      <copy todir="${export.dir}">         <fileset dir="build" includes="*.cod" />      </copy>   </target>    <target name="export-all" if="export.dir" depends="build">      <mkdir dir="${export.dir}" />      <copy todir="${export.dir}">         <fileset dir="build" includes="*.cod,*.csl,*.cso,*.debug,*.jar" />      </copy>   </target></project>

And create a file called common.properties:

jde.java.home = ${java.home}jde.home=/Users/josh/lib/JDE4.2simulator.home=/Volumes/Java/JDE4.2/simulatorsigtool.jde = ${jde.home}sigtool.password = YourPassword

Be sure to set these two properties to values appropriate for your setup. Hint: if you are using the simulator inside the JDE, set simulator.home=$(jde.home}/simulator.

Hello World dependency

Now lets create a library for our HelloWorld project to depend on. Create a new Java project and call it libHello and be sure to select the option to create separate source and output folders.

howto8.png

For the sake of demonstration, lets create a simple class with a string property that contains the infamous hello world message. Create the class calledca.slashdev.HelloWorld:

package ca.slashdev; public class HelloWorld {   private String _message;    public HelloWorld() {      _message = "Hello, World!";   }    public String getMessage() {      return _message;   }}

Now this is where the magic begins. Create two files in the libHello project.build.xml:

<project name="libHello" default="build">   <import file="../common/build.xml" /></project>

project.properties:

output=ca_slashdev_libHellotitle=Hello World Librarytype=library

Drag the build.xml file into the Ant view and run the build target. Ooooh, ahhhh. Now wasn’t that easy? Our common build script does all the work, we just give it some properties to work with. The project.properties file contains everything you would normally specify in the project settings dialog in the RIM JDE. Check out thedocumentation from the blackberry ant tools project for a full list of values that can be specified.

Retrofit Hello World application

Right click the HelloWorld project in the workspace and click properties. Go to the projects tab and add libHello project to the build path.

howto9.png

Replace the contents of the build.xml file in HelloWorld with this:

<project name="Hello World" default="build">   <import file="../common/build.xml" /></project>

Create the project.properties file:

deps=libHellooutput=ca_slashdev_HelloWorldtitle=Hello Worldtype=cldc

Change the ca.slashdev.HelloWorldApp class to use the ca.slashdev.HelloWorldclass in libHello:

package ca.slashdev; import net.rim.device.api.ui.UiApplication;import net.rim.device.api.ui.component.LabelField;import net.rim.device.api.ui.container.MainScreen; public class HelloWorldApp extends UiApplication {   public HelloWorldApp() {      HelloWorld hello = new HelloWorld();      MainScreen screen = new MainScreen();      screen.add(new LabelField(hello.getMessage()));      pushScreen(screen);   }    public static void main(String[] args) {      new HelloWorldApp().enterEventDispatcher();   }}

Now run the build target in HelloWorld project and viola! Just for the hell of it, run the clean target in libHello. Now run the build target in HelloWorld. You’ll notice that the build script automatically builds the dependent library. This is accomplished by setting the deps property; a comma separated list of directory names for each of the dependencies.

Final thoughts

We did it. We compiled, compiled with dependencies, and debugged a blackberry application all without using RIM’s IDE. Compiling is provided by the rapc ant task from the blackberry ant tools project, and no need for .jdp or .jdw files anymore since all module settings are inside standard properties files. Furthermore, I’d like to point out that both examples in this guide can be just as easily built outside of Eclipse. This is an important distinction because I firmly believe that a developer should be free to use whatever tools they are most comfortable with. If that happens to be a standard text editor, and the command line so be it.

The acute observer will notice that all of my screen captures are from Mac OS X. I should point out that the rapc compiler works just fine under OS X and Linux (using blackberry ant tools project). However, I am unaware of any way to run the simulator, sign cod files, or use javaloader natively on these operating systems. Virtualization software such as Parallels provide a less than ideal solution where by you can run your simulator session inside of a virtual machine. This tends to be slow, but works in a pinch. Such is a topic for another post. ;)


转载地址:http://www.slashdev.ca/2007/05/30/blackberry-development-with-ant-eclipse/

相关网址:

https://developer.blackberry.com/java/download/

http://forums.crackberry.com/app-developers-f9/bb-development-ubuntu-linux-435299/

http://opensourcebb.com/2012/09/bb10-webworks-and-linux-setting-your-system-up-for-blackberry-development/


原创粉丝点击