2017-03-31 54 views
1

我正在嘗試使用JNA從Java調用ALSA庫函數。我已經成功地調用了基本的開放/關閉API snd_pcm_open()和snd_pcm_close(),所以我知道我已經加載了庫和基礎知識。如何從JNA調用ALSA分配#define?

我的應用程序需要用ALSA做的第一件事是調用snd_pcm_hw_params_alloca()來分配一個硬件參數結構。但是,這是在C header file定義爲宏,而不是一個符號:

#define snd_pcm_hw_params_alloca(ptr) __snd_alloca(ptr, snd_pcm_hw_params) 

對於C應用程序也將被稱爲像這樣:

snd_pcm_hw_params_t *params; 
snd_pcm_hw_params_alloca(&params); 

和「PARAMS」隨後被傳遞給了後來的很多API調用。

我不是一個C專家,我無法弄清楚這是做什麼。我期望的結構的內存分配,但在頭文件中的下一行定義像snd_pcm_hw_params:

int snd_pcm_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params); 

這是否意味着宏觀返回一個指針的函數?我如何在JPA中對此進行建模?

+0

硬件參數的分配通常使用'snd_pcm_hw_params_malloc'完成。你正在討論的函數會在堆棧中分配內存而不是堆。我不是Java專家,但我不認爲堆棧分配對於Java應用程序是有效的 – tay10r

回答

2

該函數返回一個指向你不知道定義的結構的指針。 (這就是爲什麼你需要所有這些存取函數的原因。)

alloca()從堆棧中分配內存,這意味着它在當前函數返回後立即釋放。這意味着你不能把它封裝到一個從Java調用的函數中。

而不是snd_pcm_hw_params_alloca(),請使用snd_pcm_hw_params_malloc(),並且不要忘記在正確的時間撥打snd_pcm_hw_params_free()

+0

是的,我缺乏C +專業知識,盲目地遵循ALSA示例C程序,導致我錯誤地使用API​​路徑。寫了'snd_pcm_hw_params_malloc()'的JNA定義,並且它一切正常。同樣感謝@ tay10r的回答。 – user3191192