BlackBerry アプリケーションは Java ME であり、開発環境として Windows でも Linux でも Mac でもよいということになっているのですが、実際に RIM から提供されている SDK は専ら Windows 用です。
Linux で BlackBerry 開発をするためには、RIM から提供されている JDE と、Sun の提供する JDK と WTK、そして Ant と bb-ant-tools を使用します。またビルドしたアプリケーションを BlackBerry デバイスにインストールするために barry を使用します。
Simulator は残念ながら VirutalBox 上の Windows で動作させています。また、JDE のインストールをする際にも Windows を使用します。
インストール
Sun JDK (J2SE)
Sun から最新の J2SE の JDK をダウンロードし、インストールします。(ディストリビューションに十分新しい Sun の JDK が含まれていればそれでもよい。)
適当なディレクトリに配置し、PATH を通し、また環境変数 JAVA_HOME も設定しておきます。
Wireless Toolkit
Sun Java Wireless Toolkit をダウンロードして Linux 上にインストールします。
手元では /opt/WTK2.5.2/ としてインストールし、/opt/WTK/ としてシンボリックリンクして使用しています。
BlackBerry JDE
BlackBerry Developer Zone から BlackBerry Java Development Environment (BlackBerry JDE) をダウンロードします。
JDE のバージョンとしては最新のものを使用しても問題ない(Simulator はターゲットデバイス向けのものを別途インストールするので)はずですが、ひとまずはターゲットデバイスに合わせたバージョンを使用しました。手元にある BlackBerry デバイスは Bold 9000 (docomo) で OS は 4.6.0 なので JDE も 4.6.0 を使用しています。
JDE のインストールは Windows 上で行います。そしてインストールされた JDE を Linux にコピーします。手元では
/opt/BlackBerry_JDE_4.6.0 としてコピーし、/opt/BlackBerry_JDE としてシンボリックリンクして使用しています。
BlackBerry Smartphone Simulators
Developer Zone からターゲットデバイスのシミュレータをダウンロードしてインストールします。これは VirtualBox 上の Windows にインストールして、そこで使用するようにしています。
ひとまずのターゲットデバイスは docomo 版の Bold 9000 なので、”Select your smartphone” で “BlackBerry Bold 9000″、”Choose your carrier” で “DoCoMo” を選んでダウンロードします。
開発環境のディレクトリを VirtualBox の共有フォルダとしてマウントしておけば、ビルドした cod ファイルをシミュレータにインストールするのはさほど手間ではありません。
本当はシミュレータも Linux で動かしたいところで、Linux 上で WINE を使ってシミュレータを使用できている人もいるようです。しかし手元ではまだ Bold のシミュレータの動作には成功していません。(DirectX のインストールが必要な様子だったのですが、よく分からずにそのままになっています。)
Barry
作成した cod ファイルを Linux から BlackBerry デバイスにアップロードできる bjavaloader は barry に含まれているので、これをインストールします。
最新の barry をソースからビルドする場合には git で取得します。
git clone git://repo.or.cz/barry.git barry
Ant + bb-ant-tools
Ant がディストリビューションに含まれていなければ http://ant.apache.org/ からインストールします。
また Ant の BlackBerry 用追加モジュールである bb-ant-tools をインストールします。bb-ant-tools.jar を ANT_HOME 下の lib ディレクトリにコピーするか、ホームディレクトリの .ant/lib/ 下にコピーします。
bjavaloader (barry)
アプリケーションを BlackBerry デバイスにインストールしたり、デバイスから削除したりするには、Barry の新しい版に含まれている bjavaloader を使用します。
たとえば HelloWorld.cod を BlackBerry デバイスにコピーするには、USB 接続をした上で
$ bjavaloader load HelloWorld.cod
と実行します。またデバイスから削除するときは
$ bjavaloader erase HelloWorld
とします。
デバイスにパスワードを設定している場合は、-P オプションを使用してパスワードを引き渡す必要があります。
$ bjavaloader load HelloWorld.cod -P <passwd> $ bjavaloader erase HelloWorld -P <passwd>
Code Signing
登録
API 中で signed とマークされている API を実際の BlackBerry デバイスで使用するためには、実行するアプリケーションに対して RIM から電子署名をしてもらう必要があります。signed でない API のみを使用する場合には署名などは必要ありませんが、PIM へのアクセスやネットワークアクセスなどある程度おもしろいことをしようとする場合には必須となります。
http://na.blackberry.com/eng/developers/javaappdev/codekeys.jsp
署名のためにはまず https://www.blackberry.com/SignedKeys/ から利用者情報、認証に使用する任意の10桁のPIN、カード番号の登録をして、クライアント ID を割り当ててもらう必要があります。この手続には 20ドル かかります。
初期設定
登録すると数日で 3 通の添付メールが届きます。それぞれのメールには認証用の情報が添付されています。
client-RBB-xxxxxxxxxx.csi client-RCR-xxxxxxxxxx.csi client-RRT-xxxxxxxxxx.csi
といった3ファイル(xxxxxxxxxx の部分はクライアントID)です。
まずはこれらを JDE に含まれる SignatureTool.jar で登録します。(ネットワーク接続されている必要があります。)
java -jar /opt/BlackBerry_JDE/bin/SignatureTool.jar client-RBB-xxxxxxxxxx.csi java -jar /opt/BlackBerry_JDE/bin/SignatureTool.jar client-RCR-xxxxxxxxxx.csi java -jar /opt/BlackBerry_JDE/bin/SignatureTool.jar client-RRT-xxxxxxxxxx.csi
最初の実行では、まず秘密鍵の生成をするようになります。このとき秘密鍵用のパスワードも登録します。(これは PIN とは別のものです。)
秘密鍵が生成できたら csi ファイルの処理のために PIN の入力が求められます。また続いて秘密鍵のパスワードも入力します。
3ファイルとも処理したら準備完了です。
(この処理では SignatureTool.jar のあるディレクトリに秘密鍵のファイルや管理用のファイルが作成されます。このため JDE の bin ディレクトリに実行ユーザの書き込み権限が必要なのかもしれません。)
署名
署名をするときには
java -jar /opt/BlackBerry_JDE/bin/SignatureTool.jar -a -C <target.cod>
といったかたちで実行します。署名時にはネットワーク接続されている必要があります。
Ant (with bb-ant-tools)
手元では下記のような build.xml を使用しています。この build.xml ではプロジェクトのトップに src、resource、img のディレクトリがある想定になっています。
ローカルな設定は環境変数で行うようにしていて、BB_JDE_HOME に JDE のディレクトリ(/opt/BlackBerry_JDE)、PREVERIFY_DIR には preverify の含まれるディレクトリ(/opt/WTK/bin) を指定するようにしています。また BlackBerry デバイスに設定しているパスワードは BB_PASSWD で指定しています。
またリソースファイルは rcc_utf8 というファイル名で作成しておいて native2ascii で rcc ファイルへと変換するようにしています。
build.xml
<?xml version="1.0"?>
<project name="sample" default="compile" basedir=".">
<property name="app.name" value="sample"/>
<property name="vendor.name" value="Giraffy inc."/>
<!-- require bb-ant-tools.jar -->
<typedef resource="bb-ant-defs.xml" />
<property environment="env"/>
<property name="src.dir" value="${basedir}/src/"/>
<property name="resource.dir" value="${basedir}/resource/"/>
<property name="dest.dir" value="${basedir}/build/"/>
<condition property="jde.home" value="${env.BB_JDE_HOME}">
<isset property="env.BB_JDE_HOME"/>
</condition>
<property name="preverify.dir" value="${env.PREVERIFY_DIR}"/>
<condition property="password" value="${env.BB_PASSWD}">
<isset property="env.BB_PASSWD"/>
</condition>
<condition property="loader.args.password" value="-P ${password}">
<isset property="password"/>
</condition>
<target name="prepare">
<mkdir dir="${dest.dir}"/>
</target>
<target name="native2ascii">
<native2ascii encoding="UTF-8" src="${resource.dir}" dest="${resource.dir}"
includes="**/*.rrc_utf8" ext=".rrc"/>
</target>
<target name="compile" depends="prepare,native2ascii">
<rapc output="${app.name}" destdir="${dest.dir}" exepath="${preverify.dir}">
<src>
<fileset dir="${src.dir}">
<include name="**/*"/>
</fileset>
<fileset dir="${resource.dir}">
<include name="**/*"/>
</fileset>
</src>
<jdp title="${ant.project.name}" vendor="${vendor.name}"
version="0.1" icon="../img/sample.png"/>
</rapc>
</target>
<target name="sign" depends="compile">
<sigtool codfile="${dest.dir}/${app.name}.cod"/>
</target>
<!-- Usage: ant -Dpassword=<pass> deviceinfo -->
<target name="deviceinfo">
<exec executable="bjavaloader">
<arg value="deviceinfo"/>
<arg line="${loader.args.password}"/>
</exec>
</target>
<!-- Usage: ant -Dpassword=<pass> load <cod filename> -->
<target name="load">
<exec executable="bjavaloader">
<arg value="load"/>
<arg value="${dest.dir}/${app.name}.cod"/>
<arg line="${loader.args.password}"/>
</exec>
</target>
<!-- Usage: ant -Dpassword=<pass> erased <cod name base> -->
<target name="erase">
<exec executable="bjavaloader">
<arg value="erase"/>
<arg value="${app.name}"/>
<arg line="${loader.args.password}"/>
</exec>
</target>
<target name="clean">
<delete>
<fileset dir="${basedir}" defaultexcludes="no">
<include name="**/*~"/>
<include name="**/.#*"/>
<include name="LogFile.txt"/>
</fileset>
</delete>
<delete dir="${dest.dir}"/>
</target>
<target name="rebuild" depends="clean,compile"/>
<target name="all" depends="compile"/>
</project>
参考
http://www.progweb.com/modules/blackberry/index-en.html
http://www.slashdev.ca/2008/04/03/blackberry-development-using-linux/
http://www.slashdev.ca/2008/03/27/blackberry-simulator-in-linux-sort-of/
http://www.slashdev.ca/2008/04/10/simulator-in-linux-slightly-more-reliable/
関連する記事: