「単にC / C ++でプログラミングすることを好む」という理由で、AndroidアプリをC / C ++で記述すべきではないのはなぜですか。[閉まっている]


86

更新(明確にし、あいまいさを減らすため):

私はAndroidアプリをいじり始めます。私はNDKを使用してC ++で書くことを計画していましたが(C ++の経験が豊富で、Javaよりも好むため)、AndroidNDKページで次のことに遭遇しました。

NDKは、アプリに不可欠な場合にのみ使用する必要があります。単にC / C ++でプログラミングすることを好むからではありません。

仕事に合っている限り、好きな言語を使うべきだという印象を受けました。Androidの開発にC / C ++を使用しないことが強く推奨される理由を誰かが説明できますか?


元の:

モバイルアプリ、特に現在の電話のOSであるAndroidをいじくり回し始めます。アプリを、C ++(または少なくともコア、次にJavaでラップ)で作成するのが許容できるオプションかどうか疑問に思いました。

ある程度の経歴を持っていますが、私はコンピュータサイエンス専攻で、3つのC ++コース(初級、中級、OOP、春にSTLコースを受講)と1つのJavaコース(中級)を受講しています。このため、私はC ++に慣れており、JavaよりもC ++を好みます。私はAndroidNDKページで次のことに出くわしました:

Androidでネイティブコードを使用しても、通常、パフォーマンスが目立って向上することはありませんが、アプリの複雑さが常に増します。一般に、NDKは、アプリに不可欠な場合にのみ使用する必要があります。単にC / C ++でプログラミングすることを好むからではありません。

  • 慣れ親しんだ言葉だけでなく、仕事に合った言葉を使うべきだという印象を受けました。
  • アプリケーションを、JavaではなくC ++をサポートするiOSなどの別のモバイルプラットフォームに移植したい場合があります。
  • Javaは高級言語であるため開発が速くなるはずですが、ほとんどすべてを再学習する必要があるため、開発が遅くなるように感じます(この言語のクラスは1つしか受講していないため)

どんなアドバイスでも大歓迎です。

ps:このテーマに関する回答の多くは数年前のものであり、Android2.3以降で完全なネイティブアプリの開発を可能にするNDKについて言及しているフォローアップ回答はほとんどありません。


1
「許容できる」というのは奇妙な言葉です
ildjarn 2012

1
弾丸を噛んでJavaを学ぶほうがよいでしょう。Androidツールキットは実際にはJavaから使用することを目的としており、C ++をすでに知っていることから節約できる時間は費やされ、次にすべてのAndroidのものをC ++から機能させる方法を理解しようとする人もいます。これを学習の機会と考えてください:)
Jeremy Friesner 2012

個人的には、ジェレミーが言ったように弾丸を噛んで、Javaで何をしなければならないかを簡単に学びます。あなたがそれを比較的速く学ぶことは実際にはそれほど大したことはないはずです。
OmniOwl 2012

最初のポイントとして、C ++は、慣れているかどうかに関係なく、Javaほどの仕事(Android向けの開発)には適していません。2つ目のポイントとして、AndroidはLinuxですが、Androidアプリとデスクトップアプリには大きな違いがあります。ライフサイクルは異なり、プロセスではなくアクティビティを処理する必要があります。これは、通常のデスクトップ開発とはまったく異なる開発方法です。3つ目のポイントとして、C ++でAndroidSDKを学習すると、最初にJavaで学習してから(Javaを学習した後)、C ++に切り替えるよりも大幅に時間がかかります。
Cornstalks 2012

1
「C / C ++」という用語を、あたかもその名前の単一の言語があるかのように使用する人が多すぎます。CとC ++は2つの異なる(密接に関連しているが)言語であることをご存知だと思います。あなたが質問しているのは、CではなくC ++のようです。
キーストンプソン

回答:


107

このように考えてください。Java SDKを使用して、開発者が利用できるAPIを100%利用する完全に機能するアプリケーションを構築することができます。(APIの観点から)SDKでは実行できないNDKで実行できることは何もありません。NDKは、より高いパフォーマンスを提供するだけです。

今それを逆に見てください。NDKで100%アプリケーションを作成することを選択した場合でも、完全に機能するアプリケーションを作成できますが、アクセスできるフレームワークAPIの数には制限があります。すべてのAndroidフレームワークにネイティブレイヤーでアクセスできるわけではありません。ほとんどのAPIはJavaのみです。それは、すべてのAPIと言うことはありませんあなたが必要があるかもしれませんが、NDKでは利用できませんが、どこにも近くALL APIが公開されています。

これに加えて、NDKは、ディストリビューションのサイズを拡張するプラットフォーム固有のコードを導入します。サポートするすべてのデバイスアーキテクチャについて、ネイティブコードを.soファイル(armv5、armv7、x86用に1つ)にすべて同じAPKにパッケージ化する必要があります。この実行可能コードの複製により、アプリケーションを配布するときにアーキテクチャごとに個別のAPKを構築するタスクを引き受けない限り、アプリのサイズは3倍になります(つまり、「ファットバイナリ」)。そのため、APKのサイズを大幅に拡大したくない場合は、デプロイプロセスが少し手間がかかります。

繰り返しになりますが、これはあなたが選択したことを行うことを妨げるものではありませんが、GoogleがJavaをコードの大部分と最も抵抗の少ないパスの「好ましい」方法として説明している理由を指摘しています。ドキュメントがそのように表現されている理由が明らかになることを願っています。


1
どうもありがとうございました!視点の変化は私が見逃していた大きな部分でした。NDKにAPIがないことに気づいていませんでした。ディストリビューションのサイズについても考えていませんでした。しかし、それを思いついたので、それは非常に理にかなっています(特に、c ++にはすべての標準ライブラリが含まれている必要がありますが、Javaの標準ライブラリはすでにデバイス上にあります)。.soファイルについて少し説明していただけますか?サポートされているハードウェアアーキテクチャごとにネイティブコードの個別のコンパイルが必要であることを認識しているので、各.soファイルには個別のコンパイルがありますか?
Logan Besecker 2012

42
NDKの制限は実際には残念です。主にバッテリー寿命を考慮して、モバイルプラットフォーム用の高性能コードを作成したいと思います。モバイルプラットフォームでのネイティブの問題。なぜそれをより良くサポートしませんか?#ᴅɪꜱʟɪᴋᴇ–
Konrad Rudolph

2
@LoganBesecker NDKツールチェーンは.so、サポートするように選択したアーキテクチャごとにコードをクロスコンパイルし(これは、makefileによって制御されます)、すべてのファイルはAPKのlibs /ディレクトリに配置されます。APKがインストールさ.soれると、適切なものだけが選択されますが、それらはすべて最初のAPKに存在する必要があります。
devunwired 2012

1
@KonradRudolphは、ndkを使用してアプリの一部を作成できます。これは、Androidのパフォーマンスが重要な部分に対してGoogleが行います。非常に特殊な場合を除いて、c ++とjavaは、Android開発には関係ありません。特に、ARTが登場している今はなおさらです。API、特にバッテリー(GPS、ネットワーク)を消費するAPIの正しい使用は、注意が必要な場所です。
Teovald 2014

1
Javaは遅いです。JVMをロードする必要があり、さらにバイトコードは非常に効率的ですが、「ネイティブ」ではないため、わずかなペナルティがあります。アプリケーションによっては、これが目立つ場合があります。特にインタープリターで実行されるため、Javaを選択した理由については、ガベージコレクターによってメモリの問題が軽減され、アプリ間の影響が軽減されます。さらに、Java言語は(冗長ですが)開発者が導入したC ++のエラーの多くを削除します。
ダニエル

25

人生で1つのアプリしか開発しない場合は、NDKを使用してください。

生涯に複数のアプリケーションを開発することを目的としてAndroid開発の学習を目指しており、それらすべてを適切にサポートできるようにしたい場合は、Javaを学習し、長期的にはより良い結果が得られる可能性が非常に高くなります。代わりにAndroidのJavaSDKを使用してください。


このロジックは、多くの実用的な意味があります。
vvnraman 2012

8

Kingのプログラマーは、ゲームロジックにC ++を使用しています。そして、彼らは彼らの売上高から判断してうまくやっているようです。

私の経験では、C ++は問題解決者向けであり、Javaは問題回避者向けです。私はどちらの言語も大好きですが、優れたコードを書くとC ++は非常にやりがいがあります。ただし、そこにたどり着くまでには、ほんの少しの魔法がかかるかもしれません。

データサイエンティストにもC ++をお勧めします。データサイエンティストは、通常、PythonやRなどで仕事をこなします。C++でも同じことができますが、パフォーマンスは良くても悪くても、言語の天才である必要があります。だから私はC ++をやりたい人に決して勧めないのです-私は彼らが求めている御馳走に頭を上げるだけです。


1
C ++に固有の問題の解決に費やす時間は、アプリの実際の機能の構築に費やすことができた時間です。
user456 2319年

4

この興味深い記事は次のサイトから見つかりました:http//betanews.com/2014/07/22/why-c-is-the-perfect-choice-for-modern-app-development/

C ++は、プラットフォームに依存しないように特別に構築されているため、存在するすべてのオペレーティングシステムに搭載されています。典型的なモバイルユーザーは、AndroidアプリがObjective-CでJavaおよびiOSアプリで記述されていることを知っているかもしれませんが、多くの人が知らないのは、デバイスのメモリに他の何よりも多くのC / C ++コードがあることです。C / C ++は、小さなデバイス(ハードウェアと相互作用するカーネル、および一般的なランタイムライブラリなど)とこれらのデバイスを可能にする通信ネットワークのテクノロジの多くを駆動します。開発チームにとってより重要なことは、任意のデバイスとプラットフォームで実行する必要があるすべてのことのためのC / C ++インターフェイスとライブラリがあることです。Android NDKツールセットは、JavaとAndroid JavaランタイムDalvik(仮想マシンであるDalvik)を回避することで、デバイスから可能な限り最高のパフォーマンスを引き出すことができるように、ゲーム開発チーム向けに最初に追加された完全なC / C ++サポートの優れた例です。 AndroidJavaコードはで実行されます。すべてのAndroidサービスを有効にするために定期的に改善されています。


3

メインアプリにはJavaを使用すると思います。ただし、移植する必要のあるc ++コード、またはc ++で効率的に実装される必要なライブラリがある場合は、それらのビットにndkを使用します。


4
では、なぜ彼はJavaを使用する必要があるのでしょうか。
Vladislav Rastrusny 2013年

3

通常のAndroid開発にC ++を使用しない理由はわかりません。C++での作業経験が豊富で、Windowsなどの複雑なOSを使用している場合は、Androidをすばやく把握でき、それほど複雑ではありません。他のOSはそうです。Javaを学習している間、または学習せずに作業している間は、より苛立たしく複雑になります。


3

最も重要な考慮事項は、コンパイルされたJavaコードがすべてのAndroidデバイスで変更されずに実行されるのに対し、ネイティブコードはすべてのターゲットプラットフォーム用にコンパイルされる必要があるということです。

JavaとAndroidの両方の一般的な目的は、すべてではないにしても大部分のアプリをJavaで記述し、他にオプションがない場合にのみネイティブなものを使用することです。したがって、アプリの記述に関するすべてがJavaで行うのに役立ちます。

Javaで書くことにより、ネイティブとJavaの世界を橋渡しする際の多くの悪化を免れることができます。

同様に、思い切ってJavaを学べば、自分自身に大きな恩恵をもたらすでしょう。あなたのAndroidアプリはそれにとってより良いだけでなく、あなたはOOへの著しく異なるアプローチにあなた自身をさらし、あなたはそれのためのより良いプログラマーになるでしょう。

それに加えて、Javaで書くことにより、セキュリティリスクのすべてを回避するという事実があります。

私の考えでは、これは簡単です。Javaを使用してください。


2
「...そして他に選択肢がない場合にのみネイティブのものを使用する」。他に選択肢がないのはいつですか?Androidのすべては、Javaを介して実現できます。
CinCout 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.