12

カメラフレームのバイト配列を受け入れるアプリケーションへのインターフェイスを公開する Android サービスを作成しました。このサービスは、ネイティブ ライブラリを使用してこのカメラ フレームを処理し、カメラ フレームに関するデータを返します。目標は、カメラのプレビュー フレームをリアルタイムで処理できるようにすることです。

問題- 私の AIDL ファイルには initFrame (in byte[] frame) という API があります。(別のプロセスで実行されている) アプリケーションからこの API を呼び出すたびに、TransactionTooLargeExceptionという例外が発生します。

これは、バイト配列のサイズが 1MB を超えており、バインダー トランザクション バッファーの固定サイズが 1MB に制限されているためです。サイズ制限が大きかったとしても、リアルタイム処理のために大きなバッファーをコピーするのは非常に非効率的です。

質問- 問題の解決に役立つ 2 つの dalvik プロセス間でメモリを共有する Android の方法はありますか? 私はMemoryFileを見ましたが、この時点で MemoryFile は非表示の API を使用してプロセス間でメモリを共有するためにのみ使用できるようです。

4

3 に答える 3

3

Android システムを変更できる場合は、トランザクション サイズを大きくすることができます。Binder トランザクション バッファの固定サイズは制限されており、現在は 1Mb です。

ProcessState.cpp にパラメーターがあります

#define BINDER_VM_SIZE ((1*1024*1024) - (4096 *2))

この値を増やしてみてください。

これができない場合は、データを複数のトランザクションに分割してみてください。

さらに、ネイティブ コードを使用して ashmem を使用するなど、他の IPC メカニズムを使用することもできますsystem/core/include/cutils/ashmem.h。難しくない。私の知る限り、一部のベンダーは、ashmem を使用して、バインダー ドライバーのサポートなしで一部のカーネルにバインダー トランザクションを実装しています。ソケットも使えます。

于 2013-02-28T01:05:00.350 に答える
3

共有メモリ アロケーターであるashmemサブシステムを見てみましょう。これは POSIX SHM に似ていますが、動作が異なり、より単純なファイル ベースの API を備えています。

おそらくそれはあなたが探しているものです:

int ashmem_create_region(const char *name, size_t size);
int ashmem_set_prot_region(int fd, int prot);
int ashmem_pin_region(int fd, size_t offset, size_t len);
int ashmem_unpin_region(int fd, size_t offset, size_t len);
int ashmem_get_size_region(int fd);

これは で定義されていsystem/core/include/cutils/ashmem.hます。

于 2013-02-27T22:57:43.647 に答える
3

このタイプのトランザクションには、2 つのプロセス間でソケット接続を使用します。両方の側で、多くのリソースを拘束することなく、必要に応じてデータとバッファをストリーミングできます。サービスがソケットをリッスンし、クライアントがソケットに接続してデータを送信するのは比較的簡単なはずです。

于 2013-02-27T22:30:27.650 に答える