web-dev-qa-db-ja.com

AndroidとiOSの間でコードを共有する方法

厳密なAndroid開発から離れ、iPhoneアプリケーションを作成したいと考えています。私の理解では、iOSアプリケーションのバックエンドをC/C++でコーディングできることと、NDKを使用してAndroidアプリにC/C++コードを含めます。しかし、私の質問はどのように行うのですか?かなりググってみましたが、明確で簡潔な答えが見つかりません。サンプルコードを見ると、 NDK、すべての関数名などはAndroid(または少なくともJava))固有であるため、このC/C++バックエンドを使用してiPhoneフロントエンドを開発することはできませんか?Iこの問題についていくつかの説明をいただければ幸いです。役立つコードが利用できる場合はどうでしょうか(C/C++ファイルから文字列を読み取り、iOSおよびAndroidアプリ)。

みんなクリスに感謝

44
Sonoman

感情は健全ですが(Do n't Repeat Yourselfのポリシーに従っています)、そのコードを効率的な方法で共有できる場合にのみ実用的です。この場合、2つのプラットフォームのコードを異なる言語(iPhoneのC/C++/Obj-C、Java for Android)。

この場合は、2つの異なるコードベースを(2つの異なる言語で)記述する方がよいでしょう。アドバイス:JavaコードをC++のように書いたり、C++コードをJavaのように書いたりしないでください。私は何年も前に会社に勤務していて、「移植した」製品を持っていましたJavaからC++へ、そしてC++のようにC++コードを記述せず、読みにくいことは言うまでもなく、あらゆる種類の問題を引き起こしました。

4
Shaggy Frog

私がほぼ例外なく「ビジネス/ユーティリティ/生産性」アプリケーションに取り組んでいることに注意してください。かなり標準的なUI要素に大きく依存し、プラットフォームとうまく統合することを期待しています。この回答はそれを反映しています。ShaggyFrogへのMitch Lindgrenのコメントを参照してください。まったく異なる状況にあるゲーム開発者への良いコメントに答えてください。

@Shaggy Frogはここでは正しくないと思います。 C++で効果的でテスト済みのコードがある場合、AndroidとiPhoneの間で共有しない理由はありません。私はそれだけを行うプロジェクトに取り組んできましたが、非常に成功する可能性があります。ただし、避けなければならない危険があります。

最も重要なのは、「最も低い共通分母」に注意することです。自己完結型のアルゴリズムコードは、非常によく共有します。スレッドを管理したり、ネットワーク上で対話したり、OSとやり取りしたりする複雑なフレームワークは、プラットフォームのパラダイムを破ってLCDを撮影することを強制しない方法で行うのがより困難です。すべてのプラットフォームで同様にうまく機能しません。特に、プラットフォームのフレームワークを使用してネットワークコードを作成することをお勧めします。多くの場合、これには「サンドイッチ」アプローチが必要です。最上層はプラットフォーム固有で、最下層はプラットフォーム固有であり、中間は移植可能です。慎重に設計すれば、これは非常に良いことです。

スレッド管理とタイマーも、プラットフォームのフレームワークを使用して実行する必要があります。特に、Javaはスレッドを頻繁に使用しますが、iOSは通常、実行ループに依存してスレッドを回避します。 iOSがスレッドを使用する場合、GCDが強く推奨されます。繰り返しますが、ここでの解決策は、真に移植可能なアルゴリズムを分離し、プラットフォーム固有のコードにその呼び出し方法を管理させることです。

スレッドが大きく、ネットワーク全体またはUIコードが全体に分散している複雑な既存のフレームワークがある場合、共有するのは難しいかもしれませんが、それでも、書き直すのではなく、リファクタリングする方法を探すことをお勧めします。

Linux、Windows、Androidで共有されるクロスプラットフォームコードを広範囲に使用するiOSおよびMac開発者として、Androidは、共有するプラットフォームの中で最も煩わしいと言えます(以前はWindowsこの違いはありますが、Androidはそれを吹き飛ばしました)。 Androidは、コードを共有することが賢明でない場合がほとんどです。しかし、コードの再利用にはまだ多くの機会があり、それらを追求する必要があります。

69
Rob Napier

私は同様の質問に同じ回答を投稿しましたが、関連性があると思うので...

私はプラットフォームの抽象化に BatteryTech を使用し、プロジェクトの構造は次のようになります。

私のPC上

  • gamename-一般的なコードのみが含まれています

  • gamename-Android-主にBatteryTechのAndroid固有のコードとAndroid config、ビルダーは共通コードのゲーム名プロジェクトを指します。

  • gamename-win32-Windowsにビルドするためだけに、gamenameプロジェクトのコードを使用します

Macの場合

  • gamename-一般的なコードのみが含まれています

  • gamename-ios-iPhone/iPadビルド、共通コードをインポート

  • gamename-osx-OSXネイティブビルド。共通コードをインポートします。

また、SVNを使用してPCとMacの間で共有しています。私の唯一の本当の問題は、Windowsの一般的なコードベースにクラスを追加してから、Macで更新してSVNからそれらをプルするときです。 XCodeには、スクリプトなしでそれらを自動的にプロジェクトに追加する方法がないため、毎回手動でそれらをプルする必要があります。これは面倒ですが、世界の終わりではありません。

これらはすべてBatteryTechに付属しているので、入手したらすぐにわかります。

2
rbgrn

C/C++共有so libの使用に加えて。

ゲームのようなクロスプラットフォームアプリを開発する場合は、nity3Dのようなモノベースのフレームワークを使用することをお勧めします。

そうでなければ、ネイティブUIを必要とし、ビジネスロジックコードをモバイルプラットフォーム間で共有したいビジネスアプリを開発する場合は、クライアントビジネスロジックセンターとしてLua組み込みエンジンを使用することをお勧めします。

クライアントUIは引き続きネイティブで、最高のUIパフォーマンスを取得します。すなわちJava on AndroidおよびObjectC on iOSなど)。ロジックはすべてのプラットフォームで同じLuaスクリプト。したがって、Luaレイヤーはクライアントサービスと似ています(サーバー側サービスと比較してください)。

-アンダーソン・マオ、2013-03-28

2
Anderson Mao

共有コードベースを作成することは、この状況では本当に実用的です。設定して整理することにはいくつかのオーバーヘッドがありますが、主な利点は次のとおりです。1)共通の機能を共有することによりコードの量を減らします。2)共通のコードベースにバグ修正を共有します。私は現在、プロジェクトで検討している2つのルートを認識しています-ネイティブc/c ++を使用する(ガベージコレクションの損失とプロセッサごとのターゲットの設定を犠牲にして速度を上げる)または monodroid/monotouch は、各OSのプラットフォーム機能にc#バインディングを提供します(これがどれほど成熟しているかは不明です)。

3Dを使用してゲームを作成している場合は、間違いなくアプローチ1を使用します。

2
jchristof

私が書くもののほとんどはうまく移植できないので、私はこれらを自分で使用しませんが、基本的なアプリケーションを構築するために Appcelerator または Red Foundry のようなものを使用することをお勧めしますその後、どちらのプラットフォームでもネイティブに作成できます。これらのケースでは、objective-cやJavaを作成しているのではなく、何らかの中間手段を使用しています。彼らがあなたを閉じ込めた箱の外に移動する場合、あなたは自分のコードを金属に近いところに書く必要があることに注意してください。

1
Scott