たとえば、OS 6.0 用にアプリをコンパイルして 5.0 デバイスで実行することは可能であり、新しい API を使用しない限り問題ありません (念のため、2 分前にテストを行いました)。 )。
Eclipse 3.6 と最後の BB プラグインを使用して、利用可能な場合にのみバーコード スキャンを使用する必要があるアプリを開発しています (API 6.0 以降)。最もクリーンな解決策は、下位バージョンでは競合するクラスをロードしないことでした。これが Java SE の場合、バーコード API のすべての使用をクラスにカプセル化して (これを と呼びましょうOS6Impl
)、 default も作成OS5Impl
し、OS のレベルに応じて実行時にリフレクションを使用していずれかをインスタンス化します。デバイス。
しかし、これは BB であり、それだけでは十分ではないため、プリプロセッサ ディレクティブに頼って、アプリの 2 つの異なるバージョンを管理する必要がありました。プリプロセッサ フラグが新しい API 機能を無効にする場合、結果の前処理済みOS6Impl.java
ファイルからすべてのコンテンツが取り除かれます。これは、フォルダー内のファイルを見て.preprocessed
、生成された jar ファイルを開くことで確認できますが、OS6Impl.class
ファイルは存在しません。フラグによって新機能が有効になるOS6Impl.java
と、ファイル内にコードOS6Impl.class
が含まれ、ファイルが jar に含まれます。
これは問題なく、JRE 6 で両方のバージョンをコンパイルする OS5 と OS6 の両方のデバイスで動作するはずですが、そうではありません。前処理は問題ありません。クラスは jar に含まれていません (したがって、cod には含まれません)。ただし、5.0 デバイスで実行すると、エラー メッセージ (「モジュールが見つかりません」) が表示されます。モジュールは「net_rim_barcodescanner」で、6.0 以降のデバイスでのみバーコードをスキャンするために使用する予定です。
エラーを取り除くには、JRE 5.0 用にコンパイルする必要がありました。前に述べたように、新しい API を使用しない 6.0 用にコンパイルされたコードは、より低いバージョンで実行できるため、これはばかげています。新しい API のインポートがクラス以外で使用されていないOS6Impl.java
こと、プリプロセッサ ディレクティブが正しく設定されていること、プリプロセッサ ディレクティブが変更されるたびにクリーンとビルドが行われたことを何度か確認しました。また、各タラをインストールした後、ブラックベリーを再起動しました。
バージョンをコンパイルするには、アプリ記述子のディレクティブを変更するだけでなく、ビルド パスを変更して JRE を 5 または 6 に切り替える必要があります。
プリプロセッサ ディレクティブを使用して互換性のないコードを削除すると、どのような種類の依存関係が追加されますか? プリプロセッサ ディレクティブなしで互換性のあるコードをコンパイルするときに、これらの依存関係が追加されないのはなぜですか? プリプロセッサは、コンパイラの前に実行されるものではありませんか?