C/C++ ではなく、Java でプログラミングしています。Android 開発では、プリプロセッサを使用する必要はありません。
編集:
私の問題は、Android 3.1 以降でのみサポートされる USB 機能を備えた Android アプリを開発したことです。したがって、USB ライブラリの一部がインポートされます。私が望むのは、Android 2.2 または 2.3 などのプロジェクトをビルドするときに、可能であれば、インポートされたライブラリを を使用してコメントアウトできること#ifdef
です。これに対する他の回避策はありますか?
あなたが言及したクラス/メソッドを利用するには、Android SDK バージョン 3.1 以降に対してアプリケーションをビルドする必要があります。ただし、バージョン 3.0 以前を実行しているデバイスが実行時にこれらのクラス/メソッドを使用しないようにする必要もあります。使用するとClassNotFound
例外が発生するためです。
ここで重要なことは、実行時にこれらのチェックを実行する必要があるということです。アプリケーションはすべてのデバイスに対して 1 回だけコンパイルされるため、プリプロセッサはこのようなイベントの発生を防ぐために何もできません。代わりに、コードでこれを明示的に保護する必要があります。これは通常、基本的なif-else
ステートメントで行われます。例えば、
if (Build.VERSION_CODES.HONEYCOMB_MR1 >= Build.VERSION.SDK_INT) {
// then you are on a device running android 3.1+ and it is
// safe to make use of the new classes/methods
} else {
// otherwise, you are running on a device running android 3.0
// or lower. you should not make use of the new classes/methods.
}
編集#2:
ビルのコメントに応えて、次のように述べています。
ありがとう、アレックス。プロジェクトを 3.1 に対してビルドし、2.2 にデプロイして実行しました。私がよく理解していない最後のことは、Android 2.2 OS で Android 3.1 によって参照されるコードの一部をデバッグできることです。これが私の説明です:3.1に対してビルドされた後、Javaコードはマシンコードに変換され、HONEYCOMB_MR1は2.2には存在しませんが、HONEYCOMB_MR1は単なる整数です。デバッグすると、デバッガーはHONEYCOMB_MR1の行に移動し、その整数を取得し、 SDK_INT と比較します。このように、HONEYCOMB_MR1 は 3.1 SDK のみに含まれていますが、コードは引き続きデバッグできます。あれは正しいですか?ありがとう。
正しく理解していると思います。より正確な理由は、HONEYCOMB_MR1
マークされていることですstatic final
。変数は不変の定数 (つまり、その値は決して変化しない) であるため、.apk
. So では、2.2 デバイスがif
ステートメントに到達すると、 をチェックし12 > 8
て、 の (失敗した) ランタイム検索を回避しますHONEYCOMB_MR1
。
この種のことは、Android アプリケーションを開発するときに実際に頻繁に発生します。たとえば、この動作は、MATCH_PARENT
「技術的に」のみサポートする必要があるデバイスで (2.2 で導入された) を使用できる理由も説明していますFILL_PARENT
。両方の定数に値があります-1
。MATCH_PARENT
したがって、 Froyo より前のデバイスでを使用するアプリを実行すると、すべてが期待どおりに機能します。