マルチデバイス対応を実現するしかけ
C++BuilderそしてDelphiでネイティブコードによりマルチデバイス対応を実現しているのが、IDE、ネイティブコンパイラ、そしてコンポーネントフレームワークだ。IDE(統合開発環境)は、マルチデバイス開発に必要な機能をすべて統合する。例えば、Android開発の場合、Android SDKやNDKのセットアップが必要だが、これらはすべてIDEに統合されており、特に個別の準備は不要だ。また、モバイル開発では実機を使ったテストも欠かせないが、これらのデバイスの接続、アプリの転送、そしてコードレベルでのデバッグまでがサポートされている。
IDEには、それぞれのプラットフォーム向けのネイティブコンパイラが搭載されており、IDEが動作するWindows上で、iOSやAndroid向けのARMネイティブのコードを生成できる。
ネイティブコードを生成できるといっても、UIの設計やデバイス機能の利用でプラットフォーム固有の開発が必要になってしまうのであれば、マルチデバイス開発といっても中途半端なものになってしまう。C++BuilderとDelphiでは、UIやデバイス機能、さらにはデータアクセスなどにマルチデバイス対応のコンポーネントを用いることで、単一のコードベースによるマルチデバイス開発を可能にしている。しかも、そのコンポーネントフレームワークは、CPU/GPUネイティブなので、デバイス機能を100%発揮できるのだ。
アプリケーション開発者は、コンポーネントを使うため、コンポーネントが用意するプロパティやイベント、メソッドを使って、開発できる。内部的には、各デバイスに最適化されたネイティブコードが使用されるが、アプリケーション開発者には隠蔽されている。もちろん、特定のデバイス固有のコードを記述したい場合には、それも可能だ。例えば、NDKのAPIをコールしたり、ブリッジ経由でインテントなどのAndroidアプリのコードを呼び出したりもできる。
次の例は、デバイスのGPS機能を用いてGoogleマップに現在地を表示するアプリだ。
このアプリが使用しているのは、LocationSensorコンポーネント。GPS機能は、Android、iOS、あるいはWindowsタブレットなど、最近のスマートデバイスやPCのほとんどに搭載されているが、これらを利用するコードは、プラットフォームごとに異なる。しかし、C++BuilderおよびDelphiでは、FireMonkeyによってプラットフォームの差異をコンポーネントが隠蔽する。つまり、アプリケーション開発者は、プラットフォームが何であれ、LocationSensorを使えばよいのだ。
例えば、GPS機能を、チェックボックスを使ってオン/オフするコードは次のようになる。
void __fastcall TForm2::swLocationSensorActiveSwitch(TObject *Sender) { // ロケーションセンサーのON/OFF LocationSensor1->Active = swLocationSensorActive->ISChecked; }