現在,我有一個C++應用程序,它有一個包含PCM音頻數據的unsigned char*
緩衝區。我需要使用此數據在JNI(從C++到Java)上調用AudioTrack
實例上的Android API方法AudioTrack.write()
,並且我希望避免在此過程中製作額外的副本。我可以這樣做嗎?直接在Java API中使用C++數組,需要byte []
AudioTrack接受Java byte[]
作爲其參數之一,該參數應該對應於我的PCM數據(unsigned char*
)。
對不起,如果這是重複的...很難有效地搜索這種東西。
你可以使用JNI的'GetPrimitiveArrayCritical()'和'ReleasePrimitiveArrayCritical()'玩,但我不會推薦它。一個更好的主意:讓Android團隊支持NIO緩衝區,而不是陣列(或除此之外)...... – 2012-02-23 08:57:22
更好的是在更高版本的Android中對音頻進行本機支持。令人沮喪的是,一旦我把它踢到Java,它會再次將它踢回本地代碼。 – notlesh 2012-02-23 17:13:29
嘆息......有時我希望Google包含一個體面的JIT編譯器,所以我們都可以簡單地開始使用OpenCL,OpenGL,OpenSL等Java,而不是像這樣的原生API玩弄...... :(但是再一次,我猜猜這是谷歌的商業模式,放棄破碎的軟件並統治世界,我們在哪裏看到這種情況發生在嘿之前? – 2012-02-25 09:54:37