iOS に組み込みたい C# の DSP オーディオ アグロがあります。友人は、プラットフォームに依存しないため、Objective-C の代わりに C++ に変換することを提案しました。これは良い習慣ですか、注意すべき落とし穴はありますか? 私の本能は、Obj-C でネイティブに保つことです。iOS 内で C++ 関数にアクセスするにはどうすればよいですか?
ありがとうございました
iOS に組み込みたい C# の DSP オーディオ アグロがあります。友人は、プラットフォームに依存しないため、Objective-C の代わりに C++ に変換することを提案しました。これは良い習慣ですか、注意すべき落とし穴はありますか? 私の本能は、Obj-C でネイティブに保つことです。iOS 内で C++ 関数にアクセスするにはどうすればよいですか?
ありがとうございました
C++ と Objective-C を自由に組み合わせることができます。これは「Objective-C++」として知られています。それがあなたの意図であることをコンパイラに知らせるには、.m
ファイルの名前を.mm
.
このようにコードを混在させることは、必ずしも良い考えではなく、移植性を目的としている場合はまったく無意味です。C++ を別の.cpp
ファイルに保持し、必要最小限のラッパー クラス (obj-c++) を作成して、Objective-C オブジェクトと C++ オブジェクトの間でデータを渡すことをお勧めします (事実上、ラッパーは obj-C メソッドと C++ 関数を仲介して送信し、データを返します)。
私は最近、この単純な画像処理の例をいくつか github に投稿しました - openCVSquaresとopenCVStitch。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 ヘッダー ファイルでは、これを容易にするために、単一の静的関数を持つ単純なクラスを宣言します。明らかに、もっと精巧にする余地がありますが、アイデアを得るにはこれで十分です。