1

ashmemネイティブコードからマッピングおよびアクセスされる共有メモリブロック(リージョン)が必要です。また、このブロックをいくつかのアプリケーションで使用したいと思います。SDKレベル7(Android 2.1)でも動作させたい

2つのルートがあります。ネイティブコードでashmemリージョンを作成できます。しかし、問題は、整数ファイル記述子を別のプロセスに渡すにはどうすればよいかということです。FileDescriptorを介してオブジェクトをマーシャリングすることはできますがParcel、生のFDの周りにオブジェクトを構築する方法はありません。整数FDの構築と取得をサポートするものもParcelFileDescriptorありますが、関連するメソッドはSDKレベル12以降でのみサポートされます。

または、を作成することもできますMemoryFileパーセルでそれを渡すための醜い方法があります。しかし、ネイティブコードに何かを持たせるために、ファイル記述子を取得するにはどうすればよいmmap()ですか?

4

3 に答える 3

3

Android の 1.5 から 4.1 までのすべてのバージョンでFileDescriptorは、intと呼ばれるデータ メンバーがありますdescriptor。以前のバージョンの Android ではパッケージ プライベートであり、最近のバージョンではプライベートです。少し意図的なアクセス制御の破壊により、リフレクションまたは JNI を介してアクセスできます。デフォルトでは、それぞれがアクセス制御をバイパスできます - リフレクションの場合は 経由Field.setAccessible()、JNI の場合は - デフォルトで。

それを念頭に置いて、ネイティブ FD の周りに a をうまく構築できます。FileDescriptor空のものを作成し、設定しdescriptorます。それが、Android コードの断片がそれらを構築するときに行うことです。

この汚いハックが最終的に壊れるかどうかは誰にもわかりません。幸いなことに、私の場合、これは機能のコア部分ではありません。いくつかの適切な劣化があります。

ParcelFileDescriptorプラットフォームが許可する場合、フィールド アクセス ハックをフォールバックとして使用して、サポートされているメソッドを条件付きで採用することができます。このように、それは比較的将来の証明になります。

于 2012-10-12T21:43:15.313 に答える
3

この jniCreateFileDescriptor() https://android.googlesource.com/platform/libnativehelper/+/jb-dev/include/nativehelper/JNIHelp.hのヘルパー ライブラリ libnativehelper.so にメソッドがあります。基本的には前の回答で述べたのと同じことを行いますが、このアプローチの方が少しすっきりしているかもしれません。

于 2013-06-24T15:32:02.587 に答える
0

これは、同様の問題に取り組んでいるときに私にとってどのように機能したかです。

ファイル記述子の作成と取得に shmfd = open(SHM_PATH, O_RDWR) を使用する代わりに、次のように置き換えました

int fd = ashmem_create_region("SharedRegionName", size); 

ファイル記述子を使用してベースアドレスを取得しました。

int base_address = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

// データを書き込む 記述子を返すネイティブ関数を使用して、ネイティブ コードから Java コードに base_address を渡すことができます。

次に、aidl インターフェイスを使用してサービスを作成し、このインターフェイスを使用して、このサービスを別のプロセスからバインドしました。サービスから、ParcelFileDescriptor オブジェクトを使用して別のプロセスに戻りました。次の方法で ParcelFileDescriptor を作成できます。

ParcelFileDescriptor desc = ParcelFileDescriptor.fromFd(fd);
于 2013-09-23T18:43:19.873 に答える