2017-03-31 98 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