1

iOS に組み込みたい C# の DSP オーディオ アグロがあります。友人は、プラットフォームに依存しないため、Objective-C の代わりに C++ に変換することを提案しました。これは良い習慣ですか、注意すべき落とし穴はありますか? 私の本能は、Obj-C でネイティブに保つことです。iOS 内で C++ 関数にアクセスするにはどうすればよいですか?

ありがとうございました

4

1 に答える 1

3

C++ と Objective-C を自由に組み合わせることができます。これは「Objective-C++」として知られています。それがあなたの意図であることをコンパイラに知らせるには、.mファイルの名前を.mm.

このようにコードを混在させることは、必ずしも良い考えではなく、移植性を目的としている場合はまったく無意味です。C++ を別の.cppファイルに保持し、必要最小限のラッパー クラス (obj-c++) を作成して、Objective-C オブジェクトと C++ オブジェクトの間でデータを渡すことをお勧めします (事実上、ラッパーは obj-C メソッドと C++ 関数を仲介して送信し、データを返します)。

私は最近、この単純な画像処理の例をいくつか github に投稿しました - openCVSquaresopenCVStitch。C++ コードが obj-C からどのように分離されているかを確認するだけでも、一見の価値があります。

openCV ライブラリには C++ インターフェイスがあるため、プロジェクトで C++ を使用することは避けられません。すべてのコードを .mm ファイルにマッシュアップすること可能ですが、それは混乱を招く簡単な方法です。

移植性に関しては、UI コードをデータ操作コードから分離することでこれを実現できます。MVC ではとにかくこれを行う必要があるため、これらの例のように C++ でモデルを作成するのに追加の作業はほとんどありません。モデルは移植可能であり、UIはプラットフォーム固有であり、そうあるべきです。

これを行うべきかどうか、各言語の流暢さ、フレームワークとライブラリの選択、移植の可能性など、他の要因によって異なります。ただし、オーディオ処理は、このようなアプローチの自然な候補です。

サンプルの詳細
コードを実行できなくても心配する必要はありません (openCV フレームワークは面倒な場合があります...)。例を非常にシンプルに保つように努めました。

C++ コードは、openCV ディストリビューションに含まれる C++ サンプルから移植されました: squares.cppおよびStitching.cpp。この移植性の考え方を評価するために、これらをできるだけ変更しないようにしました。

大まかに言うと、2 つの問題に対処する必要がありました...
1/ UI コードを削除しました (つまり、データを obj-C 側に送り返すだけです)。
2/ main() 関数を変更して、obj-C 側から呼び出し可能な関数にします。.cpp ヘッダー ファイルでは、これを容易にするために、単一の静的関数を持つ単純なクラスを宣言します。明らかに、もっと精巧にする余地がありますが、アイデアを得るにはこれで十分です。

于 2013-01-12T17:18:22.490 に答える