2011-12-15 6 views
5

私はC/C++で書かれたネイティブコード(NDK経由でアクセス)を含むAndroidプロジェクト(Android 1.6以降をターゲットにしています)を持っています。最も効率的な方法は、JavaからNDKを介してJNIグルー層にバイト配列を渡すことです。私の懸念事項は、Android用のNDKがバイト配列をコピーするか、私に直接参照を与えるかどうかということです。私はC++レベルでバイトへの読み取り専用アクセスが必要なので、シーンの背後にあるコピーは私の視点からは時間の無駄でしょう。Android:ネイティブC++に読み込み専用バイトを渡す最も効率的な方法

ウェブ上でこれについての情報を見つけるのは簡単ですが、どのような情報が最も適切かはわかりません。例:

Get the pointer of a Java ByteBuffer though JNI

http://www.milk.com/kodebase/dalvik-docs-mirror/docs/jni-tips.html

http://elliotth.blogspot.com/2007/03/optimizing-jni-array-access.html

だから、誰もが、現在のNDKでこれを行うための最善の(最も効率的な、少なくともコピー)方法が何であるかを知っているのですか? GetByteArrayRegion? GetByteArrayElements?他に何か?

答えて

5

文書によると、GetDirectBufferAddressは配列をコピーせずに参照を提供します。

ただし、この関数を呼び出すには、単純なバイト配列の代わりにByteBuffer.allocateDirect()を使用してdirect bufferを割り当てる必要があります。それはexplained hereとしての対応があります。

直接バイトバッファは、このクラスのallocateDirect ファクトリメソッドを呼び出すことで作成することができます。このメソッドによって返されるバッファーは、通常、非ダイレクトバッファーよりも幾分高い割り当ておよび割り当て解除コストを持っています( )。ダイレクトバッファの内容は、通常のガーベッジコレクションされたヒープの 以外にある可能性があります。そのため、アプリケーションのメモリフットプリントへの影響は明白ではないかもしれません。 したがって、ダイレクトバッファは、基本システムの ネイティブI/O操作の対象となる、大規模で長寿命のバッファ を主に割り当てられるようにすることをお勧めします。一般に、直接 バッファを割り当てるのは、プログラム のパフォーマンスで測定可能なゲインが得られるときだけです。

+0

逆を実行するための同様の効率的なAPIはありますか? - 'unsigned char *'をネイティブレイヤーから 'byte []'または 'byteBuffer'としてJavaレイヤーに渡しますか? –

+0

ダイレクトByteBufferとバイト[]はどちらもネイティブ側からの読み書きに使用できます。 env-> GetDirectBufferAddress(buffer)またはenv-> Get ArrayElements(array、...)を呼び出すと、Cのmemcopy関数を使用して読み取り/コピーできます。しかし、直接ByteBufferははるかに高速で、コピーを再生しない、より安全な、等 –

関連する問題