2012-02-23 22 views
2

現在,我有一個C++應用程序,它有一個包含PCM音頻數據的unsigned char*緩衝區。我需要使用此數據在JNI(從C++到Java)上調用AudioTrack實例上的Android API方法AudioTrack.write(),並且我希望避免在此過程中製作額外的副本。我可以這樣做嗎?直接在Java API中使用C++數組,需要byte []

AudioTrack接受Java byte[]作爲其參數之一,該參數應該對應於我的PCM數據(unsigned char*)。

對不起,如果這是重複的...很難有效地搜索這種東西。

+0

你可以使用JNI的'GetPrimitiveArrayCritical()'和'ReleasePrimitiveArrayCritical()'玩,但我不會推薦它。一個更好的主意:讓Android團隊支持NIO緩衝區,而不是陣列(或除此之外)...... – 2012-02-23 08:57:22

+0

更好的是在更高版本的Android中對音頻進行本機支持。令人沮喪的是,一旦我把它踢到Java,它會再次將它踢回本地代碼。 – notlesh 2012-02-23 17:13:29

+0

嘆息......有時我希望Google包含一個體面的JIT編譯器,所以我們都可以簡單地開始使用OpenCL,OpenGL,Op​​enSL等Java,而不是像這樣的原生API玩弄...... :(但是再一次,我猜猜這是谷歌的商業模式,放棄破碎的軟件並統治世界,我們在哪裏看到這種情況發生在嘿之前? – 2012-02-25 09:54:37

回答

1

這樣的事情應該做。
我還沒有編譯這個,並且檢查語法也是明智的。

jbyteArray byteArray; byteArray = env-> NewByteArray(audioDataLength);設置字節數組區域(byteArray,0,audioDataLength,(jbyte *)audioData);

哪裏audioDataLength是焦炭的長度* audioData

+0

不幸的是,在做一個副本。 [來自'SetByteArrayRegion'文檔]:從緩衝區中複製基本數組區域的一系列函數。 – notlesh 2012-02-23 08:28:08

+0

可以通過API'GetByteArrayElements'從JNI訪問Java byte []。但這意味着你將不得不在Java中分配數組,並嘗試從JNI訪問。您應該能夠在jni中將它用作char *,但我懷疑需要某種形式的副本。順便說一下,是否不需要爲保存內容或性能製作額外的副本? – jogabonito 2012-02-23 08:41:30

+0

它是兩個。我正在寫一款遊戲,而且我已經在兩方面都達到了極限。 – notlesh 2012-02-23 17:14:06