2012-02-23 11 views
2

これは、PCMオーディオデータを含むunsigned char*バッファを持つC++アプリケーションです。このデータを使用してAndroid APIメソッドAudioTrack.write()をのJNI(C++からJavaへ)のインスタンスで呼び出す必要があります。そのために余分なコピーを作成しないでください。これはできますか?バイトを必要とするJava APIでC++配列を直接使用する

AudioTrackは、自分のPCMデータ(unsigned char*)に対応する引数であるJava byte[]を引数の1つとして受け入れます。

申し訳ありませんが重複している場合は、この種のものを効果的に検索するのは難しいです。

+0

)'が、私はそれをお勧めしません。より良いアイデア:配列の代わりに(または配列に加えて)NIOバッファをサポートするようにAndroidチームに依頼してください。 –

+0

Androidの新しいバージョンでのオーディオのネイティブサポートがさらに優れています。残念なことに、これをJavaにキックすると、再びネイティブコードに戻ります。 – notlesh

+0

Sigh ...時々私はGoogleにまともなJITコンパイラを含めてほしいと思っていました。そのようなネイティブAPIを使いこなすのではなく、OpenCL、OpenGL、OpenSLなどでJavaを使い始めることができました。これはGoogleのビジネスモデルだと思っています。壊れたソフトウェアを放棄し、世界を支配するのですが、どこまで見たのですか? –

答えて

1

これは何かする必要があります。
私はこれをコンパイルしていないので、仕様とも構文をチェックすることが賢明でしょう。

jbyteArray byteArray; byteArray = env-> NewByteArray(audioDataLength); 012B env-> SetByteArrayRegion(byteArray、0、audioDataLength、(jbyte *)audioData);あなたがJNIの `GetPrimitiveArrayCritical()`と `ReleasePrimitiveArrayCritical(と遊ぶことができaudioDataLengthがcharの長さである

*オーディオデータ

+0

残念ながら、thでコピーを作る。 [SetByteArrayRegion'文書から]:バッファからプリミティブ配列の領域をコピーバックする関数群。 – notlesh

+0

Javaバイト[]には、API 'GetByteArrayElements'を介してJNIからアクセスできます。しかし、それはあなたがJavaで配列を割り当て、JNIから試してアクセスする必要があることを意味します。あなたはjniのchar *として使うことができるはずですが、何らかの形のコピーが必要と思われます。 BTWは、メモリの節約やパフォーマンスのために余分なコピーを作成しないという要件ですか? – jogabonito

+0

それは両方です。私はゲームを書いているし、私はすでに両方の領域で限界にぶつかっている。 – notlesh

関連する問題